@scania-nl/tegel-angular-extensions 0.0.7 → 0.0.8
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/README.md +410 -54
- package/esm2022/index.mjs +7 -1
- package/esm2022/lib/env/angular/provide-runtime-config.mjs +7 -5
- package/esm2022/lib/modal/components/modal/modal.component.mjs +121 -0
- package/esm2022/lib/modal/components/modal-host/modal-host.component.mjs +32 -0
- package/esm2022/lib/modal/directives/dynamic-component.directive.mjs +135 -0
- package/esm2022/lib/modal/modal.service.mjs +156 -0
- package/esm2022/lib/modal/provide-modal.mjs +25 -0
- package/esm2022/lib/modal/schema/modal-ref.mjs +2 -0
- package/esm2022/lib/modal/schema/modal.config.mjs +15 -0
- package/esm2022/lib/modal/schema/modal.model.mjs +2 -0
- package/esm2022/lib/modal/schema/modal.types.mjs +3 -0
- package/esm2022/lib/toast/provide-toast.mjs +7 -1
- package/esm2022/lib/utils/angular-component-io.mjs +2 -0
- package/index.d.ts +246 -4
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { inject, Injectable, InjectionToken, makeEnvironmentProviders, provideAppInitializer, } from '@angular/core';
|
|
2
|
-
import { catchError, defer, firstValueFrom, from, map, of, switchMap, tap, } from 'rxjs';
|
|
2
|
+
import { catchError, defer, firstValueFrom, from, map, of, switchMap, tap, throwError, } from 'rxjs';
|
|
3
|
+
import { fromFetch } from 'rxjs/fetch';
|
|
3
4
|
import { parseEnvFile } from '../core/parse-env-file';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
/**
|
|
@@ -62,13 +63,14 @@ export function provideRuntimeConfig(kit, staticEnv, { envPath = '/env/runtime.e
|
|
|
62
63
|
* Returns an `Observable<ConfigShape>` and caches the final result.
|
|
63
64
|
*/
|
|
64
65
|
load() {
|
|
65
|
-
return defer(() =>
|
|
66
|
+
return defer(() => fromFetch(envPath).pipe(switchMap((res) => {
|
|
66
67
|
// Handle HTTP errors explicitly so they go through catchError
|
|
67
68
|
if (!res.ok) {
|
|
68
|
-
|
|
69
|
+
return throwError(() => new Error(`Failed to load runtime config: ${res.status} ${res.statusText}`));
|
|
69
70
|
}
|
|
71
|
+
// Response.text() returns a Promise, which switchMap can handle
|
|
70
72
|
return res.text();
|
|
71
|
-
})
|
|
73
|
+
}),
|
|
72
74
|
// 1. SPA fallback guard (server returned HTML instead of .env)
|
|
73
75
|
map((raw) => {
|
|
74
76
|
const trimmed = raw.trim();
|
|
@@ -158,4 +160,4 @@ export function provideRuntimeConfig(kit, staticEnv, { envPath = '/env/runtime.e
|
|
|
158
160
|
},
|
|
159
161
|
]);
|
|
160
162
|
}
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1ydW50aW1lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvZW52L2FuZ3VsYXIvcHJvdmlkZS1ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxjQUFjLEVBQ2QsSUFBSSxFQUNKLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBa0MsRUFBRSxDQUFDO0lBQzlELHNCQUFzQixHQUFHLEdBQUc7SUFDNUIsYUFBYTtJQUNiLEVBQUU7Q0FDSCxDQUFDO0FBa0NGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBSWxDLEdBQWlCLEVBQ2pCLFNBQThCLEVBQzlCLEVBQ0UsT0FBTyxHQUFHLGtCQUFrQixFQUM1QixLQUFLLEdBQUcsS0FBSyxFQUNiLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLEtBQUssTUFDNkIsRUFBRTtJQUt0QyxnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0lBRXpFOzs7T0FHRztJQUNILE1BQ00sb0JBQW9CO1FBQ3hCLGtEQUFrRDtRQUMxQyxNQUFNLENBQWE7UUFFM0I7OztXQUdHO1FBQ0gsSUFBSTtZQUNGLE9BQU8s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LE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRTtTQUNyRDtLQUNGLENBQUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlZmVyLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHogZnJvbSAnem9kJztcbmltcG9ydCB7IEVudktpdCwgU2NoZW1hT3V0cHV0LCBTdGF0aWNFbnZGcm9tIH0gZnJvbSAnLi4vY29yZS9lbnYtdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VFbnZGaWxlIH0gZnJvbSAnLi4vY29yZS9wYXJzZS1lbnYtZmlsZSc7XG5cbi8qKlxuICogQnVpbGRzIHN0eWxlZCBjb25zb2xlIGFyZ3VtZW50cyBmb3IgUnVudGltZUNvbmZpZyBsb2dzLlxuICpcbiAqIFRoZSByZXR1cm5lZCB0dXBsZSBjYW4gYmUgc3ByZWFkIGRpcmVjdGx5IGludG8gYGNvbnNvbGUubG9nYCxcbiAqIGFsbG93aW5nIHRoZSBicm93c2VyIHRvIHJlbmRlciBhIGNvbG9yZWQgYFtSdW50aW1lQ29uZmlnXWAgcHJlZml4XG4gKiB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjYWxsZXIgbG9jYXRpb24gaW4gRGV2VG9vbHMuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zb2xlLmxvZyguLi5yY0FyZ3MoJ1J1bnRpbWUgb3ZlcnJpZGVzIGxvYWRlZC4nKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdGV4dCB0byBhcHBlbmQgYWZ0ZXIgdGhlIGNvbG9yZWQgcHJlZml4LlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBhcmd1bWVudHMgKGBbZm9ybWF0LCBzdHlsZSwgcmVzZXRdYCkgZm9yIGBjb25zb2xlLmxvZ2AuXG4gKi9cbmNvbnN0IHJjQXJncyA9IChtc2c6IHN0cmluZyk6IFBhcmFtZXRlcnM8dHlwZW9mIGNvbnNvbGUubG9nPiA9PiBbXG4gICclY1tSdW50aW1lQ29uZmlnXSVjICcgKyBtc2csXG4gICdjb2xvcjojMGNmOycsXG4gICcnLFxuXTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgQW5ndWxhciBydW50aW1lLWNvbmZpZyBwcm92aWRlci5cbiAqXG4gKiBAcHJvcGVydHkgZW52UGF0aFxuICogVGhlIFVSTCAob3IgcGF0aCkgdG8gdGhlIHJ1bnRpbWUgYC5lbnZgIGZpbGUgdGhhdCB3aWxsIGJlIGZldGNoZWQgYXQgYXBwIHN0YXJ0LlxuICogRGVmYXVsdHMgdG8gYFwiL2Vudi9ydW50aW1lLmVudlwiYC5cbiAqXG4gKiBAcHJvcGVydHkgZGVidWdcbiAqIEVuYWJsZXMgdmVyYm9zZSBjb25zb2xlIGxvZ2dpbmcgd2hlbiBgdHJ1ZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKlxuICogQHByb3BlcnR5IHN0b3BPbkVycm9yXG4gKiBJZiBgdHJ1ZWAsIGFueSBmYWlsdXJlIHdoaWxlIGxvYWRpbmcvcGFyc2luZy92YWxpZGF0aW5nIHRoZSBydW50aW1lIGNvbmZpZ1xuICogd2lsbCByZWplY3QgdGhlIGFwcCBpbml0aWFsaXplciBhbmQgKiphYm9ydCBib290KiogKHJlY29tbWVuZGVkIGZvciBwcm9kKS5cbiAqIElmIGBmYWxzZWAsIHRoZSBwcm92aWRlciBmYWxscyBiYWNrIHRvIHRoZSBzdGF0aWMgZW52aXJvbm1lbnQgb25seS5cbiAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqXG4gKiBAcHJvcGVydHkgdG9rZW5cbiAqIE9wdGlvbmFsIGBJbmplY3Rpb25Ub2tlbmAgdXNlZCB0byBleHBvc2UgdGhlIHZhbGlkYXRlZCBjb25maWd1cmF0aW9uXG4gKiB2aWEgQW5ndWxhciBkZXBlbmRlbmN5IGluamVjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHByb3ZpZGVyIHdpbGwgY3JlYXRlIG9uZVxuICogYXV0b21hdGljYWxseSBuYW1lZCBgRU5WX0NPTkZJR2AuXG4gKi9cbmludGVyZmFjZSBQcm92aWRlUnVudGltZUNvbmZpZ09wdGlvbnM8UyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+PiB7XG4gIC8qKiBQYXRoIHRvIHRoZSBydW50aW1lIGVudiBmaWxlIChkZWZhdWx0OiAvZW52L3J1bnRpbWUuZW52KSAqL1xuICBlbnZQYXRoPzogc3RyaW5nO1xuICAvKiogTG9nIGRlYnVnIGluZm8gdG8gY29uc29sZSAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIC8qKiBUaHJvdyBvbiBlcnJvciB0byBzdG9wIGFwcCBib290IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIHZpYSBBbmd1bGFyIERJICovXG4gIHRva2VuPzogSW5qZWN0aW9uVG9rZW48U2NoZW1hT3V0cHV0PFM+Pjtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgcHJvdmlkZXJzIHRoYXQ6XG4gKiAtIEZldGNoIGEgcnVudGltZSBgLmVudmAgZmlsZSBhdCBzdGFydHVwLFxuICogLSBQYXJzZSBpdCB0byBhIGRlZXAtcGFydGlhbCBzdHJ1Y3R1cmUgdmlhIHRoZSBraXQsXG4gKiAtIEVuZm9yY2UgcnVudGltZS1yZXF1aXJlZCBrZXlzIHdoZW4gYXBwcm9wcmlhdGUsXG4gKiAtIE1lcmdlIHdpdGggdGhlIHN0YXRpYyBlbnZpcm9ubWVudCxcbiAqIC0gVmFsaWRhdGUgdGhlICoqZmluYWwqKiBjb25maWd1cmF0aW9uIGFnYWluc3QgdGhlIFpvZCBzY2hlbWEsXG4gKiAtIEV4cG9zZSB0aGUgcmVzdWx0aW5nIGNvbmZpZyB2aWEgYSBnZW5lcmF0ZWQgYEluamVjdGlvblRva2VuYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFMgLSBab2Qgc2NoZW1hIHR5cGUgZGVzY3JpYmluZyB0aGUgZnVsbCBjb25maWcgc2hhcGUuXG4gKiBAdHlwZVBhcmFtIEsgLSBMaXN0IG9mIHJ1bnRpbWUtcmVxdWlyZWQgdG9wLWxldmVsIGtleXMuXG4gKlxuICogQHBhcmFtIGtpdFxuICogVGhlIGBFbnZLaXRgIGNyZWF0ZWQgYnkgYGNyZWF0ZUVudktpdChzY2hlbWEsIHJ1bnRpbWVSZXF1aXJlZEtleXMpYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogUnVudGltZSBsb2FkaW5nIGJlaGF2aW9yIGFuZCBESSB0b2tlbiBkZXNjcmlwdGlvbi4gU2VlIHtAbGluayBQcm92aWRlUnVudGltZUNvbmZpZ09wdGlvbnN9LlxuICpcbiAqIEByZXR1cm5zIFRoZSBgRW52aXJvbm1lbnRQcm92aWRlcnNgIHRvIGJlIGFkZGVkIHRvIGBhcHBDb25maWcucHJvdmlkZXJzYCxcbiAqXG4gKiBAcmVtYXJrc1xuICogLSBUaGlzIHVzZXMgYW4gQW5ndWxhciAqKmZ1bmN0aW9uYWwgYXBwIGluaXRpYWxpemVyKiogdG8gcGVyZm9ybSB0aGUgbG9hZCBzdGVwLlxuICogLSBJZiB0aGUgc2VydmVyIHJldHVybnMgYW4gSFRNTCBTUEEgZmFsbGJhY2sgKGluc3RlYWQgb2YgdGhlIGAuZW52YCBmaWxlKSwgdGhlIHByb3ZpZGVyXG4gKiAgIHF1aWV0bHkgdXNlcyB0aGUgc3RhdGljIGVudmlyb25tZW50IChubyBydW50aW1lIG92ZXJyaWRlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlUnVudGltZUNvbmZpZzxcbiAgUyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+LFxuICBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIHoub3V0cHV0PFM+KVtdXG4+KFxuICBraXQ6IEVudktpdDxTLCBLPixcbiAgc3RhdGljRW52OiBTdGF0aWNFbnZGcm9tPFMsIEs+LFxuICB7XG4gICAgZW52UGF0aCA9ICcvZW52L3J1bnRpbWUuZW52JyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHN0b3BPbkVycm9yID0gdHJ1ZSxcbiAgICB0b2tlbixcbiAgfTogUHJvdmlkZVJ1bnRpbWVDb25maWdPcHRpb25zPFM+ID0ge31cbik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgLy8gVGhlIHZhbGlkYXRlZCBjb25maWcgdHlwZSBkZXJpdmVkIGZyb20gdGhlIHNjaGVtYS5cbiAgdHlwZSBFbnZDb25maWcgPSBTY2hlbWFPdXRwdXQ8Uz47XG5cbiAgLy8gVHlwZWQgdG9rZW4gdXNlZCB0byBleHBvc2UgdGhlIGZpbmFsIHZhbGlkYXRlZCBjb25maWcgdmlhIERJLlxuICBjb25zdCBjb25maWdUb2tlbiA9IHRva2VuID8/IG5ldyBJbmplY3Rpb25Ub2tlbjxFbnZDb25maWc+KCdFTlZfQ09ORklHJyk7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgc2VydmljZSB0aGF0IGhhbmRsZXMgZmV0Y2hpbmcsIHBhcnNpbmcsIHZhbGlkYXRpbmcsIGFuZCBjYWNoaW5nXG4gICAqIG9mIHRoZSBydW50aW1lIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuICBjbGFzcyBSdW50aW1lQ29uZmlnU2VydmljZSB7XG4gICAgLy8gQ2FjaGVkIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0ZWQgY29uZmlndXJhdGlvbi5cbiAgICBwcml2YXRlIGNvbmZpZz86IEVudkNvbmZpZztcblxuICAgIC8qKlxuICAgICAqIExvYWRzLCBwYXJzZXMsIG1lcmdlcyBhbmQgdmFsaWRhdGVzIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gICAgICogUmV0dXJucyBhbiBgT2JzZXJ2YWJsZTxDb25maWdTaGFwZT5gIGFuZCBjYWNoZXMgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICAgKi9cbiAgICBsb2FkKCk6IE9ic2VydmFibGU8RW52Q29uZmlnPiB7XG4gICAgICByZXR1cm4gZGVmZXIoKCkgPT5cbiAgICAgICAgZnJvbShcbiAgICAgICAgICBmZXRjaChlbnZQYXRoKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBIVFRQIGVycm9ycyBleHBsaWNpdGx5IHNvIHRoZXkgZ28gdGhyb3VnaCBjYXRjaEVycm9yXG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIC8vIDEuIFNQQSBmYWxsYmFjayBndWFyZCAoc2VydmVyIHJldHVybmVkIEhUTUwgaW5zdGVhZCBvZiAuZW52KVxuICAgICAgICAgIG1hcCgocmF3OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbG9va3NIdG1sID1cbiAgICAgICAgICAgICAgL15cXHMqPCFkb2N0eXBlL2kudGVzdCh0cmltbWVkKSB8fCAvXlxccyo8aHRtbFtcXHM+XS9pLnRlc3QodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAobG9va3NIdG1sKSB7XG4gICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgICAgICAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRldGVjdGVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQgb25seS4nXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTaWduYWwg4oCcbm8gcnVudGltZS5lbnYsIHVzZSBzdGF0aWMgb25seeKAnVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByYXc7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFwKCh2OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRlYnVnKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgIHYgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgID8gJ05vIHJ1bnRpbWUgZW52aXJvbm1lbnQgZmlsZSBkZWZpbmVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQnXG4gICAgICAgICAgICAgICAgICA6ICdSdW50aW1lIGVudmlyb25tZW50IGZpbGUgbG9hZGVkLCBhcHBseWluZyBvdmVycmlkZXMuJ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIDIuIEVpdGhlciBjb250aW51ZSB0aGUgcGlwZSBvciByZXR1cm4gZGVmYXVsdHNcbiAgICAgICAgICBzd2l0Y2hNYXAoKHJhdzogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8RW52Q29uZmlnPiA9PiB7XG4gICAgICAgICAgICBpZiAocmF3ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmcm9tKGtpdC5tZXJnZUFuZFZhbGlkYXRlQXN5bmMoc3RhdGljRW52KSkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKGNmZykgPT4gKHRoaXMuY29uZmlnID0gY2ZnKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMy4gUGFyc2UgcmF3IGAuZW52YCB0ZXh0IC0+IG9iamVjdCwgdGhlbiBkZWVwLXBhcnRpYWwtcGFyc2UgdmlhIGtpdFxuICAgICAgICAgICAgY29uc3QgcnVudGltZUNvbmZpZ1JhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBwYXJzZUVudkZpbGUocmF3KTtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKGtpdC5wYXJzZVJ1bnRpbWVPdmVycmlkZXNBc3luYyhydW50aW1lQ29uZmlnUmF3KSkucGlwZShcbiAgICAgICAgICAgICAgdGFwKChvdmVycmlkZXM6IFBhcnRpYWw8RW52Q29uZmlnPikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnUnVudGltZSBjb25maWcgKHBhcnNlZCk6JyksIG92ZXJyaWRlcyk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAvLyA0LiBNZXJnZSBzdGF0aWMgKyBvdmVycmlkZXMgYW5kIHZhbGlkYXRlIHRoZSBmaW5hbCBjb25maWcgKGFzeW5jKVxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoXG4gICAgICAgICAgICAgICAgKG92ZXJyaWRlczogUGFydGlhbDxFbnZDb25maWc+KTogT2JzZXJ2YWJsZTxFbnZDb25maWc+ID0+XG4gICAgICAgICAgICAgICAgICBmcm9tKGtpdC5tZXJnZUFuZFZhbGlkYXRlQXN5bmMoc3RhdGljRW52LCBvdmVycmlkZXMpKVxuICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgIC8vIDUuIENhY2hlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgbGF0ZXJcbiAgICAgICAgICAgICAgdGFwKChtZXJnZWRDb25maWc6IEVudkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnTWVyZ2VkIGNvbmZpZzonKSwgbWVyZ2VkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IG1lcmdlZENvbmZpZztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICAvLyA2LiBFcnJvciBoYW5kbGluZzogZmFpbCBmYXN0IG9yIGdyYWNlZnVsbHkgZmFsbCBiYWNrIHRvIHN0YXRpYy1vbmx5XG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcE9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gUmVqZWN0IGFwcCBpbml0aWFsaXphdGlvbiAocmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24pXG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIC4uLnJjQXJncygnRXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBydW50aW1lIGNvbmZpZzonKSxcbiAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy51c2VEZWZhdWx0cygpKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICAgKiBJZiBub3QgeWV0IGxvYWRlZCwgcmV0dXJucyBhIHZhbGlkYXRlZCBzdGF0aWMtb25seSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIGdldCgpOiBFbnZDb25maWcge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1J1bnRpbWVDb25maWdTZXJ2aWNlLmdldCgpIGNhbGxlZCBiZWZvcmUgY29uZmlndXJhdGlvbiB3YXMgbG9hZGVkLiAnICtcbiAgICAgICAgICAgICdFbnN1cmUgcHJvdmlkZUFwcEluaXRpYWxpemVyIHdhaXRzIGZvciBSdW50aW1lQ29uZmlnU2VydmljZS5sb2FkKCkuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGEgdmFsaWRhdGVkIHN0YXRpYy1vbmx5IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBVc2VkIHdoZW4gdGhlIHJ1bnRpbWUgYC5lbnZgIGZpbGUgaXMgbWlzc2luZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVzZURlZmF1bHRzKCk6IEVudkNvbmZpZyB7XG4gICAgICAvLyBOb3RlOiB0aGlzIHVzZXMgdGhlIHN0YXRpYyBlbnY7IG1lcmdlK3ZhbGlkYXRlIGlzIHBlcmZvcm1lZCBpbiBgZ2V0KClgIGlmIG5lZWRlZC5cbiAgICAgIHRoaXMuY29uZmlnID8/PSBzdGF0aWNFbnYgYXMgRW52Q29uZmlnO1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBzZXJ2aWNlICsgaW5pdGlhbGl6ZXIgKyB0b2tlbiBleHBvc3VyZSB3aXRoIEFuZ3VsYXIgREkuXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIFJ1bnRpbWVDb25maWdTZXJ2aWNlLFxuXG4gICAgLy8gQW5ndWxhciAxOSsgZnVuY3Rpb25hbCBpbml0aWFsaXplciAoc3Vic2NyaWJlcyB0byB0aGUgbG9hZCBPYnNlcnZhYmxlKVxuICAgIC8vIFVzaW5nIGZpcnN0VmFsdWVGcm9tIHRvIGVuZm9yZWNlIFwiYXdhaXQgdW50aWwgbG9hZGVkXCIgc2VtYW50aWNzXG4gICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+XG4gICAgICBmaXJzdFZhbHVlRnJvbShpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmxvYWQoKSlcbiAgICApLFxuXG4gICAgLy8gRXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAge1xuICAgICAgcHJvdmlkZTogY29uZmlnVG9rZW4sXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmdldCgpLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1ydW50aW1lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvZW52L2FuZ3VsYXIvcHJvdmlkZS1ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxjQUFjLEVBQ2QsSUFBSSxFQUNKLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBa0MsRUFBRSxDQUFDO0lBQzlELHNCQUFzQixHQUFHLEdBQUc7SUFDNUIsYUFBYTtJQUNiLEVBQUU7Q0FDSCxDQUFDO0FBa0NGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBSWxDLEdBQWlCLEVBQ2pCLFNBQThCLEVBQzlCLEVBQ0UsT0FBTyxHQUFHLGtCQUFrQixFQUM1QixLQUFLLEdBQUcsS0FBSyxFQUNiLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLEtBQUssTUFDNkIsRUFBRTtJQUt0QyxnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0lBRXpFOzs7T0FHRztJQUNILE1BQ00sb0JBQW9CO1FBQ3hCLGtEQUFr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RSxDQUFDLENBQ3BEO1FBRUQsNERBQTREO1FBQzVEO1lBQ0UsT0FBTyxFQUFFLFdBQVc7WUFDcEIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRTtTQUNyRDtLQUNGLENBQUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlZmVyLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZnJvbUZldGNoIH0gZnJvbSAncnhqcy9mZXRjaCc7XG5pbXBvcnQgeiBmcm9tICd6b2QnO1xuaW1wb3J0IHsgRW52S2l0LCBTY2hlbWFPdXRwdXQsIFN0YXRpY0VudkZyb20gfSBmcm9tICcuLi9jb3JlL2Vudi10eXBlcyc7XG5pbXBvcnQgeyBwYXJzZUVudkZpbGUgfSBmcm9tICcuLi9jb3JlL3BhcnNlLWVudi1maWxlJztcblxuLyoqXG4gKiBCdWlsZHMgc3R5bGVkIGNvbnNvbGUgYXJndW1lbnRzIGZvciBSdW50aW1lQ29uZmlnIGxvZ3MuXG4gKlxuICogVGhlIHJldHVybmVkIHR1cGxlIGNhbiBiZSBzcHJlYWQgZGlyZWN0bHkgaW50byBgY29uc29sZS5sb2dgLFxuICogYWxsb3dpbmcgdGhlIGJyb3dzZXIgdG8gcmVuZGVyIGEgY29sb3JlZCBgW1J1bnRpbWVDb25maWddYCBwcmVmaXhcbiAqIHdoaWxlIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGNhbGxlciBsb2NhdGlvbiBpbiBEZXZUb29scy5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgdHNcbiAqIGNvbnNvbGUubG9nKC4uLnJjQXJncygnUnVudGltZSBvdmVycmlkZXMgbG9hZGVkLicpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0ZXh0IHRvIGFwcGVuZCBhZnRlciB0aGUgY29sb3JlZCBwcmVmaXguXG4gKiBAcmV0dXJucyBBIHR1cGxlIG9mIGFyZ3VtZW50cyAoYFtmb3JtYXQsIHN0eWxlLCByZXNldF1gKSBmb3IgYGNvbnNvbGUubG9nYC5cbiAqL1xuY29uc3QgcmNBcmdzID0gKG1zZzogc3RyaW5nKTogUGFyYW1ldGVyczx0eXBlb2YgY29uc29sZS5sb2c+ID0+IFtcbiAgJyVjW1J1bnRpbWVDb25maWddJWMgJyArIG1zZyxcbiAgJ2NvbG9yOiMwY2Y7JyxcbiAgJycsXG5dO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBBbmd1bGFyIHJ1bnRpbWUtY29uZmlnIHByb3ZpZGVyLlxuICpcbiAqIEBwcm9wZXJ0eSBlbnZQYXRoXG4gKiBUaGUgVVJMIChvciBwYXRoKSB0byB0aGUgcnVudGltZSBgLmVudmAgZmlsZSB0aGF0IHdpbGwgYmUgZmV0Y2hlZCBhdCBhcHAgc3RhcnQuXG4gKiBEZWZhdWx0cyB0byBgXCIvZW52L3J1bnRpbWUuZW52XCJgLlxuICpcbiAqIEBwcm9wZXJ0eSBkZWJ1Z1xuICogRW5hYmxlcyB2ZXJib3NlIGNvbnNvbGUgbG9nZ2luZyB3aGVuIGB0cnVlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqXG4gKiBAcHJvcGVydHkgc3RvcE9uRXJyb3JcbiAqIElmIGB0cnVlYCwgYW55IGZhaWx1cmUgd2hpbGUgbG9hZGluZy9wYXJzaW5nL3ZhbGlkYXRpbmcgdGhlIHJ1bnRpbWUgY29uZmlnXG4gKiB3aWxsIHJlamVjdCB0aGUgYXBwIGluaXRpYWxpemVyIGFuZCAqKmFib3J0IGJvb3QqKiAocmVjb21tZW5kZWQgZm9yIHByb2QpLlxuICogSWYgYGZhbHNlYCwgdGhlIHByb3ZpZGVyIGZhbGxzIGJhY2sgdG8gdGhlIHN0YXRpYyBlbnZpcm9ubWVudCBvbmx5LlxuICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICpcbiAqIEBwcm9wZXJ0eSB0b2tlblxuICogT3B0aW9uYWwgYEluamVjdGlvblRva2VuYCB1c2VkIHRvIGV4cG9zZSB0aGUgdmFsaWRhdGVkIGNvbmZpZ3VyYXRpb25cbiAqIHZpYSBBbmd1bGFyIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgcHJvdmlkZXIgd2lsbCBjcmVhdGUgb25lXG4gKiBhdXRvbWF0aWNhbGx5IG5hbWVkIGBFTlZfQ09ORklHYC5cbiAqL1xuaW50ZXJmYWNlIFByb3ZpZGVSdW50aW1lQ29uZmlnT3B0aW9uczxTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4+IHtcbiAgLyoqIFBhdGggdG8gdGhlIHJ1bnRpbWUgZW52IGZpbGUgKGRlZmF1bHQ6IC9lbnYvcnVudGltZS5lbnYpICovXG4gIGVudlBhdGg/OiBzdHJpbmc7XG4gIC8qKiBMb2cgZGVidWcgaW5mbyB0byBjb25zb2xlICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgLyoqIFRocm93IG9uIGVycm9yIHRvIHN0b3AgYXBwIGJvb3QgKGRlZmF1bHQ6IHRydWUpICovXG4gIHN0b3BPbkVycm9yPzogYm9vbGVhbjtcbiAgLyoqIEluamVjdGlvbiB0b2tlbiB1c2VkIHRvIHByb3ZpZGUgdGhlIHZhbGlkYXRlZCBjb25maWcgdmlhIEFuZ3VsYXIgREkgKi9cbiAgdG9rZW4/OiBJbmplY3Rpb25Ub2tlbjxTY2hlbWFPdXRwdXQ8Uz4+O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBwcm92aWRlcnMgdGhhdDpcbiAqIC0gRmV0Y2ggYSBydW50aW1lIGAuZW52YCBmaWxlIGF0IHN0YXJ0dXAsXG4gKiAtIFBhcnNlIGl0IHRvIGEgZGVlcC1wYXJ0aWFsIHN0cnVjdHVyZSB2aWEgdGhlIGtpdCxcbiAqIC0gRW5mb3JjZSBydW50aW1lLXJlcXVpcmVkIGtleXMgd2hlbiBhcHByb3ByaWF0ZSxcbiAqIC0gTWVyZ2Ugd2l0aCB0aGUgc3RhdGljIGVudmlyb25tZW50LFxuICogLSBWYWxpZGF0ZSB0aGUgKipmaW5hbCoqIGNvbmZpZ3VyYXRpb24gYWdhaW5zdCB0aGUgWm9kIHNjaGVtYSxcbiAqIC0gRXhwb3NlIHRoZSByZXN1bHRpbmcgY29uZmlnIHZpYSBhIGdlbmVyYXRlZCBgSW5qZWN0aW9uVG9rZW5gLlxuICpcbiAqIEB0eXBlUGFyYW0gUyAtIFpvZCBzY2hlbWEgdHlwZSBkZXNjcmliaW5nIHRoZSBmdWxsIGNvbmZpZyBzaGFwZS5cbiAqIEB0eXBlUGFyYW0gSyAtIExpc3Qgb2YgcnVudGltZS1yZXF1aXJlZCB0b3AtbGV2ZWwga2V5cy5cbiAqXG4gKiBAcGFyYW0ga2l0XG4gKiBUaGUgYEVudktpdGAgY3JlYXRlZCBieSBgY3JlYXRlRW52S2l0KHNjaGVtYSwgcnVudGltZVJlcXVpcmVkS2V5cylgLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBSdW50aW1lIGxvYWRpbmcgYmVoYXZpb3IgYW5kIERJIHRva2VuIGRlc2NyaXB0aW9uLiBTZWUge0BsaW5rIFByb3ZpZGVSdW50aW1lQ29uZmlnT3B0aW9uc30uXG4gKlxuICogQHJldHVybnMgVGhlIGBFbnZpcm9ubWVudFByb3ZpZGVyc2AgdG8gYmUgYWRkZWQgdG8gYGFwcENvbmZpZy5wcm92aWRlcnNgLFxuICpcbiAqIEByZW1hcmtzXG4gKiAtIFRoaXMgdXNlcyBhbiBBbmd1bGFyICoqZnVuY3Rpb25hbCBhcHAgaW5pdGlhbGl6ZXIqKiB0byBwZXJmb3JtIHRoZSBsb2FkIHN0ZXAuXG4gKiAtIElmIHRoZSBzZXJ2ZXIgcmV0dXJucyBhbiBIVE1MIFNQQSBmYWxsYmFjayAoaW5zdGVhZCBvZiB0aGUgYC5lbnZgIGZpbGUpLCB0aGUgcHJvdmlkZXJcbiAqICAgcXVpZXRseSB1c2VzIHRoZSBzdGF0aWMgZW52aXJvbm1lbnQgKG5vIHJ1bnRpbWUgb3ZlcnJpZGVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVSdW50aW1lQ29uZmlnPFxuICBTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4sXG4gIEsgZXh0ZW5kcyByZWFkb25seSAoa2V5b2Ygei5vdXRwdXQ8Uz4pW10sXG4+KFxuICBraXQ6IEVudktpdDxTLCBLPixcbiAgc3RhdGljRW52OiBTdGF0aWNFbnZGcm9tPFMsIEs+LFxuICB7XG4gICAgZW52UGF0aCA9ICcvZW52L3J1bnRpbWUuZW52JyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHN0b3BPbkVycm9yID0gdHJ1ZSxcbiAgICB0b2tlbixcbiAgfTogUHJvdmlkZVJ1bnRpbWVDb25maWdPcHRpb25zPFM+ID0ge30sXG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIC8vIFRoZSB2YWxpZGF0ZWQgY29uZmlnIHR5cGUgZGVyaXZlZCBmcm9tIHRoZSBzY2hlbWEuXG4gIHR5cGUgRW52Q29uZmlnID0gU2NoZW1hT3V0cHV0PFM+O1xuXG4gIC8vIFR5cGVkIHRva2VuIHVzZWQgdG8gZXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSBESS5cbiAgY29uc3QgY29uZmlnVG9rZW4gPSB0b2tlbiA/PyBuZXcgSW5qZWN0aW9uVG9rZW48RW52Q29uZmlnPignRU5WX0NPTkZJRycpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHNlcnZpY2UgdGhhdCBoYW5kbGVzIGZldGNoaW5nLCBwYXJzaW5nLCB2YWxpZGF0aW5nLCBhbmQgY2FjaGluZ1xuICAgKiBvZiB0aGUgcnVudGltZSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbiAgY2xhc3MgUnVudGltZUNvbmZpZ1NlcnZpY2Uge1xuICAgIC8vIENhY2hlZCBpbnN0YW5jZSBvZiB0aGUgdmFsaWRhdGVkIGNvbmZpZ3VyYXRpb24uXG4gICAgcHJpdmF0ZSBjb25maWc/OiBFbnZDb25maWc7XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcywgcGFyc2VzLCBtZXJnZXMgYW5kIHZhbGlkYXRlcyB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uLlxuICAgICAqIFJldHVybnMgYW4gYE9ic2VydmFibGU8Q29uZmlnU2hhcGU+YCBhbmQgY2FjaGVzIHRoZSBmaW5hbCByZXN1bHQuXG4gICAgICovXG4gICAgbG9hZCgpOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4ge1xuICAgICAgcmV0dXJuIGRlZmVyKCgpID0+XG4gICAgICAgIGZyb21GZXRjaChlbnZQYXRoKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgZXhwbGljaXRseSBzbyB0aGV5IGdvIHRocm91Z2ggY2F0Y2hFcnJvclxuICAgICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlc3BvbnNlLnRleHQoKSByZXR1cm5zIGEgUHJvbWlzZSwgd2hpY2ggc3dpdGNoTWFwIGNhbiBoYW5kbGVcbiAgICAgICAgICAgIHJldHVybiByZXMudGV4dCgpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIDEuIFNQQSBmYWxsYmFjayBndWFyZCAoc2VydmVyIHJldHVybmVkIEhUTUwgaW5zdGVhZCBvZiAuZW52KVxuICAgICAgICAgIG1hcCgocmF3OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbG9va3NIdG1sID1cbiAgICAgICAgICAgICAgL15cXHMqPCFkb2N0eXBlL2kudGVzdCh0cmltbWVkKSB8fCAvXlxccyo8aHRtbFtcXHM+XS9pLnRlc3QodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAobG9va3NIdG1sKSB7XG4gICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgICAgICAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRldGVjdGVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQgb25seS4nLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFNpZ25hbCDigJxubyBydW50aW1lLmVudiwgdXNlIHN0YXRpYyBvbmx54oCdXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJhdztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YXAoKHY6IHN0cmluZyB8IG51bGwpID0+IHtcbiAgICAgICAgICAgIGlmICghZGVidWcpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAuLi5yY0FyZ3MoXG4gICAgICAgICAgICAgICAgdiA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgPyAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRlZmluZWQsIHVzaW5nIHN0YXRpYyBlbnZpcm9ubWVudCdcbiAgICAgICAgICAgICAgICAgIDogJ1J1bnRpbWUgZW52aXJvbm1lbnQgZmlsZSBsb2FkZWQsIGFwcGx5aW5nIG92ZXJyaWRlcy4nLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyAyLiBFaXRoZXIgY29udGludWUgdGhlIHBpcGUgb3IgcmV0dXJuIGRlZmF1bHRzXG4gICAgICAgICAgc3dpdGNoTWFwKChyYXc6IHN0cmluZyB8IG51bGwpOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4gPT4ge1xuICAgICAgICAgICAgaWYgKHJhdyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gZnJvbShraXQubWVyZ2VBbmRWYWxpZGF0ZUFzeW5jKHN0YXRpY0VudikpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChjZmcpID0+ICh0aGlzLmNvbmZpZyA9IGNmZykpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAzLiBQYXJzZSByYXcgYC5lbnZgIHRleHQgLT4gb2JqZWN0LCB0aGVuIGRlZXAtcGFydGlhbC1wYXJzZSB2aWEga2l0XG4gICAgICAgICAgICBjb25zdCBydW50aW1lQ29uZmlnUmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHBhcnNlRW52RmlsZShyYXcpO1xuICAgICAgICAgICAgcmV0dXJuIGZyb20oa2l0LnBhcnNlUnVudGltZU92ZXJyaWRlc0FzeW5jKHJ1bnRpbWVDb25maWdSYXcpKS5waXBlKFxuICAgICAgICAgICAgICB0YXAoKG92ZXJyaWRlczogUGFydGlhbDxFbnZDb25maWc+KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlYnVnKVxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coLi4ucmNBcmdzKCdSdW50aW1lIGNvbmZpZyAocGFyc2VkKTonKSwgb3ZlcnJpZGVzKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIC8vIDQuIE1lcmdlIHN0YXRpYyArIG92ZXJyaWRlcyBhbmQgdmFsaWRhdGUgdGhlIGZpbmFsIGNvbmZpZyAoYXN5bmMpXG4gICAgICAgICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAgICAgICAob3ZlcnJpZGVzOiBQYXJ0aWFsPEVudkNvbmZpZz4pOiBPYnNlcnZhYmxlPEVudkNvbmZpZz4gPT5cbiAgICAgICAgICAgICAgICAgIGZyb20oa2l0Lm1lcmdlQW5kVmFsaWRhdGVBc3luYyhzdGF0aWNFbnYsIG92ZXJyaWRlcykpLFxuICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgIC8vIDUuIENhY2hlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgbGF0ZXJcbiAgICAgICAgICAgICAgdGFwKChtZXJnZWRDb25maWc6IEVudkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnTWVyZ2VkIGNvbmZpZzonKSwgbWVyZ2VkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IG1lcmdlZENvbmZpZztcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgLy8gNi4gRXJyb3IgaGFuZGxpbmc6IGZhaWwgZmFzdCBvciBncmFjZWZ1bGx5IGZhbGwgYmFjayB0byBzdGF0aWMtb25seVxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgaWYgKHN0b3BPbkVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIFJlamVjdCBhcHAgaW5pdGlhbGl6YXRpb24gKHJlY29tbWVuZGVkIGZvciBwcm9kdWN0aW9uKVxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAuLi5yY0FyZ3MoJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgcnVudGltZSBjb25maWc6JyksXG4gICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnVzZURlZmF1bHRzKCkpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXG4gICAgICogSWYgbm90IHlldCBsb2FkZWQsIHJldHVybnMgYSB2YWxpZGF0ZWQgc3RhdGljLW9ubHkgY29uZmlndXJhdGlvbi5cbiAgICAgKi9cbiAgICBnZXQoKTogRW52Q29uZmlnIHtcbiAgICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdSdW50aW1lQ29uZmlnU2VydmljZS5nZXQoKSBjYWxsZWQgYmVmb3JlIGNvbmZpZ3VyYXRpb24gd2FzIGxvYWRlZC4gJyArXG4gICAgICAgICAgICAnRW5zdXJlIHByb3ZpZGVBcHBJbml0aWFsaXplciB3YWl0cyBmb3IgUnVudGltZUNvbmZpZ1NlcnZpY2UubG9hZCgpLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gYSB2YWxpZGF0ZWQgc3RhdGljLW9ubHkgY29uZmlndXJhdGlvblxuICAgICAqIFVzZWQgd2hlbiB0aGUgcnVudGltZSBgLmVudmAgZmlsZSBpcyBtaXNzaW5nLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXNlRGVmYXVsdHMoKTogRW52Q29uZmlnIHtcbiAgICAgIC8vIE5vdGU6IHRoaXMgdXNlcyB0aGUgc3RhdGljIGVudjsgbWVyZ2UrdmFsaWRhdGUgaXMgcGVyZm9ybWVkIGluIGBnZXQoKWAgaWYgbmVlZGVkLlxuICAgICAgdGhpcy5jb25maWcgPz89IHN0YXRpY0VudiBhcyBFbnZDb25maWc7XG4gICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZpY2UgKyBpbml0aWFsaXplciArIHRva2VuIGV4cG9zdXJlIHdpdGggQW5ndWxhciBESS5cbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAgUnVudGltZUNvbmZpZ1NlcnZpY2UsXG5cbiAgICAvLyBBbmd1bGFyIDE5KyBmdW5jdGlvbmFsIGluaXRpYWxpemVyIChzdWJzY3JpYmVzIHRvIHRoZSBsb2FkIE9ic2VydmFibGUpXG4gICAgLy8gVXNpbmcgZmlyc3RWYWx1ZUZyb20gdG8gZW5mb3JlY2UgXCJhd2FpdCB1bnRpbCBsb2FkZWRcIiBzZW1hbnRpY3NcbiAgICBwcm92aWRlQXBwSW5pdGlhbGl6ZXIoKCkgPT5cbiAgICAgIGZpcnN0VmFsdWVGcm9tKGluamVjdChSdW50aW1lQ29uZmlnU2VydmljZSkubG9hZCgpKSxcbiAgICApLFxuXG4gICAgLy8gRXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAge1xuICAgICAgcHJvdmlkZTogY29uZmlnVG9rZW4sXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmdldCgpLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ElementRef, TemplateRef, computed, effect, input, output, viewChild, } from '@angular/core';
|
|
3
|
+
import { TdsModal, TegelModule } from '@scania/tegel-angular-17';
|
|
4
|
+
import { DynamicComponentDirective } from '../../directives/dynamic-component.directive';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
import * as i2 from "@scania/tegel-angular-17";
|
|
8
|
+
/**
|
|
9
|
+
* Renders a single modal instance backed by the Tegel <tds-modal> web component.
|
|
10
|
+
*
|
|
11
|
+
* Responsibilities:
|
|
12
|
+
* - Initialize the underlying web component once it is ready.
|
|
13
|
+
* - Apply the desired open/close state based on `modal.isOpen`.
|
|
14
|
+
* - Render header/body/action content (including dynamic components).
|
|
15
|
+
*/
|
|
16
|
+
export class ModalComponent {
|
|
17
|
+
/**
|
|
18
|
+
* Modal configuration and runtime state.
|
|
19
|
+
*/
|
|
20
|
+
modal = input.required();
|
|
21
|
+
/**
|
|
22
|
+
* Emits the modal id when the modal is closed by the user.
|
|
23
|
+
*/
|
|
24
|
+
closed = output();
|
|
25
|
+
// Reference to the underlying web component instance.
|
|
26
|
+
_modalRef = viewChild(TdsModal, {
|
|
27
|
+
read: (ElementRef),
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Resolved DOM element for the underlying <tds-modal>.
|
|
31
|
+
*/
|
|
32
|
+
modalEl = computed(() => this._modalRef()?.nativeElement ?? null);
|
|
33
|
+
/** Tracks whether the modal has been initialized. */
|
|
34
|
+
initialized = false;
|
|
35
|
+
constructor() {
|
|
36
|
+
effect(() => {
|
|
37
|
+
// Track input changes and sync desired open state to the web component.
|
|
38
|
+
this.modal();
|
|
39
|
+
void this.applyOpenState();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Type guard for TemplateRef values.
|
|
44
|
+
* @param value Value to test.
|
|
45
|
+
*/
|
|
46
|
+
isTemplateRef(value) {
|
|
47
|
+
return value instanceof TemplateRef;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Type guard for component-backed modal bodies.
|
|
51
|
+
* @param body Body value to test.
|
|
52
|
+
*/
|
|
53
|
+
isComponentBody(body) {
|
|
54
|
+
return typeof body === 'object' && body !== null && 'component' in body;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Invokes an action button handler (sync or async).
|
|
58
|
+
* @param button Modal button descriptor.
|
|
59
|
+
*/
|
|
60
|
+
async handleButtonClick(button) {
|
|
61
|
+
try {
|
|
62
|
+
await button.onClick?.();
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.error('[tae-modal] Button onClick failed:', err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Initializes the underlying <tds-modal> after view init.
|
|
70
|
+
*/
|
|
71
|
+
ngAfterViewInit() {
|
|
72
|
+
void this.initializeModal();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Calls the web component's initializeModal() once.
|
|
76
|
+
*/
|
|
77
|
+
async initializeModal() {
|
|
78
|
+
const el = this.modalEl();
|
|
79
|
+
if (!el) {
|
|
80
|
+
console.warn('[tae-modal] Modal element not found; cannot initialize.');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (this.initialized)
|
|
84
|
+
return;
|
|
85
|
+
const ready = await el.componentOnReady();
|
|
86
|
+
if (!ready) {
|
|
87
|
+
console.warn('[tae-modal] Modal element not ready; initialization skipped.');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
await el.initializeModal();
|
|
91
|
+
this.initialized = true;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Applies the desired open/close state to the web component.
|
|
95
|
+
*/
|
|
96
|
+
async applyOpenState() {
|
|
97
|
+
const modal = this.modal();
|
|
98
|
+
const el = this.modalEl();
|
|
99
|
+
if (!el)
|
|
100
|
+
return;
|
|
101
|
+
if (!this.initialized) {
|
|
102
|
+
// Initialize once before issuing show/close calls.
|
|
103
|
+
await this.initializeModal();
|
|
104
|
+
if (!this.initialized)
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (modal.isOpen) {
|
|
108
|
+
await el.showModal();
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
await el.closeModal();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
115
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ModalComponent, isStandalone: true, selector: "tae-modal", inputs: { modal: { classPropertyName: "modal", publicName: "modal", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closed: "closed" }, viewQueries: [{ propertyName: "_modalRef", first: true, predicate: TdsModal, descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "@let modalObj = modal();\n\n<tds-modal\n [id]=\"modalObj.id\"\n [selector]=\"modalObj.selector\"\n [referenceEl]=\"modalObj.referenceEl\"\n [size]=\"modalObj.size\"\n [actionsPosition]=\"modalObj.actionsPosition\"\n [prevent]=\"modalObj.prevent\"\n [closable]=\"modalObj.closable\"\n [tdsAlertDialog]=\"modalObj.alertDialog\"\n (tdsClose)=\"this.closed.emit(modalObj.id)\"\n>\n @let header = modalObj.header;\n @if (header) {\n @if (isTemplateRef(header)) {\n <span slot=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n </span>\n } @else {\n <span slot=\"header\">{{ header }}</span>\n }\n }\n\n @if (!modalObj.lazy || modalObj.isOpen) {\n @let body = modalObj.body;\n @if (body) {\n <span slot=\"body\">\n @if (isComponentBody(body)) {\n <ng-container\n taeDynamicComponent\n [component]=\"body.component\"\n [inputs]=\"body.inputs\"\n [outputs]=\"body.outputs\"\n />\n } @else if (isTemplateRef(body)) {\n <ng-container [ngTemplateOutlet]=\"body\" />\n } @else {\n {{ body }}\n }\n </span>\n }\n }\n\n @let buttons = modalObj.buttons;\n @if (buttons?.length) {\n <span slot=\"actions\" class=\"tds-u-flex tds-u-gap2\">\n @for (button of buttons; track $index) {\n <tds-button\n [text]=\"button.text\"\n [variant]=\"button.variant ?? 'primary'\"\n [size]=\"button.size ?? 'md'\"\n [disabled]=\"button.disabled ?? false\"\n [attr.data-dismiss-modal]=\"button.dismiss ? '' : null\"\n (click)=\"handleButtonClick(button)\"\n ></tds-button>\n }\n </span>\n }\n</tds-modal>\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TegelModule }, { kind: "component", type: i2.TdsButton, selector: "tds-button", inputs: ["animation", "disabled", "fullbleed", "modeVariant", "name", "size", "tdsAriaLabel", "text", "type", "value", "variant"] }, { kind: "component", type: i2.TdsModal, selector: "tds-modal", inputs: ["actionsPosition", "closable", "header", "prevent", "referenceEl", "selector", "show", "size", "tdsAlertDialog"] }, { kind: "directive", type: DynamicComponentDirective, selector: "[taeDynamicComponent]", inputs: ["component", "inputs", "outputs"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
116
|
+
}
|
|
117
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalComponent, decorators: [{
|
|
118
|
+
type: Component,
|
|
119
|
+
args: [{ selector: 'tae-modal', imports: [CommonModule, TegelModule, DynamicComponentDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let modalObj = modal();\n\n<tds-modal\n [id]=\"modalObj.id\"\n [selector]=\"modalObj.selector\"\n [referenceEl]=\"modalObj.referenceEl\"\n [size]=\"modalObj.size\"\n [actionsPosition]=\"modalObj.actionsPosition\"\n [prevent]=\"modalObj.prevent\"\n [closable]=\"modalObj.closable\"\n [tdsAlertDialog]=\"modalObj.alertDialog\"\n (tdsClose)=\"this.closed.emit(modalObj.id)\"\n>\n @let header = modalObj.header;\n @if (header) {\n @if (isTemplateRef(header)) {\n <span slot=\"header\">\n <ng-container [ngTemplateOutlet]=\"header\" />\n </span>\n } @else {\n <span slot=\"header\">{{ header }}</span>\n }\n }\n\n @if (!modalObj.lazy || modalObj.isOpen) {\n @let body = modalObj.body;\n @if (body) {\n <span slot=\"body\">\n @if (isComponentBody(body)) {\n <ng-container\n taeDynamicComponent\n [component]=\"body.component\"\n [inputs]=\"body.inputs\"\n [outputs]=\"body.outputs\"\n />\n } @else if (isTemplateRef(body)) {\n <ng-container [ngTemplateOutlet]=\"body\" />\n } @else {\n {{ body }}\n }\n </span>\n }\n }\n\n @let buttons = modalObj.buttons;\n @if (buttons?.length) {\n <span slot=\"actions\" class=\"tds-u-flex tds-u-gap2\">\n @for (button of buttons; track $index) {\n <tds-button\n [text]=\"button.text\"\n [variant]=\"button.variant ?? 'primary'\"\n [size]=\"button.size ?? 'md'\"\n [disabled]=\"button.disabled ?? false\"\n [attr.data-dismiss-modal]=\"button.dismiss ? '' : null\"\n (click)=\"handleButtonClick(button)\"\n ></tds-button>\n }\n </span>\n }\n</tds-modal>\n", styles: [":host{display:contents}\n"] }]
|
|
120
|
+
}], ctorParameters: () => [] });
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9tb2RhbC9jb21wb25lbnRzL21vZGFsL21vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvY29tcG9uZW50cy9tb2RhbC9tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOENBQThDLENBQUM7Ozs7QUFJekY7Ozs7Ozs7R0FPRztBQVFILE1BQU0sT0FBTyxjQUFjO0lBQ3pCOztPQUVHO0lBQ00sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVMsQ0FBQztJQUN6Qzs7T0FFRztJQUNnQixNQUFNLEdBQUcsTUFBTSxFQUFVLENBQUM7SUFDN0Msc0RBQXNEO0lBQ3JDLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQy9DLElBQUksRUFBRSxDQUFBLFVBQStCLENBQUE7S0FDdEMsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDZ0IsT0FBTyxHQUFHLFFBQVEsQ0FDbkMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQzlD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bic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRkc01vZGFsLCBUZWdlbE1vZHVsZSB9IGZyb20gJ0BzY2FuaWEvdGVnZWwtYW5ndWxhci0xNyc7XG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9keW5hbWljLWNvbXBvbmVudC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTW9kYWwsIE1vZGFsQm9keSwgTW9kYWxDb21wb25lbnRCb2R5IH0gZnJvbSAnLi4vLi4vc2NoZW1hL21vZGFsLm1vZGVsJztcbmltcG9ydCB7IE1vZGFsQnV0dG9uIH0gZnJvbSAnLi4vLi4vc2NoZW1hL21vZGFsLnR5cGVzJztcblxuLyoqXG4gKiBSZW5kZXJzIGEgc2luZ2xlIG1vZGFsIGluc3RhbmNlIGJhY2tlZCBieSB0aGUgVGVnZWwgPHRkcy1tb2RhbD4gd2ViIGNvbXBvbmVudC5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBJbml0aWFsaXplIHRoZSB1bmRlcmx5aW5nIHdlYiBjb21wb25lbnQgb25jZSBpdCBpcyByZWFkeS5cbiAqIC0gQXBwbHkgdGhlIGRlc2lyZWQgb3Blbi9jbG9zZSBzdGF0ZSBiYXNlZCBvbiBgbW9kYWwuaXNPcGVuYC5cbiAqIC0gUmVuZGVyIGhlYWRlci9ib2R5L2FjdGlvbiBjb250ZW50IChpbmNsdWRpbmcgZHluYW1pYyBjb21wb25lbnRzKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGFlLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVGVnZWxNb2R1bGUsIER5bmFtaWNDb21wb25lbnREaXJlY3RpdmVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgLyoqXG4gICAqIE1vZGFsIGNvbmZpZ3VyYXRpb24gYW5kIHJ1bnRpbWUgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBtb2RhbCA9IGlucHV0LnJlcXVpcmVkPE1vZGFsPigpO1xuICAvKipcbiAgICogRW1pdHMgdGhlIG1vZGFsIGlkIHdoZW4gdGhlIG1vZGFsIGlzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICAvLyBSZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgd2ViIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kYWxSZWYgPSB2aWV3Q2hpbGQoVGRzTW9kYWwsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmPEhUTUxUZHNNb2RhbEVsZW1lbnQ+LFxuICB9KTtcblxuICAvKipcbiAgICogUmVzb2x2ZWQgRE9NIGVsZW1lbnQgZm9yIHRoZSB1bmRlcmx5aW5nIDx0ZHMtbW9kYWw+LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vZGFsRWwgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLl9tb2RhbFJlZigpPy5uYXRpdmVFbGVtZW50ID8/IG51bGwsXG4gICk7XG5cbiAgLyoqIFRyYWNrcyB3aGV0aGVyIHRoZSBtb2RhbCBoYXMgYmVlbiBpbml0aWFsaXplZC4gKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBUcmFjayBpbnB1dCBjaGFuZ2VzIGFuZCBzeW5jIGRlc2lyZWQgb3BlbiBzdGF0ZSB0byB0aGUgd2ViIGNvbXBvbmVudC5cbiAgICAgIHRoaXMubW9kYWwoKTtcbiAgICAgIHZvaWQgdGhpcy5hcHBseU9wZW5TdGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgZ3VhcmQgZm9yIFRlbXBsYXRlUmVmIHZhbHVlcy5cbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHRlc3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNUZW1wbGF0ZVJlZih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRlbXBsYXRlUmVmPHVua25vd24+IHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUeXBlIGd1YXJkIGZvciBjb21wb25lbnQtYmFja2VkIG1vZGFsIGJvZGllcy5cbiAgICogQHBhcmFtIGJvZHkgQm9keSB2YWx1ZSB0byB0ZXN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzQ29tcG9uZW50Qm9keShcbiAgICBib2R5OiBNb2RhbEJvZHk8dW5rbm93bj4sXG4gICk6IGJvZHkgaXMgTW9kYWxDb21wb25lbnRCb2R5PHVua25vd24+IHtcbiAgICByZXR1cm4gdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnICYmIGJvZHkgIT09IG51bGwgJiYgJ2NvbXBvbmVudCcgaW4gYm9keTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2VzIGFuIGFjdGlvbiBidXR0b24gaGFuZGxlciAoc3luYyBvciBhc3luYykuXG4gICAqIEBwYXJhbSBidXR0b24gTW9kYWwgYnV0dG9uIGRlc2NyaXB0b3IuXG4gICAqL1xuICBhc3luYyBoYW5kbGVCdXR0b25DbGljayhidXR0b246IE1vZGFsQnV0dG9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJ1dHRvbi5vbkNsaWNrPy4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1t0YWUtbW9kYWxdIEJ1dHRvbiBvbkNsaWNrIGZhaWxlZDonLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgdW5kZXJseWluZyA8dGRzLW1vZGFsPiBhZnRlciB2aWV3IGluaXQuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmluaXRpYWxpemVNb2RhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIHRoZSB3ZWIgY29tcG9uZW50J3MgaW5pdGlhbGl6ZU1vZGFsKCkgb25jZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZU1vZGFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVsID0gdGhpcy5tb2RhbEVsKCk7XG4gICAgaWYgKCFlbCkge1xuICAgICAgY29uc29sZS53YXJuKCdbdGFlLW1vZGFsXSBNb2RhbCBlbGVtZW50IG5vdCBmb3VuZDsgY2Fubm90IGluaXRpYWxpemUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICBjb25zdCByZWFkeSA9IGF3YWl0IGVsLmNvbXBvbmVudE9uUmVhZHkoKTtcbiAgICBpZiAoIXJlYWR5KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbdGFlLW1vZGFsXSBNb2RhbCBlbGVtZW50IG5vdCByZWFkeTsgaW5pdGlhbGl6YXRpb24gc2tpcHBlZC4nLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBlbC5pbml0aWFsaXplTW9kYWwoKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBkZXNpcmVkIG9wZW4vY2xvc2Ugc3RhdGUgdG8gdGhlIHdlYiBjb21wb25lbnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFwcGx5T3BlblN0YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5tb2RhbCgpO1xuICAgIGNvbnN0IGVsID0gdGhpcy5tb2RhbEVsKCk7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBvbmNlIGJlZm9yZSBpc3N1aW5nIHNob3cvY2xvc2UgY2FsbHMuXG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVNb2RhbCgpO1xuICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgfVxuICAgIGlmIChtb2RhbC5pc09wZW4pIHtcbiAgICAgIGF3YWl0IGVsLnNob3dNb2RhbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBlbC5jbG9zZU1vZGFsKCk7XG4gICAgfVxuICB9XG59XG4iLCJAbGV0IG1vZGFsT2JqID0gbW9kYWwoKTtcblxuPHRkcy1tb2RhbFxuICBbaWRdPVwibW9kYWxPYmouaWRcIlxuICBbc2VsZWN0b3JdPVwibW9kYWxPYmouc2VsZWN0b3JcIlxuICBbcmVmZXJlbmNlRWxdPVwibW9kYWxPYmoucmVmZXJlbmNlRWxcIlxuICBbc2l6ZV09XCJtb2RhbE9iai5zaXplXCJcbiAgW2FjdGlvbnNQb3NpdGlvbl09XCJtb2RhbE9iai5hY3Rpb25zUG9zaXRpb25cIlxuICBbcHJldmVudF09XCJtb2RhbE9iai5wcmV2ZW50XCJcbiAgW2Nsb3NhYmxlXT1cIm1vZGFsT2JqLmNsb3NhYmxlXCJcbiAgW3Rkc0FsZXJ0RGlhbG9nXT1cIm1vZGFsT2JqLmFsZXJ0RGlhbG9nXCJcbiAgKHRkc0Nsb3NlKT1cInRoaXMuY2xvc2VkLmVtaXQobW9kYWxPYmouaWQpXCJcbj5cbiAgQGxldCBoZWFkZXIgPSBtb2RhbE9iai5oZWFkZXI7XG4gIEBpZiAoaGVhZGVyKSB7XG4gICAgQGlmIChpc1RlbXBsYXRlUmVmKGhlYWRlcikpIHtcbiAgICAgIDxzcGFuIHNsb3Q9XCJoZWFkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIiAvPlxuICAgICAgPC9zcGFuPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPHNwYW4gc2xvdD1cImhlYWRlclwiPnt7IGhlYWRlciB9fTwvc3Bhbj5cbiAgICB9XG4gIH1cblxuICBAaWYgKCFtb2RhbE9iai5sYXp5IHx8IG1vZGFsT2JqLmlzT3Blbikge1xuICAgIEBsZXQgYm9keSA9IG1vZGFsT2JqLmJvZHk7XG4gICAgQGlmIChib2R5KSB7XG4gICAgICA8c3BhbiBzbG90PVwiYm9keVwiPlxuICAgICAgICBAaWYgKGlzQ29tcG9uZW50Qm9keShib2R5KSkge1xuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIHRhZUR5bmFtaWNDb21wb25lbnRcbiAgICAgICAgICAgIFtjb21wb25lbnRdPVwiYm9keS5jb21wb25lbnRcIlxuICAgICAgICAgICAgW2lucHV0c109XCJib2R5LmlucHV0c1wiXG4gICAgICAgICAgICBbb3V0cHV0c109XCJib2R5Lm91dHB1dHNcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH0gQGVsc2UgaWYgKGlzVGVtcGxhdGVSZWYoYm9keSkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJvZHlcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICB7eyBib2R5IH19XG4gICAgICAgIH1cbiAgICAgIDwvc3Bhbj5cbiAgICB9XG4gIH1cblxuICBAbGV0IGJ1dHRvbnMgPSBtb2RhbE9iai5idXR0b25zO1xuICBAaWYgKGJ1dHRvbnM/Lmxlbmd0aCkge1xuICAgIDxzcGFuIHNsb3Q9XCJhY3Rpb25zXCIgY2xhc3M9XCJ0ZHMtdS1mbGV4IHRkcy11LWdhcDJcIj5cbiAgICAgIEBmb3IgKGJ1dHRvbiBvZiBidXR0b25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPHRkcy1idXR0b25cbiAgICAgICAgICBbdGV4dF09XCJidXR0b24udGV4dFwiXG4gICAgICAgICAgW3ZhcmlhbnRdPVwiYnV0dG9uLnZhcmlhbnQgPz8gJ3ByaW1hcnknXCJcbiAgICAgICAgICBbc2l6ZV09XCJidXR0b24uc2l6ZSA/PyAnbWQnXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkID8/IGZhbHNlXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLWRpc21pc3MtbW9kYWxdPVwiYnV0dG9uLmRpc21pc3MgPyAnJyA6IG51bGxcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVCdXR0b25DbGljayhidXR0b24pXCJcbiAgICAgICAgPjwvdGRzLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L3NwYW4+XG4gIH1cbjwvdGRzLW1vZGFsPlxuIl19
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
|
3
|
+
import { ModalService } from '../../modal.service';
|
|
4
|
+
import { ModalComponent } from '../modal/modal.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Hosts and renders all active modals.
|
|
8
|
+
*
|
|
9
|
+
* The host listens for close events from each modal instance and
|
|
10
|
+
* forwards them to the modal service, which owns modal lifecycle.
|
|
11
|
+
*/
|
|
12
|
+
export class ModalHostComponent {
|
|
13
|
+
modalService = inject(ModalService);
|
|
14
|
+
/**
|
|
15
|
+
* Map of active modals keyed by id.
|
|
16
|
+
*/
|
|
17
|
+
modalsSignal = this.modalService.modals;
|
|
18
|
+
/**
|
|
19
|
+
* Handles close events from child modal components.
|
|
20
|
+
* @param id Modal id that emitted the close event.
|
|
21
|
+
*/
|
|
22
|
+
handleClosed(id) {
|
|
23
|
+
this.modalService.close(id);
|
|
24
|
+
}
|
|
25
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
26
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: ModalHostComponent, isStandalone: true, selector: "tae-modal-host", ngImport: i0, template: "@for (modal of modalsSignal().values(); track modal.id) {\n <tae-modal [modal]=\"modal\" (closed)=\"handleClosed($event)\" />\n}\n", styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: ModalComponent, selector: "tae-modal", inputs: ["modal"], outputs: ["closed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
27
|
+
}
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalHostComponent, decorators: [{
|
|
29
|
+
type: Component,
|
|
30
|
+
args: [{ selector: 'tae-modal-host', imports: [CommonModule, ModalComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@for (modal of modalsSignal().values(); track modal.id) {\n <tae-modal [modal]=\"modal\" (closed)=\"handleClosed($event)\" />\n}\n", styles: [":host{display:contents}\n"] }]
|
|
31
|
+
}] });
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtaG9zdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL21vZGFsL2NvbXBvbmVudHMvbW9kYWwtaG9zdC9tb2RhbC1ob3N0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvY29tcG9uZW50cy9tb2RhbC1ob3N0L21vZGFsLWhvc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRTFEOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLGtCQUFrQjtJQUNaLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFckQ7O09BRUc7SUFDTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFFakQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLEVBQVU7UUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsQ0FBQzt3R0FkVSxrQkFBa0I7NEZBQWxCLGtCQUFrQiwwRUNsQi9CLHFJQUdBLGtGRFlZLFlBQVksK0JBQUUsY0FBYzs7NEZBRzNCLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDRSxnQkFBZ0IsV0FHakIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLG1CQUN0Qix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kYWwuc2VydmljZSc7XG5pbXBvcnQgeyBNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFsL21vZGFsLmNvbXBvbmVudCc7XG5cbi8qKlxuICogSG9zdHMgYW5kIHJlbmRlcnMgYWxsIGFjdGl2ZSBtb2RhbHMuXG4gKlxuICogVGhlIGhvc3QgbGlzdGVucyBmb3IgY2xvc2UgZXZlbnRzIGZyb20gZWFjaCBtb2RhbCBpbnN0YW5jZSBhbmRcbiAqIGZvcndhcmRzIHRoZW0gdG8gdGhlIG1vZGFsIHNlcnZpY2UsIHdoaWNoIG93bnMgbW9kYWwgbGlmZWN5Y2xlLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YWUtbW9kYWwtaG9zdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC1ob3N0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kYWwtaG9zdC5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNb2RhbENvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbEhvc3RDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZSA9IGluamVjdChNb2RhbFNlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgYWN0aXZlIG1vZGFscyBrZXllZCBieSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGFsc1NpZ25hbCA9IHRoaXMubW9kYWxTZXJ2aWNlLm1vZGFscztcblxuICAvKipcbiAgICogSGFuZGxlcyBjbG9zZSBldmVudHMgZnJvbSBjaGlsZCBtb2RhbCBjb21wb25lbnRzLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQgdGhhdCBlbWl0dGVkIHRoZSBjbG9zZSBldmVudC5cbiAgICovXG4gIGhhbmRsZUNsb3NlZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbFNlcnZpY2UuY2xvc2UoaWQpO1xuICB9XG59XG4iLCJAZm9yIChtb2RhbCBvZiBtb2RhbHNTaWduYWwoKS52YWx1ZXMoKTsgdHJhY2sgbW9kYWwuaWQpIHtcbiAgPHRhZS1tb2RhbCBbbW9kYWxdPVwibW9kYWxcIiAoY2xvc2VkKT1cImhhbmRsZUNsb3NlZCgkZXZlbnQpXCIgLz5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { DestroyRef, Directive, effect, inject, input, untracked, ViewContainerRef, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Dynamically renders an Angular component and wires its signal inputs/outputs.
|
|
5
|
+
*
|
|
6
|
+
* This directive:
|
|
7
|
+
* - Creates/destroys the component when the type changes.
|
|
8
|
+
* - Applies inputs via `setInput`.
|
|
9
|
+
* - Subscribes to outputs and forwards emitted values to handlers.
|
|
10
|
+
* - Cleans subscriptions and the component instance on destroy.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```html
|
|
14
|
+
* <ng-container
|
|
15
|
+
* taeDynamicComponent
|
|
16
|
+
* [component]="MyComponent"
|
|
17
|
+
* [inputs]="{ name: 'John', age: 25 }"
|
|
18
|
+
* [outputs]="{ submitted: (data) => handleSubmit(data) }"
|
|
19
|
+
* />
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export class DynamicComponentDirective {
|
|
23
|
+
component = input.required();
|
|
24
|
+
inputs = input();
|
|
25
|
+
outputs = input();
|
|
26
|
+
viewContainer = inject(ViewContainerRef);
|
|
27
|
+
destroyRef = inject(DestroyRef);
|
|
28
|
+
// Current component instance reference managed by this directive.
|
|
29
|
+
componentRef;
|
|
30
|
+
outputSubscriptions = new Set();
|
|
31
|
+
constructor() {
|
|
32
|
+
// Recreate the component whenever the type changes.
|
|
33
|
+
effect(() => {
|
|
34
|
+
const componentType = this.component();
|
|
35
|
+
untracked(() => {
|
|
36
|
+
this.destroyComponent();
|
|
37
|
+
this.createComponent(componentType);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
// Apply new inputs whenever the `inputs` signal changes.
|
|
41
|
+
effect(() => {
|
|
42
|
+
const inputsValue = this.inputs();
|
|
43
|
+
if (inputsValue && this.componentRef) {
|
|
44
|
+
untracked(() => this.applyInputs(inputsValue));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// Ensure cleanup if the host view is destroyed.
|
|
48
|
+
this.destroyRef.onDestroy(() => this.destroyComponent());
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates the component and wires initial inputs/outputs.
|
|
52
|
+
* @param componentType Component type to instantiate.
|
|
53
|
+
*/
|
|
54
|
+
createComponent(componentType) {
|
|
55
|
+
this.viewContainer.clear();
|
|
56
|
+
this.componentRef = this.viewContainer.createComponent(componentType);
|
|
57
|
+
const inputsValue = this.inputs();
|
|
58
|
+
if (inputsValue) {
|
|
59
|
+
this.applyInputs(inputsValue);
|
|
60
|
+
}
|
|
61
|
+
const outputsValue = this.outputs();
|
|
62
|
+
if (outputsValue) {
|
|
63
|
+
this.subscribeToOutputs(outputsValue);
|
|
64
|
+
}
|
|
65
|
+
this.componentRef.changeDetectorRef.detectChanges();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Applies input values to the component instance using `setInput`.
|
|
69
|
+
* @param inputs Input values keyed by input name.
|
|
70
|
+
*/
|
|
71
|
+
applyInputs(inputs) {
|
|
72
|
+
if (!this.componentRef)
|
|
73
|
+
return;
|
|
74
|
+
Object.entries(inputs).forEach(([key, value]) => {
|
|
75
|
+
this.componentRef?.setInput(key, value);
|
|
76
|
+
});
|
|
77
|
+
this.componentRef.changeDetectorRef.markForCheck();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Subscribes to output signal emitters and forwards values to handlers.
|
|
81
|
+
* @param outputs Output handler map keyed by output name.
|
|
82
|
+
*/
|
|
83
|
+
subscribeToOutputs(outputs) {
|
|
84
|
+
if (!this.componentRef)
|
|
85
|
+
return;
|
|
86
|
+
// Clear previous subscriptions before wiring new outputs.
|
|
87
|
+
this.clearOutputSubscriptions();
|
|
88
|
+
const instance = this.componentRef.instance;
|
|
89
|
+
Object.entries(outputs).forEach(([key, handler]) => {
|
|
90
|
+
if (typeof handler !== 'function')
|
|
91
|
+
return;
|
|
92
|
+
const output = instance[key];
|
|
93
|
+
// Subscribe to the output signal emitter if present.
|
|
94
|
+
if (this.isOutputEmitterRef(output)) {
|
|
95
|
+
const subscription = output.subscribe((value) => handler(value));
|
|
96
|
+
this.outputSubscriptions.add(subscription);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Clears all output subscriptions.
|
|
102
|
+
*/
|
|
103
|
+
clearOutputSubscriptions() {
|
|
104
|
+
this.outputSubscriptions.forEach((sub) => sub.unsubscribe());
|
|
105
|
+
this.outputSubscriptions.clear();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Destroys the dynamic component and cleans subscriptions.
|
|
109
|
+
*/
|
|
110
|
+
destroyComponent() {
|
|
111
|
+
this.clearOutputSubscriptions();
|
|
112
|
+
this.componentRef?.destroy();
|
|
113
|
+
this.componentRef = undefined;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Type guard for Angular signal output emitters.
|
|
117
|
+
* @param value Value to test.
|
|
118
|
+
*/
|
|
119
|
+
isOutputEmitterRef(value) {
|
|
120
|
+
return (typeof value === 'object' &&
|
|
121
|
+
value !== null &&
|
|
122
|
+
'subscribe' in value &&
|
|
123
|
+
typeof value['subscribe'] === 'function');
|
|
124
|
+
}
|
|
125
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DynamicComponentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
126
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.17", type: DynamicComponentDirective, isStandalone: true, selector: "[taeDynamicComponent]", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, inputs: { classPropertyName: "inputs", publicName: "inputs", isSignal: true, isRequired: false, transformFunction: null }, outputs: { classPropertyName: "outputs", publicName: "outputs", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
127
|
+
}
|
|
128
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: DynamicComponentDirective, decorators: [{
|
|
129
|
+
type: Directive,
|
|
130
|
+
args: [{
|
|
131
|
+
selector: '[taeDynamicComponent]',
|
|
132
|
+
standalone: true,
|
|
133
|
+
}]
|
|
134
|
+
}], ctorParameters: () => [] });
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1jb21wb25lbnQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9tb2RhbC9kaXJlY3RpdmVzL2R5bmFtaWMtY29tcG9uZW50LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsVUFBVSxFQUNWLFNBQVMsRUFDVCxNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFJTCxTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDOztBQU12Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBS0gsTUFBTSxPQUFPLHlCQUF5QjtJQUMzQixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVyxDQUFDO0lBQ3RDLE1BQU0sR0FBRyxLQUFLLEVBQXNCLENBQUM7SUFDckMsT0FBTyxHQUFHLEtBQUssRUFBdUIsQ0FBQztJQUUvQixhQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCxrRUFBa0U7SUFDMUQsWUFBWSxDQUFtQjtJQUN0QixtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUV4RTtRQUNFLG9EQUFvRDtRQUNwRCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXZDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1Ys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Q0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0JBQWtCLENBQ3hCLEtBQWM7UUFFZCxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN6QixLQUFLLEtBQUssSUFBSTtZQUNkLFdBQVcsSUFBSSxLQUFLO1lBQ3BCLE9BQVEsS0FBaUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxVQUFVLENBQ3RFLENBQUM7SUFDSixDQUFDO3dHQWhJVSx5QkFBeUI7NEZBQXpCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFKckMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPdXRwdXRFbWl0dGVyUmVmLFxuICBPdXRwdXRSZWZTdWJzY3JpcHRpb24sXG4gIFR5cGUsXG4gIHVudHJhY2tlZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRJbnB1dHMsXG4gIENvbXBvbmVudE91dHB1dHMsXG59IGZyb20gJy4uLy4uL3V0aWxzL2FuZ3VsYXItY29tcG9uZW50LWlvJztcblxuLyoqXG4gKiBEeW5hbWljYWxseSByZW5kZXJzIGFuIEFuZ3VsYXIgY29tcG9uZW50IGFuZCB3aXJlcyBpdHMgc2lnbmFsIGlucHV0cy9vdXRwdXRzLlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlOlxuICogLSBDcmVhdGVzL2Rlc3Ryb3lzIHRoZSBjb21wb25lbnQgd2hlbiB0aGUgdHlwZSBjaGFuZ2VzLlxuICogLSBBcHBsaWVzIGlucHV0cyB2aWEgYHNldElucHV0YC5cbiAqIC0gU3Vic2NyaWJlcyB0byBvdXRwdXRzIGFuZCBmb3J3YXJkcyBlbWl0dGVkIHZhbHVlcyB0byBoYW5kbGVycy5cbiAqIC0gQ2xlYW5zIHN1YnNjcmlwdGlvbnMgYW5kIHRoZSBjb21wb25lbnQgaW5zdGFuY2Ugb24gZGVzdHJveS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPG5nLWNvbnRhaW5lclxuICogICB0YWVEeW5hbWljQ29tcG9uZW50XG4gKiAgIFtjb21wb25lbnRdPVwiTXlDb21wb25lbnRcIlxuICogICBbaW5wdXRzXT1cInsgbmFtZTogJ0pvaG4nLCBhZ2U6IDI1IH1cIlxuICogICBbb3V0cHV0c109XCJ7IHN1Ym1pdHRlZDogKGRhdGEpID0+IGhhbmRsZVN1Ym1pdChkYXRhKSB9XCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RhZUR5bmFtaWNDb21wb25lbnRdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRHluYW1pY0NvbXBvbmVudERpcmVjdGl2ZTxUPiB7XG4gIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFR5cGU8VD4+KCk7XG4gIHJlYWRvbmx5IGlucHV0cyA9IGlucHV0PENvbXBvbmVudElucHV0czxUPj4oKTtcbiAgcmVhZG9ubHkgb3V0cHV0cyA9IGlucHV0PENvbXBvbmVudE91dHB1dHM8VD4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgLy8gQ3VycmVudCBjb21wb25lbnQgaW5zdGFuY2UgcmVmZXJlbmNlIG1hbmFnZWQgYnkgdGhpcyBkaXJlY3RpdmUuXG4gIHByaXZhdGUgY29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPFQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dFN1YnNjcmlwdGlvbnMgPSBuZXcgU2V0PE91dHB1dFJlZlN1YnNjcmlwdGlvbj4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBSZWNyZWF0ZSB0aGUgY29tcG9uZW50IHdoZW5ldmVyIHRoZSB0eXBlIGNoYW5nZXMuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSB0aGlzLmNvbXBvbmVudCgpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRlc3Ryb3lDb21wb25lbnQoKTtcbiAgICAgICAgdGhpcy5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEFwcGx5IG5ldyBpbnB1dHMgd2hlbmV2ZXIgdGhlIGBpbnB1dHNgIHNpZ25hbCBjaGFuZ2VzLlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dHNWYWx1ZSA9IHRoaXMuaW5wdXRzKCk7XG5cbiAgICAgIGlmIChpbnB1dHNWYWx1ZSAmJiB0aGlzLmNvbXBvbmVudFJlZikge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5hcHBseUlucHV0cyhpbnB1dHNWYWx1ZSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRW5zdXJlIGNsZWFudXAgaWYgdGhlIGhvc3QgdmlldyBpcyBkZXN0cm95ZWQuXG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB0aGlzLmRlc3Ryb3lDb21wb25lbnQoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgY29tcG9uZW50IGFuZCB3aXJlcyBpbml0aWFsIGlucHV0cy9vdXRwdXRzLlxuICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSBDb21wb25lbnQgdHlwZSB0byBpbnN0YW50aWF0ZS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IFR5cGU8VD4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG5cbiAgICBjb25zdCBpbnB1dHNWYWx1ZSA9IHRoaXMuaW5wdXRzKCk7XG4gICAgaWYgKGlucHV0c1ZhbHVlKSB7XG4gICAgICB0aGlzLmFwcGx5SW5wdXRzKGlucHV0c1ZhbHVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRzVmFsdWUgPSB0aGlzLm91dHB1dHMoKTtcbiAgICBpZiAob3V0cHV0c1ZhbHVlKSB7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvT3V0cHV0cyhvdXRwdXRzVmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGlucHV0IHZhbHVlcyB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlIHVzaW5nIGBzZXRJbnB1dGAuXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXQgdmFsdWVzIGtleWVkIGJ5IGlucHV0IG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5SW5wdXRzKGlucHV0czogQ29tcG9uZW50SW5wdXRzPFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikgcmV0dXJuO1xuXG4gICAgT2JqZWN0LmVudHJpZXMoaW5wdXRzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmPy5zZXRJbnB1dChrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gb3V0cHV0IHNpZ25hbCBlbWl0dGVycyBhbmQgZm9yd2FyZHMgdmFsdWVzIHRvIGhhbmRsZXJzLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBPdXRwdXQgaGFuZGxlciBtYXAga2V5ZWQgYnkgb3V0cHV0IG5hbWUuXG4gICAqL1xuICBwcml2YXRlIHN1YnNjcmliZVRvT3V0cHV0cyhvdXRwdXRzOiBDb21wb25lbnRPdXRwdXRzPFQ+KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudFJlZikgcmV0dXJuO1xuXG4gICAgLy8gQ2xlYXIgcHJldmlvdXMgc3Vic2NyaXB0aW9ucyBiZWZvcmUgd2lyaW5nIG5ldyBvdXRwdXRzLlxuICAgIHRoaXMuY2xlYXJPdXRwdXRTdWJzY3JpcHRpb25zKCk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgT2JqZWN0LmVudHJpZXMob3V0cHV0cykuZm9yRWFjaCgoW2tleSwgaGFuZGxlcl0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBpbnN0YW5jZVtrZXldO1xuXG4gICAgICAvLyBTdWJzY3JpYmUgdG8gdGhlIG91dHB1dCBzaWduYWwgZW1pdHRlciBpZiBwcmVzZW50LlxuICAgICAgaWYgKHRoaXMuaXNPdXRwdXRFbWl0dGVyUmVmKG91dHB1dCkpIHtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb3V0cHV0LnN1YnNjcmliZSgodmFsdWU6IHVua25vd24pID0+XG4gICAgICAgICAgaGFuZGxlcih2YWx1ZSksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMub3V0cHV0U3Vic2NyaXB0aW9ucy5hZGQoc3Vic2NyaXB0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIG91dHB1dCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhck91dHB1dFN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRwdXRTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMub3V0cHV0U3Vic2NyaXB0aW9ucy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBkeW5hbWljIGNvbXBvbmVudCBhbmQgY2xlYW5zIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIGRlc3Ryb3lDb21wb25lbnQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhck91dHB1dFN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLmNvbXBvbmVudFJlZj8uZGVzdHJveSgpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgZ3VhcmQgZm9yIEFuZ3VsYXIgc2lnbmFsIG91dHB1dCBlbWl0dGVycy5cbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIHRlc3QuXG4gICAqL1xuICBwcml2YXRlIGlzT3V0cHV0RW1pdHRlclJlZihcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgKTogdmFsdWUgaXMgT3V0cHV0RW1pdHRlclJlZjx1bmtub3duPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAnc3Vic2NyaWJlJyBpbiB2YWx1ZSAmJlxuICAgICAgdHlwZW9mICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJ3N1YnNjcmliZSddID09PSAnZnVuY3Rpb24nXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { Injectable, inject, signal } from '@angular/core';
|
|
2
|
+
import { MODAL_CONFIG } from './schema/modal.config';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Central registry and lifecycle manager for modal instances.
|
|
6
|
+
*
|
|
7
|
+
* This service creates modals, tracks their state, and coordinates
|
|
8
|
+
* open/close/remove behavior across the application.
|
|
9
|
+
*/
|
|
10
|
+
export class ModalService {
|
|
11
|
+
/** Default modal configuration injected via `MODAL_CONFIG`. */
|
|
12
|
+
config = inject(MODAL_CONFIG);
|
|
13
|
+
/** Incrementing counter for modal id generation. */
|
|
14
|
+
id = 0;
|
|
15
|
+
/** Internal store of modals keyed by id. */
|
|
16
|
+
_modals = signal(new Map());
|
|
17
|
+
/** Read-only signal of all registered modals. */
|
|
18
|
+
modals = this._modals.asReadonly();
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new modal instance and registers it.
|
|
21
|
+
* @param options Modal options used to initialize the instance.
|
|
22
|
+
* @returns A ModalRef for controlling the instance.
|
|
23
|
+
*/
|
|
24
|
+
create(options = {}) {
|
|
25
|
+
// Create a new id and build the initial modal state.
|
|
26
|
+
const id = `modal-${++this.id}`;
|
|
27
|
+
const modal = this.buildModal(id, undefined, options);
|
|
28
|
+
// Persist to the internal store.
|
|
29
|
+
this.upsertModal(modal);
|
|
30
|
+
return {
|
|
31
|
+
id,
|
|
32
|
+
open: this.open.bind(this, id),
|
|
33
|
+
close: this.close.bind(this, id),
|
|
34
|
+
remove: this.remove.bind(this, id),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Opens a modal by id.
|
|
39
|
+
* @param id Modal id.
|
|
40
|
+
*/
|
|
41
|
+
open(id) {
|
|
42
|
+
// Set open state to true if needed.
|
|
43
|
+
this.updateModalState(id, true);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Closes a modal by id.
|
|
47
|
+
* @param id Modal id.
|
|
48
|
+
*/
|
|
49
|
+
close(id) {
|
|
50
|
+
const existing = this.getModal(id);
|
|
51
|
+
if (!existing?.isOpen)
|
|
52
|
+
return;
|
|
53
|
+
// Set open state to false and notify callbacks.
|
|
54
|
+
this.updateModalState(id, false);
|
|
55
|
+
existing.onClosed?.();
|
|
56
|
+
console.log('Modal closed:', id);
|
|
57
|
+
// Optionally remove the modal after closing.
|
|
58
|
+
if (existing.removeOnClose) {
|
|
59
|
+
this.remove(id);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Removes a modal from the registry and DOM.
|
|
64
|
+
* Closes the modal first if it is open.
|
|
65
|
+
* @param id Modal id.
|
|
66
|
+
*/
|
|
67
|
+
remove(id) {
|
|
68
|
+
const existing = this.getModal(id);
|
|
69
|
+
if (!existing)
|
|
70
|
+
return;
|
|
71
|
+
// Remove from the internal store.
|
|
72
|
+
this._modals.update((modals) => {
|
|
73
|
+
const next = new Map(modals);
|
|
74
|
+
next.delete(id);
|
|
75
|
+
return next;
|
|
76
|
+
});
|
|
77
|
+
// Fire callbacks for cleanup.
|
|
78
|
+
if (existing.isOpen) {
|
|
79
|
+
existing.onClosed?.();
|
|
80
|
+
}
|
|
81
|
+
existing.onRemoved?.();
|
|
82
|
+
console.log('Modal removed:', id);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Closes all open modals.
|
|
86
|
+
*/
|
|
87
|
+
closeAll() {
|
|
88
|
+
// Use service close to ensure removeOnClose behavior is honored.
|
|
89
|
+
this.modals().forEach((modal) => this.close(modal.id));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Removes all modals from the registry.
|
|
93
|
+
*/
|
|
94
|
+
removeAll() {
|
|
95
|
+
// Use service remove to ensure callbacks are fired.
|
|
96
|
+
this.modals().forEach((modal) => this.remove(modal.id));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Looks up a modal by id.
|
|
100
|
+
* @param id Modal id.
|
|
101
|
+
*/
|
|
102
|
+
getModal(id) {
|
|
103
|
+
return this._modals().get(id);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Updates the open/closed state of a modal if it exists.
|
|
107
|
+
* @param id Modal id.
|
|
108
|
+
* @param isOpen Desired open state.
|
|
109
|
+
*/
|
|
110
|
+
updateModalState(id, isOpen) {
|
|
111
|
+
const existing = this.getModal(id);
|
|
112
|
+
if (!existing || existing.isOpen === isOpen)
|
|
113
|
+
return;
|
|
114
|
+
// Rebuild the modal with the new open state.
|
|
115
|
+
const updated = this.buildModal(id, existing, {}, isOpen);
|
|
116
|
+
this.upsertModal(updated);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Inserts or replaces a modal in the internal store.
|
|
120
|
+
* @param modal Modal to upsert.
|
|
121
|
+
*/
|
|
122
|
+
upsertModal(modal) {
|
|
123
|
+
this._modals.update((modals) => new Map(modals).set(modal.id, modal));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Builds a modal instance by merging defaults, existing state, and options.
|
|
127
|
+
* @param id Modal id.
|
|
128
|
+
* @param existing Existing modal state (if any).
|
|
129
|
+
* @param options New options to apply.
|
|
130
|
+
* @param isOpen Optional override for open state.
|
|
131
|
+
*/
|
|
132
|
+
buildModal(id, existing, options, isOpen) {
|
|
133
|
+
// Resolve initial open state from the override, options, existing state, or config.
|
|
134
|
+
const resolvedIsOpen = isOpen ??
|
|
135
|
+
options.startOpen ??
|
|
136
|
+
existing?.startOpen ??
|
|
137
|
+
this.config.startOpen;
|
|
138
|
+
// Merge config defaults, existing values, and new options.
|
|
139
|
+
return {
|
|
140
|
+
...this.config,
|
|
141
|
+
...existing,
|
|
142
|
+
...options,
|
|
143
|
+
id,
|
|
144
|
+
isOpen: resolvedIsOpen,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
148
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, providedIn: 'root' });
|
|
149
|
+
}
|
|
150
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: ModalService, decorators: [{
|
|
151
|
+
type: Injectable,
|
|
152
|
+
args: [{
|
|
153
|
+
providedIn: 'root',
|
|
154
|
+
}]
|
|
155
|
+
}] });
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvbW9kYWwvbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLFlBQVksRUFBZSxNQUFNLHVCQUF1QixDQUFDOztBQUdsRTs7Ozs7R0FLRztBQUlILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCLCtEQUErRDtJQUM5QyxNQUFNLEdBQUcsTUFBTSxDQUFjLFlBQVksQ0FBQyxDQUFDO0lBRTVELG9EQUFvRDtJQUM1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsNENBQTRDO0lBQzNCLE9BQU8sR0FBRyxNQUFNLENBQXFCLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVqRSxpREFBaUQ7SUFDeEMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7SUFFNUM7Ozs7T0FJRztJQUNILE1BQU0sQ0FBSSxVQUEyQixFQUFFO1FBQ3JDLHFEQUFxRDtRQUNyRCxNQUFNLEVBQUUsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QixPQUFPO1lBQ0wsRUFBRTtZQUNGLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQzlCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FB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Q0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFdBQVcsQ0FBQyxLQUFZO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxVQUFVLENBQ2hCLEVBQVUsRUFDVixRQUEyQixFQUMzQixPQUFxQixFQUNyQixNQUFnQjtRQUVoQixvRkFBb0Y7UUFDcEYsTUFBTSxjQUFjLEdBQ2xCLE1BQU07WUFDTixPQUFPLENBQUMsU0FBUztZQUNqQixRQUFRLEVBQUUsU0FBUztZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUV4QiwyREFBMkQ7UUFDM0QsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLE1BQU07WUFDZCxHQUFHLFFBQVE7WUFDWCxHQUFHLE9BQU87WUFDVixFQUFFO1lBQ0YsTUFBTSxFQUFFLGNBQWM7U0FDdkIsQ0FBQztJQUNKLENBQUM7d0dBOUpVLFlBQVk7NEdBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsUmVmIH0gZnJvbSAnLi9zY2hlbWEvbW9kYWwtcmVmJztcbmltcG9ydCB7IE1PREFMX0NPTkZJRywgTW9kYWxDb25maWcgfSBmcm9tICcuL3NjaGVtYS9tb2RhbC5jb25maWcnO1xuaW1wb3J0IHsgTW9kYWwsIE1vZGFsT3B0aW9ucyB9IGZyb20gJy4vc2NoZW1hL21vZGFsLm1vZGVsJztcblxuLyoqXG4gKiBDZW50cmFsIHJlZ2lzdHJ5IGFuZCBsaWZlY3ljbGUgbWFuYWdlciBmb3IgbW9kYWwgaW5zdGFuY2VzLlxuICpcbiAqIFRoaXMgc2VydmljZSBjcmVhdGVzIG1vZGFscywgdHJhY2tzIHRoZWlyIHN0YXRlLCBhbmQgY29vcmRpbmF0ZXNcbiAqIG9wZW4vY2xvc2UvcmVtb3ZlIGJlaGF2aW9yIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbFNlcnZpY2Uge1xuICAvKiogRGVmYXVsdCBtb2RhbCBjb25maWd1cmF0aW9uIGluamVjdGVkIHZpYSBgTU9EQUxfQ09ORklHYC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3Q8TW9kYWxDb25maWc+KE1PREFMX0NPTkZJRyk7XG5cbiAgLyoqIEluY3JlbWVudGluZyBjb3VudGVyIGZvciBtb2RhbCBpZCBnZW5lcmF0aW9uLiAqL1xuICBwcml2YXRlIGlkID0gMDtcbiAgLyoqIEludGVybmFsIHN0b3JlIG9mIG1vZGFscyBrZXllZCBieSBpZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbW9kYWxzID0gc2lnbmFsPE1hcDxzdHJpbmcsIE1vZGFsPj4obmV3IE1hcCgpKTtcblxuICAvKiogUmVhZC1vbmx5IHNpZ25hbCBvZiBhbGwgcmVnaXN0ZXJlZCBtb2RhbHMuICovXG4gIHJlYWRvbmx5IG1vZGFscyA9IHRoaXMuX21vZGFscy5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbW9kYWwgaW5zdGFuY2UgYW5kIHJlZ2lzdGVycyBpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgTW9kYWwgb3B0aW9ucyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIE1vZGFsUmVmIGZvciBjb250cm9sbGluZyB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBjcmVhdGU8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBNb2RhbFJlZiB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGlkIGFuZCBidWlsZCB0aGUgaW5pdGlhbCBtb2RhbCBzdGF0ZS5cbiAgICBjb25zdCBpZCA9IGBtb2RhbC0keysrdGhpcy5pZH1gO1xuICAgIGNvbnN0IG1vZGFsID0gdGhpcy5idWlsZE1vZGFsKGlkLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIC8vIFBlcnNpc3QgdG8gdGhlIGludGVybmFsIHN0b3JlLlxuICAgIHRoaXMudXBzZXJ0TW9kYWwobW9kYWwpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkLFxuICAgICAgb3BlbjogdGhpcy5vcGVuLmJpbmQodGhpcywgaWQpLFxuICAgICAgY2xvc2U6IHRoaXMuY2xvc2UuYmluZCh0aGlzLCBpZCksXG4gICAgICByZW1vdmU6IHRoaXMucmVtb3ZlLmJpbmQodGhpcywgaWQpLFxuICAgIH0gc2F0aXNmaWVzIE1vZGFsUmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgbW9kYWwgYnkgaWQuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICovXG4gIG9wZW4oaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFNldCBvcGVuIHN0YXRlIHRvIHRydWUgaWYgbmVlZGVkLlxuICAgIHRoaXMudXBkYXRlTW9kYWxTdGF0ZShpZCwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGEgbW9kYWwgYnkgaWQuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICovXG4gIGNsb3NlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0TW9kYWwoaWQpO1xuICAgIGlmICghZXhpc3Rpbmc/LmlzT3BlbikgcmV0dXJuO1xuXG4gICAgLy8gU2V0IG9wZW4gc3RhdGUgdG8gZmFsc2UgYW5kIG5vdGlmeSBjYWxsYmFja3MuXG4gICAgdGhpcy51cGRhdGVNb2RhbFN0YXRlKGlkLCBmYWxzZSk7XG4gICAgZXhpc3Rpbmcub25DbG9zZWQ/LigpO1xuICAgIGNvbnNvbGUubG9nKCdNb2RhbCBjbG9zZWQ6JywgaWQpO1xuXG4gICAgLy8gT3B0aW9uYWxseSByZW1vdmUgdGhlIG1vZGFsIGFmdGVyIGNsb3NpbmcuXG4gICAgaWYgKGV4aXN0aW5nLnJlbW92ZU9uQ2xvc2UpIHtcbiAgICAgIHRoaXMucmVtb3ZlKGlkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIG1vZGFsIGZyb20gdGhlIHJlZ2lzdHJ5IGFuZCBET00uXG4gICAqIENsb3NlcyB0aGUgbW9kYWwgZmlyc3QgaWYgaXQgaXMgb3Blbi5cbiAgICogQHBhcmFtIGlkIE1vZGFsIGlkLlxuICAgKi9cbiAgcmVtb3ZlKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0TW9kYWwoaWQpO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSBmcm9tIHRoZSBpbnRlcm5hbCBzdG9yZS5cbiAgICB0aGlzLl9tb2RhbHMudXBkYXRlKChtb2RhbHMpID0+IHtcbiAgICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwKG1vZGFscyk7XG4gICAgICBuZXh0LmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcblxuICAgIC8vIEZpcmUgY2FsbGJhY2tzIGZvciBjbGVhbnVwLlxuICAgIGlmIChleGlzdGluZy5pc09wZW4pIHtcbiAgICAgIGV4aXN0aW5nLm9uQ2xvc2VkPy4oKTtcbiAgICB9XG4gICAgZXhpc3Rpbmcub25SZW1vdmVkPy4oKTtcbiAgICBjb25zb2xlLmxvZygnTW9kYWwgcmVtb3ZlZDonLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBvcGVuIG1vZGFscy5cbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIC8vIFVzZSBzZXJ2aWNlIGNsb3NlIHRvIGVuc3VyZSByZW1vdmVPbkNsb3NlIGJlaGF2aW9yIGlzIGhvbm9yZWQuXG4gICAgdGhpcy5tb2RhbHMoKS5mb3JFYWNoKChtb2RhbCkgPT4gdGhpcy5jbG9zZShtb2RhbC5pZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYWxsIG1vZGFscyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICovXG4gIHJlbW92ZUFsbCgpOiB2b2lkIHtcbiAgICAvLyBVc2Ugc2VydmljZSByZW1vdmUgdG8gZW5zdXJlIGNhbGxiYWNrcyBhcmUgZmlyZWQuXG4gICAgdGhpcy5tb2RhbHMoKS5mb3JFYWNoKChtb2RhbCkgPT4gdGhpcy5yZW1vdmUobW9kYWwuaWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rcyB1cCBhIG1vZGFsIGJ5IGlkLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQuXG4gICAqL1xuICBwcml2YXRlIGdldE1vZGFsKGlkOiBzdHJpbmcpOiBNb2RhbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGFscygpLmdldChpZCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgb3Blbi9jbG9zZWQgc3RhdGUgb2YgYSBtb2RhbCBpZiBpdCBleGlzdHMuXG4gICAqIEBwYXJhbSBpZCBNb2RhbCBpZC5cbiAgICogQHBhcmFtIGlzT3BlbiBEZXNpcmVkIG9wZW4gc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZU1vZGFsU3RhdGUoaWQ6IHN0cmluZywgaXNPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldE1vZGFsKGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nIHx8IGV4aXN0aW5nLmlzT3BlbiA9PT0gaXNPcGVuKSByZXR1cm47XG5cbiAgICAvLyBSZWJ1aWxkIHRoZSBtb2RhbCB3aXRoIHRoZSBuZXcgb3BlbiBzdGF0ZS5cbiAgICBjb25zdCB1cGRhdGVkID0gdGhpcy5idWlsZE1vZGFsKGlkLCBleGlzdGluZywge30sIGlzT3Blbik7XG4gICAgdGhpcy51cHNlcnRNb2RhbCh1cGRhdGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnRzIG9yIHJlcGxhY2VzIGEgbW9kYWwgaW4gdGhlIGludGVybmFsIHN0b3JlLlxuICAgKiBAcGFyYW0gbW9kYWwgTW9kYWwgdG8gdXBzZXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSB1cHNlcnRNb2RhbChtb2RhbDogTW9kYWwpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbHMudXBkYXRlKChtb2RhbHMpID0+IG5ldyBNYXAobW9kYWxzKS5zZXQobW9kYWwuaWQsIG1vZGFsKSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgbW9kYWwgaW5zdGFuY2UgYnkgbWVyZ2luZyBkZWZhdWx0cywgZXhpc3Rpbmcgc3RhdGUsIGFuZCBvcHRpb25zLlxuICAgKiBAcGFyYW0gaWQgTW9kYWwgaWQuXG4gICAqIEBwYXJhbSBleGlzdGluZyBFeGlzdGluZyBtb2RhbCBzdGF0ZSAoaWYgYW55KS5cbiAgICogQHBhcmFtIG9wdGlvbnMgTmV3IG9wdGlvbnMgdG8gYXBwbHkuXG4gICAqIEBwYXJhbSBpc09wZW4gT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIG9wZW4gc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTW9kYWwoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBleGlzdGluZzogTW9kYWwgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogTW9kYWxPcHRpb25zLFxuICAgIGlzT3Blbj86IGJvb2xlYW4sXG4gICk6IE1vZGFsIHtcbiAgICAvLyBSZXNvbHZlIGluaXRpYWwgb3BlbiBzdGF0ZSBmcm9tIHRoZSBvdmVycmlkZSwgb3B0aW9ucywgZXhpc3Rpbmcgc3RhdGUsIG9yIGNvbmZpZy5cbiAgICBjb25zdCByZXNvbHZlZElzT3BlbiA9XG4gICAgICBpc09wZW4gPz9cbiAgICAgIG9wdGlvbnMuc3RhcnRPcGVuID8/XG4gICAgICBleGlzdGluZz8uc3RhcnRPcGVuID8/XG4gICAgICB0aGlzLmNvbmZpZy5zdGFydE9wZW47XG5cbiAgICAvLyBNZXJnZSBjb25maWcgZGVmYXVsdHMsIGV4aXN0aW5nIHZhbHVlcywgYW5kIG5ldyBvcHRpb25zLlxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGlkLFxuICAgICAgaXNPcGVuOiByZXNvbHZlZElzT3BlbixcbiAgICB9O1xuICB9XG59XG4iXX0=
|