@bravobit/bb-foundation 0.50.7 → 0.50.9
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/dialog/lib/dialog-modal/dialog-modal.component.d.ts +3 -1
- package/fesm2022/bravobit-bb-foundation-collections.mjs +2 -2
- package/fesm2022/bravobit-bb-foundation-collections.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-dialog.mjs +12 -7
- package/fesm2022/bravobit-bb-foundation-dialog.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-elements.mjs +16 -16
- package/fesm2022/bravobit-bb-foundation-elements.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-notifications.mjs +8 -13
- package/fesm2022/bravobit-bb-foundation-notifications.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-permissions.mjs +7 -11
- package/fesm2022/bravobit-bb-foundation-permissions.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-recaptcha.mjs +12 -28
- package/fesm2022/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-select.mjs +19 -27
- package/fesm2022/bravobit-bb-foundation-select.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-storage.mjs +8 -14
- package/fesm2022/bravobit-bb-foundation-storage.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-table.mjs +4 -4
- package/fesm2022/bravobit-bb-foundation-table.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation-utils.mjs +22 -36
- package/fesm2022/bravobit-bb-foundation-utils.mjs.map +1 -1
- package/fesm2022/bravobit-bb-foundation.mjs +31 -69
- package/fesm2022/bravobit-bb-foundation.mjs.map +1 -1
- package/lib/core/services/exif.service.d.ts +2 -5
- package/lib/core/services/image-converter.service.d.ts +3 -7
- package/lib/core/services/languages.service.d.ts +3 -3
- package/lib/core/services/network.service.d.ts +5 -6
- package/lib/core/services/patch.service.d.ts +4 -6
- package/localize/lib/transforms/interpolate.transform.d.ts +1 -1
- package/localize/lib/transforms/reference.transform.d.ts +1 -1
- package/notifications/lib/notifications-item/notifications-item.component.d.ts +4 -6
- package/package.json +21 -21
- package/permissions/lib/directives/permission.directive.d.ts +4 -6
- package/recaptcha/lib/recaptcha/recaptcha.component.d.ts +10 -14
- package/select/lib/select-label.directive.d.ts +0 -1
- package/select/lib/select-multi-label.directive.d.ts +0 -1
- package/select/lib/select-option-group.directive.d.ts +0 -1
- package/select/lib/select-option.directive.d.ts +0 -1
- package/storage/lib/storage.service.d.ts +4 -5
- package/styles/theme.scss +29 -14
- package/utils/lib/directives/autosize.directive.d.ts +3 -4
- package/utils/lib/directives/focus-trap.directive.d.ts +2 -5
- package/utils/lib/directives/focus.directive.d.ts +4 -6
- package/utils/lib/directives/template.directive.d.ts +3 -4
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, ViewChild, HostBinding, ApplicationRef, EnvironmentInjector, createEnvironmentInjector, createComponent, Injectable, makeEnvironmentProviders, NgModule } from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, NgZone, ChangeDetectorRef, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, ViewChild, HostBinding, ApplicationRef, EnvironmentInjector, createEnvironmentInjector, createComponent, Injectable, makeEnvironmentProviders, NgModule } from '@angular/core';
|
|
3
3
|
import { BbLocalize, Localize } from '@bravobit/bb-foundation/localize';
|
|
4
4
|
import { BbTemplate } from '@bravobit/bb-foundation/utils';
|
|
5
|
-
import { WINDOW } from '@bravobit/bb-foundation';
|
|
6
|
-
import * as i1 from '@angular/cdk/platform';
|
|
7
5
|
import { Platform } from '@angular/cdk/platform';
|
|
6
|
+
import { WINDOW } from '@bravobit/bb-foundation';
|
|
8
7
|
import { trigger, transition, query, style, animate } from '@angular/animations';
|
|
9
8
|
import { AsyncPipe, DOCUMENT } from '@angular/common';
|
|
10
9
|
import { map } from 'rxjs/operators';
|
|
@@ -29,9 +28,10 @@ const NOTIFICATIONS_DATA = new InjectionToken('notifications data');
|
|
|
29
28
|
const NOTIFICATIONS_CONFIG = new InjectionToken('notifications config');
|
|
30
29
|
|
|
31
30
|
class BbNotificationsItem {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
// Dependencies.
|
|
32
|
+
_zone = inject(NgZone);
|
|
33
|
+
_platform = inject(Platform);
|
|
34
|
+
_changeDetection = inject(ChangeDetectorRef);
|
|
35
35
|
// Dependencies.
|
|
36
36
|
_config = inject(NotificationsConfig, { optional: true });
|
|
37
37
|
_window = inject(WINDOW, { optional: true });
|
|
@@ -56,11 +56,6 @@ class BbNotificationsItem {
|
|
|
56
56
|
get getClass() {
|
|
57
57
|
return `bb-notifications-item ${this.notification.type}`;
|
|
58
58
|
}
|
|
59
|
-
constructor(_zone, _platform, _changeDetection) {
|
|
60
|
-
this._zone = _zone;
|
|
61
|
-
this._platform = _platform;
|
|
62
|
-
this._changeDetection = _changeDetection;
|
|
63
|
-
}
|
|
64
59
|
get progressStrokeArray() {
|
|
65
60
|
const value = Math.floor(this._circumference);
|
|
66
61
|
return `${value}, ${value}`;
|
|
@@ -105,13 +100,13 @@ class BbNotificationsItem {
|
|
|
105
100
|
}
|
|
106
101
|
return this._window.setTimeout(method, timeout);
|
|
107
102
|
}
|
|
108
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: BbNotificationsItem, deps: [
|
|
103
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: BbNotificationsItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
109
104
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.4", type: BbNotificationsItem, isStandalone: true, selector: "bb-notifications-item", inputs: { notification: "notification" }, host: { attributes: { "role": "alert" }, properties: { "class": "this.getClass" } }, viewQueries: [{ propertyName: "progressElementRef", first: true, predicate: ["progress"], descendants: true }], ngImport: i0, template: "<div class=\"notification-content-wrapper\">\n <div [style.color]=\"notification?.color\"\n [style.background-color]=\"notification?.backgroundColor\"\n class=\"notification-icon-wrapper\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 20\"\n class=\"notification-icon\">\n <path\n d=\"M8 20c1.1 0 2-.923 2-2.051H6C6 19.077 6.9 20 8 20Zm6-6.154V8.718c0-3.18-1.6-5.744-4.5-6.462v-.718C9.5.718 8.8 0 8 0S6.5.718 6.5 1.538v.718C3.6 2.974 2 5.538 2 8.718v5.128l-2 2.051v1.026h16v-1.026l-2-2.05Z\">\n </path>\n </svg>\n\n @if (notification?.timeout > 0) {\n <svg class=\"notification-progress-ring\"\n viewBox=\"0 0 40 40\"\n role=\"progressbar\">\n <circle #progress\n [attr.stroke-dasharray]=\"progressStrokeArray\"\n [attr.stroke-dashoffset]=\"progressStrokeOffset\"\n [style.stroke]=\"notification?.color\"\n class=\"notification-progress-circle\"\n stroke-width=\"2\"\n fill=\"transparent\"\n r=\"19\"\n cx=\"20\"\n cy=\"20\">\n </circle>\n </svg>\n }\n </div>\n\n <div class=\"notification-content\">\n <ng-template [bbTemplate]=\"notification?.content\">\n @if (notification?.localize) {\n {{ $any(notification?.content) | bbLocalize }}\n } @else {\n {{ notification?.content }}\n }\n </ng-template>\n </div>\n</div>\n\n@if (notification?.actions?.length > 0 || notification?.dismiss) {\n <div class=\"notification-actions\">\n @for (action of notification?.actions; track $index) {\n <button [class.destructive]=\"action?.type === 'cancel'\"\n (click)=\"callActionAndDestroy(notification, action)\"\n type=\"button\"\n class=\"notification-actions-button\">\n <span class=\"notification-actions-button-highlight\">\n @if (notification?.localize) {\n {{ action?.title | bbLocalize }}\n } @else {\n {{ action?.title }}\n }\n </span>\n </button>\n }\n @if (notification?.dismiss) {\n <button (click)=\"notification?.destroy()\"\n class=\"notification-actions-button destructive\"\n type=\"button\">\n <span\n class=\"notification-actions-button-highlight\">{{ notification?.dismissText ?? dismissText }}</span>\n </button>\n }\n </div>\n}\n", styles: [".bb-notifications-item{top:0;left:0;width:100%;display:flex;position:absolute;pointer-events:all;border-radius:.5rem;flex-direction:column;background-color:#fff;box-shadow:0 .375rem .375rem -.375rem #00000026;border:1px solid rgb(214.3982142857,218.6677857143,224.1017857143);transition:margin-top .25s cubic-bezier(0,0,.2,1),transform .25s cubic-bezier(0,0,.2,1)}.bb-notifications-item.success .notification-icon-wrapper{color:#2dc05d;background-color:#ebfaf0}.bb-notifications-item.success .notification-progress-circle{stroke:#36d068}.bb-notifications-item.error .notification-icon-wrapper{color:#f43e3e;background-color:#feeeee}.bb-notifications-item.error .notification-progress-circle{stroke:#f55656}.bb-notifications-item.warning .notification-icon-wrapper{color:#f1ae00;background-color:#fff8e7}.bb-notifications-item.warning .notification-progress-circle{stroke:#ffbc0b}.bb-notifications-item.info .notification-icon-wrapper{color:#099bf6;background-color:#e9f6fe}.bb-notifications-item.info .notification-progress-circle{stroke:#22a5f7}.bb-notifications-item.custom .notification-icon-wrapper{color:#657385;background-color:#f3f5f6}.bb-notifications-item.custom .notification-progress-circle{stroke:#657385}.notification-content-wrapper{gap:.75rem;display:flex;padding:.75rem;align-items:center}.notification-icon-wrapper{width:2rem;height:2rem;display:flex;-webkit-user-select:none;user-select:none;position:relative;border-radius:50%;align-items:center;justify-content:center;color:#657385;background-color:#f3f5f6}.notification-icon{width:100%;height:100%;padding:.5rem;fill:currentColor}.notification-content{flex:1;font-weight:400;line-height:1.8;font-size:.875rem;color:#121212}.notification-content,.notification-actions-button{font-family:inherit}.notification-actions{display:flex;margin:0 1.5rem;-webkit-user-select:none;user-select:none;border-top:1px solid rgb(243.3589285714,244.5830714286,246.1410714286)}.notification-actions-button{flex:1;border:none;color:#22a5f7;cursor:pointer;font-weight:500;text-align:center;font-size:.875rem;padding:.75rem .125rem;background-color:transparent}.notification-actions-button:hover>.notification-actions-button-highlight,.notification-actions-button:focus>.notification-actions-button-highlight{background-color:#22a5f71a}.notification-actions-button:active>.notification-actions-button-highlight{background-color:#22a5f733}.notification-actions-button.destructive{color:#f55656}.notification-actions-button.destructive:hover>.notification-actions-button-highlight,.notification-actions-button.destructive:focus>.notification-actions-button-highlight{background-color:#f556561a}.notification-actions-button.destructive:active>.notification-actions-button-highlight{background-color:#f5565633}.notification-actions-button-highlight{display:inline-flex;border-radius:.75rem;padding:.25rem .75rem;transition:background-color .15s cubic-bezier(0,0,.2,1)}.notification-progress-ring{inset:0;width:100%;height:100%;position:absolute}.notification-progress-circle{transform:rotate(-90deg);transform-origin:50% 50%;stroke:#657385}\n"], dependencies: [{ kind: "pipe", type: BbLocalize, name: "bbLocalize" }, { kind: "directive", type: BbTemplate, selector: "[bbTemplate]", inputs: ["bbTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
110
105
|
}
|
|
111
106
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: BbNotificationsItem, decorators: [{
|
|
112
107
|
type: Component,
|
|
113
108
|
args: [{ selector: 'bb-notifications-item', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { 'role': 'alert' }, imports: [BbLocalize, BbTemplate], template: "<div class=\"notification-content-wrapper\">\n <div [style.color]=\"notification?.color\"\n [style.background-color]=\"notification?.backgroundColor\"\n class=\"notification-icon-wrapper\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 20\"\n class=\"notification-icon\">\n <path\n d=\"M8 20c1.1 0 2-.923 2-2.051H6C6 19.077 6.9 20 8 20Zm6-6.154V8.718c0-3.18-1.6-5.744-4.5-6.462v-.718C9.5.718 8.8 0 8 0S6.5.718 6.5 1.538v.718C3.6 2.974 2 5.538 2 8.718v5.128l-2 2.051v1.026h16v-1.026l-2-2.05Z\">\n </path>\n </svg>\n\n @if (notification?.timeout > 0) {\n <svg class=\"notification-progress-ring\"\n viewBox=\"0 0 40 40\"\n role=\"progressbar\">\n <circle #progress\n [attr.stroke-dasharray]=\"progressStrokeArray\"\n [attr.stroke-dashoffset]=\"progressStrokeOffset\"\n [style.stroke]=\"notification?.color\"\n class=\"notification-progress-circle\"\n stroke-width=\"2\"\n fill=\"transparent\"\n r=\"19\"\n cx=\"20\"\n cy=\"20\">\n </circle>\n </svg>\n }\n </div>\n\n <div class=\"notification-content\">\n <ng-template [bbTemplate]=\"notification?.content\">\n @if (notification?.localize) {\n {{ $any(notification?.content) | bbLocalize }}\n } @else {\n {{ notification?.content }}\n }\n </ng-template>\n </div>\n</div>\n\n@if (notification?.actions?.length > 0 || notification?.dismiss) {\n <div class=\"notification-actions\">\n @for (action of notification?.actions; track $index) {\n <button [class.destructive]=\"action?.type === 'cancel'\"\n (click)=\"callActionAndDestroy(notification, action)\"\n type=\"button\"\n class=\"notification-actions-button\">\n <span class=\"notification-actions-button-highlight\">\n @if (notification?.localize) {\n {{ action?.title | bbLocalize }}\n } @else {\n {{ action?.title }}\n }\n </span>\n </button>\n }\n @if (notification?.dismiss) {\n <button (click)=\"notification?.destroy()\"\n class=\"notification-actions-button destructive\"\n type=\"button\">\n <span\n class=\"notification-actions-button-highlight\">{{ notification?.dismissText ?? dismissText }}</span>\n </button>\n }\n </div>\n}\n", styles: [".bb-notifications-item{top:0;left:0;width:100%;display:flex;position:absolute;pointer-events:all;border-radius:.5rem;flex-direction:column;background-color:#fff;box-shadow:0 .375rem .375rem -.375rem #00000026;border:1px solid rgb(214.3982142857,218.6677857143,224.1017857143);transition:margin-top .25s cubic-bezier(0,0,.2,1),transform .25s cubic-bezier(0,0,.2,1)}.bb-notifications-item.success .notification-icon-wrapper{color:#2dc05d;background-color:#ebfaf0}.bb-notifications-item.success .notification-progress-circle{stroke:#36d068}.bb-notifications-item.error .notification-icon-wrapper{color:#f43e3e;background-color:#feeeee}.bb-notifications-item.error .notification-progress-circle{stroke:#f55656}.bb-notifications-item.warning .notification-icon-wrapper{color:#f1ae00;background-color:#fff8e7}.bb-notifications-item.warning .notification-progress-circle{stroke:#ffbc0b}.bb-notifications-item.info .notification-icon-wrapper{color:#099bf6;background-color:#e9f6fe}.bb-notifications-item.info .notification-progress-circle{stroke:#22a5f7}.bb-notifications-item.custom .notification-icon-wrapper{color:#657385;background-color:#f3f5f6}.bb-notifications-item.custom .notification-progress-circle{stroke:#657385}.notification-content-wrapper{gap:.75rem;display:flex;padding:.75rem;align-items:center}.notification-icon-wrapper{width:2rem;height:2rem;display:flex;-webkit-user-select:none;user-select:none;position:relative;border-radius:50%;align-items:center;justify-content:center;color:#657385;background-color:#f3f5f6}.notification-icon{width:100%;height:100%;padding:.5rem;fill:currentColor}.notification-content{flex:1;font-weight:400;line-height:1.8;font-size:.875rem;color:#121212}.notification-content,.notification-actions-button{font-family:inherit}.notification-actions{display:flex;margin:0 1.5rem;-webkit-user-select:none;user-select:none;border-top:1px solid rgb(243.3589285714,244.5830714286,246.1410714286)}.notification-actions-button{flex:1;border:none;color:#22a5f7;cursor:pointer;font-weight:500;text-align:center;font-size:.875rem;padding:.75rem .125rem;background-color:transparent}.notification-actions-button:hover>.notification-actions-button-highlight,.notification-actions-button:focus>.notification-actions-button-highlight{background-color:#22a5f71a}.notification-actions-button:active>.notification-actions-button-highlight{background-color:#22a5f733}.notification-actions-button.destructive{color:#f55656}.notification-actions-button.destructive:hover>.notification-actions-button-highlight,.notification-actions-button.destructive:focus>.notification-actions-button-highlight{background-color:#f556561a}.notification-actions-button.destructive:active>.notification-actions-button-highlight{background-color:#f5565633}.notification-actions-button-highlight{display:inline-flex;border-radius:.75rem;padding:.25rem .75rem;transition:background-color .15s cubic-bezier(0,0,.2,1)}.notification-progress-ring{inset:0;width:100%;height:100%;position:absolute}.notification-progress-circle{transform:rotate(-90deg);transform-origin:50% 50%;stroke:#657385}\n"] }]
|
|
114
|
-
}],
|
|
109
|
+
}], propDecorators: { notification: [{
|
|
115
110
|
type: Input
|
|
116
111
|
}], progressElementRef: [{
|
|
117
112
|
type: ViewChild,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bravobit-bb-foundation-notifications.mjs","sources":["../../../projects/bb-foundation/notifications/src/lib/notifications.interfaces.ts","../../../projects/bb-foundation/notifications/src/lib/notifications-item/notifications-item.component.ts","../../../projects/bb-foundation/notifications/src/lib/notifications-item/notifications-item.component.html","../../../projects/bb-foundation/notifications/src/lib/notifications.animations.ts","../../../projects/bb-foundation/notifications/src/lib/notifications-list/notifications-list.component.ts","../../../projects/bb-foundation/notifications/src/lib/notifications-list/notifications-list.component.html","../../../projects/bb-foundation/notifications/src/lib/notifications.service.ts","../../../projects/bb-foundation/notifications/src/lib/notifications.config.ts","../../../projects/bb-foundation/notifications/src/lib/notifications.module.ts","../../../projects/bb-foundation/notifications/src/bravobit-bb-foundation-notifications.ts"],"sourcesContent":["import {InjectionToken, TemplateRef} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nexport interface Notification {\n content: string | TemplateRef<any>;\n type: NotificationType;\n\n id?: number;\n\n timeout?: number;\n localize?: boolean;\n dismiss?: boolean;\n dismissText?: string;\n actions?: NotificationAction[];\n\n color?: string;\n backgroundColor?: string;\n\n destroy?: () => void;\n}\n\nexport interface NotificationAction {\n title: string;\n callback?: () => any;\n type?: 'default' | 'cancel';\n}\n\nexport enum NotificationType {\n Success = 'success',\n Error = 'error',\n Warning = 'warning',\n Info = 'info',\n Custom = 'custom'\n}\n\nexport class NotificationsConfig {\n mode?: 'append' | 'prepend';\n timeout?: number;\n dismiss?: boolean;\n localize?: boolean;\n dismissText?: string;\n}\n\nexport const NOTIFICATIONS_DATA: InjectionToken<Observable<Notification[]>> = new InjectionToken('notifications data');\n\nexport const NOTIFICATIONS_CONFIG: InjectionToken<NotificationsConfig> = new InjectionToken('notifications config');\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, inject, Input, NgZone, OnDestroy, OnInit, ViewChild, ViewEncapsulation} from '@angular/core';\nimport {Notification, NotificationAction, NotificationsConfig} from '../notifications.interfaces';\nimport {BbLocalize} from '@bravobit/bb-foundation/localize';\nimport {BbTemplate} from '@bravobit/bb-foundation/utils';\nimport {Platform} from '@angular/cdk/platform';\nimport {WINDOW} from '@bravobit/bb-foundation';\n\n@Component({\n selector: 'bb-notifications-item',\n templateUrl: './notifications-item.component.html',\n styleUrls: ['./notifications-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {'role': 'alert'},\n imports: [BbLocalize, BbTemplate]\n})\nexport class BbNotificationsItem implements OnInit, OnDestroy {\n\n // Dependencies.\n private readonly _config?: NotificationsConfig = inject(NotificationsConfig, {optional: true});\n private readonly _window?: Window = inject(WINDOW, {optional: true});\n\n // Readonly data.\n readonly dismissText: string = this._config?.dismissText ?? null;\n\n // Inputs.\n @Input() notification: Notification | null = null;\n\n // Elements.\n @ViewChild('progress', {static: false}) progressElementRef: ElementRef<SVGCircleElement>;\n\n // Data.\n private _progress: number = 0;\n private _count: number = 0;\n\n // Helper variables.\n private _steps: number;\n private _speed: number;\n private _timer: number;\n private _startTime: number;\n private _difference: number;\n\n // Data.\n private readonly _radius = 19;\n private readonly _circumference = this._radius * 2 * Math.PI;\n\n @HostBinding('class')\n get getClass() {\n return `bb-notifications-item ${this.notification.type}`;\n }\n\n constructor(private _zone: NgZone,\n private _platform: Platform,\n private _changeDetection: ChangeDetectorRef) {\n }\n\n get progressStrokeArray() {\n const value = Math.floor(this._circumference);\n return `${value}, ${value}`;\n }\n\n get progressStrokeOffset() {\n return Math.floor(this._circumference - this._progress / 100 * this._circumference);\n }\n\n ngOnInit() {\n // Check if the notification timeout is not 0 and the platform is a browser.\n if (this.notification.timeout <= 0 || !this._platform.isBrowser) {\n this.notification.dismiss = true;\n return;\n }\n\n // Start the timeout.\n this.startTimeout();\n }\n\n ngOnDestroy() {\n this._timer && this._window?.clearTimeout?.(this._timer);\n }\n\n callActionAndDestroy(notification: Notification, action: NotificationAction) {\n action?.callback?.();\n notification?.destroy?.();\n }\n\n private startTimeout() {\n this._steps = this.notification.timeout / 10;\n this._speed = this.notification.timeout / this._steps;\n this._startTime = Date.now();\n this._zone.runOutsideAngular(() => this._timer = this.setTimeout(this.instance, this._speed));\n }\n\n private instance = () => {\n this._difference = (Date.now() - this._startTime) - (this._count * this._speed);\n\n if (this._count++ === this._steps) {\n this.notification.destroy();\n }\n\n this._progress += 100 / this._steps;\n this._timer = this.setTimeout(this.instance, this._speed - this._difference);\n this._zone.run(() => this._changeDetection.detectChanges());\n };\n\n private setTimeout(method: () => void, timeout: number) {\n if (!this._window || !this._window.setTimeout) {\n return null;\n }\n\n return this._window.setTimeout(method, timeout);\n }\n\n}\n","<div class=\"notification-content-wrapper\">\n <div [style.color]=\"notification?.color\"\n [style.background-color]=\"notification?.backgroundColor\"\n class=\"notification-icon-wrapper\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 20\"\n class=\"notification-icon\">\n <path\n d=\"M8 20c1.1 0 2-.923 2-2.051H6C6 19.077 6.9 20 8 20Zm6-6.154V8.718c0-3.18-1.6-5.744-4.5-6.462v-.718C9.5.718 8.8 0 8 0S6.5.718 6.5 1.538v.718C3.6 2.974 2 5.538 2 8.718v5.128l-2 2.051v1.026h16v-1.026l-2-2.05Z\">\n </path>\n </svg>\n\n @if (notification?.timeout > 0) {\n <svg class=\"notification-progress-ring\"\n viewBox=\"0 0 40 40\"\n role=\"progressbar\">\n <circle #progress\n [attr.stroke-dasharray]=\"progressStrokeArray\"\n [attr.stroke-dashoffset]=\"progressStrokeOffset\"\n [style.stroke]=\"notification?.color\"\n class=\"notification-progress-circle\"\n stroke-width=\"2\"\n fill=\"transparent\"\n r=\"19\"\n cx=\"20\"\n cy=\"20\">\n </circle>\n </svg>\n }\n </div>\n\n <div class=\"notification-content\">\n <ng-template [bbTemplate]=\"notification?.content\">\n @if (notification?.localize) {\n {{ $any(notification?.content) | bbLocalize }}\n } @else {\n {{ notification?.content }}\n }\n </ng-template>\n </div>\n</div>\n\n@if (notification?.actions?.length > 0 || notification?.dismiss) {\n <div class=\"notification-actions\">\n @for (action of notification?.actions; track $index) {\n <button [class.destructive]=\"action?.type === 'cancel'\"\n (click)=\"callActionAndDestroy(notification, action)\"\n type=\"button\"\n class=\"notification-actions-button\">\n <span class=\"notification-actions-button-highlight\">\n @if (notification?.localize) {\n {{ action?.title | bbLocalize }}\n } @else {\n {{ action?.title }}\n }\n </span>\n </button>\n }\n @if (notification?.dismiss) {\n <button (click)=\"notification?.destroy()\"\n class=\"notification-actions-button destructive\"\n type=\"button\">\n <span\n class=\"notification-actions-button-highlight\">{{ notification?.dismissText ?? dismissText }}</span>\n </button>\n }\n </div>\n}\n","import {animate, query, style, transition, trigger} from '@angular/animations';\n\nexport const notificationListAnimation = trigger('notificationListAnimation', [\n transition('* => *', [\n query(':enter', [\n style({opacity: 0, transform: 'translateY(-1rem)'}),\n animate('250ms cubic-bezier(0, 0, 0.2, 1)', style({opacity: 1, transform: 'none'}))\n ], {optional: true}),\n\n query(':leave', [\n animate('250ms cubic-bezier(0, 0, .2, 1)', style({opacity: 0}))\n ], {optional: true})\n ])\n]);\n","import {ChangeDetectionStrategy, Component, inject, OnInit, ViewEncapsulation} from '@angular/core';\nimport {BbNotificationsItem} from '../notifications-item/notifications-item.component';\nimport {Notification, NOTIFICATIONS_DATA} from '../notifications.interfaces';\nimport {notificationListAnimation} from '../notifications.animations';\nimport {AsyncPipe} from '@angular/common';\nimport {map} from 'rxjs/operators';\nimport {Observable} from 'rxjs';\n\n@Component({\n selector: 'bb-notifications-list',\n templateUrl: './notifications-list.component.html',\n styleUrls: ['./notifications-list.component.scss'],\n animations: [notificationListAnimation],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'bb-notifications-list',\n 'role': 'list'\n },\n imports: [AsyncPipe, BbNotificationsItem]\n})\nexport class BbNotificationsList implements OnInit {\n\n // Dependencies.\n private readonly _data$: Observable<Notification[]> = inject(NOTIFICATIONS_DATA);\n\n // Data.\n data$: Observable<{\n notification?: Notification,\n styles?: { offset?: number, scale?: string }\n }[]>;\n\n ngOnInit() {\n this.setData();\n }\n\n private setData() {\n this.data$ = this._data$.pipe(\n map(notifications => {\n return notifications.map((notification, index) => {\n const scale = Math.max(0.9, 1 - (index * 0.02));\n return {\n notification,\n styles: {\n offset: Math.min(index, 5),\n scale: `scale(${scale})`\n }\n };\n });\n })\n );\n }\n\n}\n","@if (data$ | async; as data) {\n <div [@notificationListAnimation]=\"data?.length\"\n class=\"notifications-list-wrapper\">\n @for (item of data; track item?.notification?.id) {\n <bb-notifications-item [notification]=\"item?.notification\"\n [style.z-index]=\"item?.notification?.id\"\n [style.margin-top.rem]=\"item?.styles?.offset\"\n [style.transform]=\"item?.styles?.scale\">\n </bb-notifications-item>\n }\n </div>\n}\n","import {ApplicationRef, ComponentRef, createComponent, createEnvironmentInjector, EnvironmentInjector, inject, Injectable, TemplateRef} from '@angular/core';\nimport {Notification, NotificationAction, NOTIFICATIONS_CONFIG, NOTIFICATIONS_DATA, NotificationsConfig, NotificationType} from './notifications.interfaces';\nimport {BbNotificationsList} from './notifications-list/notifications-list.component';\nimport {Localize} from '@bravobit/bb-foundation/localize';\nimport {Platform} from '@angular/cdk/platform';\nimport {DOCUMENT} from '@angular/common';\nimport {BehaviorSubject} from 'rxjs';\n\nlet nextUniqueId = 0;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Notifications {\n\n // Dependencies.\n private _platform: Platform = inject(Platform);\n private _applicationRef: ApplicationRef = inject(ApplicationRef);\n private _environmentInjector: EnvironmentInjector = inject(EnvironmentInjector);\n private _localize?: Localize = inject(Localize, {optional: true});\n private _config?: NotificationsConfig = inject(NOTIFICATIONS_CONFIG, {optional: true});\n private _document?: Document = inject(DOCUMENT, {optional: true});\n\n // Reference to the list.\n private _componentRef: ComponentRef<BbNotificationsList>;\n\n // The default settings for the notifications.\n private readonly _defaultMode: 'prepend' | 'append' = this._config?.mode ?? 'prepend';\n private readonly _defaultTimeout: number = this._config?.timeout ?? 8_000;\n private readonly _defaultLocalize: boolean = this._config?.localize ?? false;\n private readonly _defaultDismiss: boolean = this._config?.dismiss ?? true;\n private readonly _defaultDismissText: string = this._config?.dismissText ?? 'Dismiss';\n\n // The data containing the notifications.\n private _notifications$ = new BehaviorSubject<Notification[]>([]);\n\n constructor() {\n this.createElement();\n }\n\n success(content: string | TemplateRef<any>, actions: NotificationAction[] = [], timeout = this._defaultTimeout) {\n return this.create({content, timeout, actions, type: NotificationType.Success});\n }\n\n error(content: string | TemplateRef<any>, actions: NotificationAction[] = [], timeout = this._defaultTimeout) {\n return this.create({content, timeout, actions, type: NotificationType.Error});\n }\n\n warn(content: string | TemplateRef<any>, actions: NotificationAction[] = [], timeout = this._defaultTimeout) {\n return this.create({content, timeout, actions, type: NotificationType.Warning});\n }\n\n info(content: string | TemplateRef<any>, actions: NotificationAction[] = [], timeout = this._defaultTimeout) {\n return this.create({content, timeout, actions, type: NotificationType.Info});\n }\n\n create(notification: Notification) {\n const item = this.compose(notification);\n item.destroy = () => this.pull(item);\n return this.push(item);\n }\n\n private push(notification: Notification) {\n // Get the current list.\n const oldList = this._notifications$.getValue();\n\n // Check which mode is activated.\n let newList: Notification[];\n switch (this._defaultMode) {\n case 'append':\n newList = [...oldList, notification];\n break;\n case 'prepend':\n default:\n newList = [notification, ...oldList];\n }\n\n // Push the new notifications.\n this._notifications$.next(newList);\n\n // Return the notification for further use.\n return notification;\n }\n\n private pull(notification: Notification) {\n // Get the current list.\n const newList = this._notifications$\n .getValue()\n .filter(item => item?.id !== notification?.id);\n\n // Push a new list.\n this._notifications$.next(newList);\n }\n\n private compose(notification: Notification) {\n // Attach a random id to the notification.\n notification.id = ++nextUniqueId % 99999;\n\n // Set all properties.\n notification.type = notification?.type ?? NotificationType.Custom;\n notification.content = notification?.content ?? null;\n notification.timeout = notification?.timeout ?? this._defaultTimeout;\n notification.localize = notification?.localize ?? this._defaultLocalize;\n notification.dismiss = notification?.dismiss ?? this._defaultDismiss;\n\n // Dismiss text localization.\n const dismissText = notification.dismissText ?? this._defaultDismissText;\n notification.dismissText = this._defaultLocalize && this._localize\n ? this._localize.translate(dismissText)\n : dismissText;\n\n // Return the composed notification.\n return notification;\n }\n\n private createElement() {\n const environmentInjector = createEnvironmentInjector([\n {provide: NOTIFICATIONS_DATA, useValue: this._notifications$}\n ], this._environmentInjector);\n\n this._componentRef = createComponent(BbNotificationsList, {environmentInjector});\n this._applicationRef.attachView(this._componentRef.hostView);\n\n if (!this._platform.isBrowser) {\n return;\n }\n\n try {\n this._document.body.appendChild(this._componentRef?.location?.nativeElement);\n } catch {\n // Don't do anything, because it must've failed.\n }\n }\n\n}\n","import {NOTIFICATIONS_CONFIG, NotificationsConfig} from './notifications.interfaces';\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\n\nexport function provideNotificationsConfig(config: NotificationsConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {provide: NOTIFICATIONS_CONFIG, useValue: config ?? {}}\n ]);\n}\n","import {provideNotificationsConfig} from './notifications.config';\nimport {NotificationsConfig} from './notifications.interfaces';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\n\n@NgModule()\nexport class NotificationsModule {\n\n static forRoot(config?: NotificationsConfig): ModuleWithProviders<NotificationsModule> {\n return {\n ngModule: NotificationsModule,\n providers: [\n provideNotificationsConfig(config)\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bravobit-bb-foundation-notifications.mjs","sources":["../../../projects/bb-foundation/notifications/src/lib/notifications.interfaces.ts","../../../projects/bb-foundation/notifications/src/lib/notifications-item/notifications-item.component.ts","../../../projects/bb-foundation/notifications/src/lib/notifications-item/notifications-item.component.html","../../../projects/bb-foundation/notifications/src/lib/notifications.animations.ts","../../../projects/bb-foundation/notifications/src/lib/notifications-list/notifications-list.component.ts","../../../projects/bb-foundation/notifications/src/lib/notifications-list/notifications-list.component.html","../../../projects/bb-foundation/notifications/src/lib/notifications.service.ts","../../../projects/bb-foundation/notifications/src/lib/notifications.config.ts","../../../projects/bb-foundation/notifications/src/lib/notifications.module.ts","../../../projects/bb-foundation/notifications/src/bravobit-bb-foundation-notifications.ts"],"sourcesContent":["import {InjectionToken, TemplateRef} from '@angular/core';\nimport {Observable} from 'rxjs';\n\nexport interface Notification {\n content: string | TemplateRef<any>;\n type: NotificationType;\n\n id?: number;\n\n timeout?: number;\n localize?: boolean;\n dismiss?: boolean;\n dismissText?: string;\n actions?: NotificationAction[];\n\n color?: string;\n backgroundColor?: string;\n\n destroy?: () => void;\n}\n\nexport interface NotificationAction {\n title: string;\n callback?: () => any;\n type?: 'default' | 'cancel';\n}\n\nexport enum NotificationType {\n Success = 'success',\n Error = 'error',\n Warning = 'warning',\n Info = 'info',\n Custom = 'custom'\n}\n\nexport class NotificationsConfig {\n mode?: 'append' | 'prepend';\n timeout?: number;\n dismiss?: boolean;\n localize?: boolean;\n dismissText?: string;\n}\n\nexport const NOTIFICATIONS_DATA: InjectionToken<Observable<Notification[]>> = new InjectionToken('notifications data');\n\nexport const NOTIFICATIONS_CONFIG: InjectionToken<NotificationsConfig> = new InjectionToken('notifications config');\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, inject, Input, NgZone, OnDestroy, OnInit, ViewChild, ViewEncapsulation} from '@angular/core';\nimport {Notification, NotificationAction, NotificationsConfig} from '../notifications.interfaces';\nimport {BbLocalize} from '@bravobit/bb-foundation/localize';\nimport {BbTemplate} from '@bravobit/bb-foundation/utils';\nimport {Platform} from '@angular/cdk/platform';\nimport {WINDOW} from '@bravobit/bb-foundation';\n\n@Component({\n selector: 'bb-notifications-item',\n templateUrl: './notifications-item.component.html',\n styleUrls: ['./notifications-item.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {'role': 'alert'},\n imports: [BbLocalize, BbTemplate]\n})\nexport class BbNotificationsItem implements OnInit, OnDestroy {\n\n // Dependencies.\n private readonly _zone: NgZone = inject(NgZone);\n private readonly _platform: Platform = inject(Platform);\n private readonly _changeDetection: ChangeDetectorRef = inject(ChangeDetectorRef);\n\n // Dependencies.\n private readonly _config?: NotificationsConfig = inject(NotificationsConfig, {optional: true});\n private readonly _window?: Window = inject(WINDOW, {optional: true});\n\n // Readonly data.\n readonly dismissText: string = this._config?.dismissText ?? null;\n\n // Inputs.\n @Input() notification: Notification | null = null;\n\n // Elements.\n @ViewChild('progress', {static: false}) progressElementRef: ElementRef<SVGCircleElement>;\n\n // Data.\n private _progress: number = 0;\n private _count: number = 0;\n\n // Helper variables.\n private _steps: number;\n private _speed: number;\n private _timer: number;\n private _startTime: number;\n private _difference: number;\n\n // Data.\n private readonly _radius = 19;\n private readonly _circumference = this._radius * 2 * Math.PI;\n\n @HostBinding('class')\n get getClass() {\n return `bb-notifications-item ${this.notification.type}`;\n }\n\n get progressStrokeArray() {\n const value = Math.floor(this._circumference);\n return `${value}, ${value}`;\n }\n\n get progressStrokeOffset() {\n return Math.floor(this._circumference - this._progress / 100 * this._circumference);\n }\n\n ngOnInit() {\n // Check if the notification timeout is not 0 and the platform is a browser.\n if (this.notification.timeout <= 0 || !this._platform.isBrowser) {\n this.notification.dismiss = true;\n return;\n }\n\n // Start the timeout.\n this.startTimeout();\n }\n\n ngOnDestroy() {\n this._timer && this._window?.clearTimeout?.(this._timer);\n }\n\n callActionAndDestroy(notification: Notification, action: NotificationAction) {\n action?.callback?.();\n notification?.destroy?.();\n }\n\n private startTimeout() {\n this._steps = this.notification.timeout / 10;\n this._speed = this.notification.timeout / this._steps;\n this._startTime = Date.now();\n this._zone.runOutsideAngular(() => this._timer = this.setTimeout(this.instance, this._speed));\n }\n\n private instance = () => {\n this._difference = (Date.now() - this._startTime) - (this._count * this._speed);\n\n if (this._count++ === this._steps) {\n this.notification.destroy();\n }\n\n this._progress += 100 / this._steps;\n this._timer = this.setTimeout(this.instance, this._speed - this._difference);\n this._zone.run(() => this._changeDetection.detectChanges());\n };\n\n private setTimeout(method: () => void, timeout: number) {\n if (!this._window || !this._window.setTimeout) {\n return null;\n }\n\n return this._window.setTimeout(method, timeout);\n }\n\n}\n","<div class=\"notification-content-wrapper\">\n <div [style.color]=\"notification?.color\"\n [style.background-color]=\"notification?.backgroundColor\"\n class=\"notification-icon-wrapper\">\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 16 20\"\n class=\"notification-icon\">\n <path\n d=\"M8 20c1.1 0 2-.923 2-2.051H6C6 19.077 6.9 20 8 20Zm6-6.154V8.718c0-3.18-1.6-5.744-4.5-6.462v-.718C9.5.718 8.8 0 8 0S6.5.718 6.5 1.538v.718C3.6 2.974 2 5.538 2 8.718v5.128l-2 2.051v1.026h16v-1.026l-2-2.05Z\">\n </path>\n </svg>\n\n @if (notification?.timeout > 0) {\n <svg class=\"notification-progress-ring\"\n viewBox=\"0 0 40 40\"\n role=\"progressbar\">\n <circle #progress\n [attr.stroke-dasharray]=\"progressStrokeArray\"\n [attr.stroke-dashoffset]=\"progressStrokeOffset\"\n [style.stroke]=\"notification?.color\"\n class=\"notification-progress-circle\"\n stroke-width=\"2\"\n fill=\"transparent\"\n r=\"19\"\n cx=\"20\"\n cy=\"20\">\n </circle>\n </svg>\n }\n </div>\n\n <div class=\"notification-content\">\n <ng-template [bbTemplate]=\"notification?.content\">\n @if (notification?.localize) {\n {{ $any(notification?.content) | bbLocalize }}\n } @else {\n {{ notification?.content }}\n }\n </ng-template>\n </div>\n</div>\n\n@if (notification?.actions?.length > 0 || notification?.dismiss) {\n <div class=\"notification-actions\">\n @for (action of notification?.actions; track $index) {\n <button [class.destructive]=\"action?.type === 'cancel'\"\n (click)=\"callActionAndDestroy(notification, action)\"\n type=\"button\"\n class=\"notification-actions-button\">\n <span class=\"notification-actions-button-highlight\">\n @if (notification?.localize) {\n {{ action?.title | bbLocalize }}\n } @else {\n {{ action?.title }}\n }\n </span>\n </button>\n }\n @if (notification?.dismiss) {\n <button (click)=\"notification?.destroy()\"\n class=\"notification-actions-button destructive\"\n type=\"button\">\n <span\n class=\"notification-actions-button-highlight\">{{ notification?.dismissText ?? dismissText }}</span>\n </button>\n }\n </div>\n}\n","import {animate, query, style, transition, trigger} from '@angular/animations';\n\nexport const notificationListAnimation = trigger('notificationListAnimation', [\n transition('* => *', [\n query(':enter', [\n style({opacity: 0, transform: 'translateY(-1rem)'}),\n animate('250ms cubic-bezier(0, 0, 0.2, 1)', style({opacity: 1, transform: 'none'}))\n ], {optional: true}),\n\n query(':leave', [\n animate('250ms cubic-bezier(0, 0, .2, 1)', style({opacity: 0}))\n ], {optional: true})\n ])\n]);\n","import {ChangeDetectionStrategy, Component, inject, OnInit, ViewEncapsulation} from '@angular/core';\nimport {BbNotificationsItem} from '../notifications-item/notifications-item.component';\nimport {Notification, NOTIFICATIONS_DATA} from '../notifications.interfaces';\nimport {notificationListAnimation} from '../notifications.animations';\nimport {AsyncPipe} from '@angular/common';\nimport {map} from 'rxjs/operators';\nimport {Observable} from 'rxjs';\n\n@Component({\n selector: 'bb-notifications-list',\n templateUrl: './notifications-list.component.html',\n styleUrls: ['./notifications-list.component.scss'],\n animations: [notificationListAnimation],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'bb-notifications-list',\n 'role': 'list'\n },\n imports: [AsyncPipe, BbNotificationsItem]\n})\nexport class BbNotificationsList implements OnInit {\n\n // Dependencies.\n private readonly _data$: Observable<Notification[]> = inject(NOTIFICATIONS_DATA);\n\n // Data.\n data$: Observable<{\n notification?: Notification,\n styles?: { offset?: number, scale?: string }\n }[]>;\n\n ngOnInit() {\n this.setData();\n }\n\n private setData() {\n this.data$ = this._data$.pipe(\n map(notifications => {\n return notifications.map((notification, index) => {\n const scale = Math.max(0.9, 1 - (index * 0.02));\n return {\n notification,\n styles: {\n offset: Math.min(index, 5),\n scale: `scale(${scale})`\n }\n };\n });\n })\n );\n }\n\n}\n","@if (data$ | async; as data) {\n <div [@notificationListAnimation]=\"data?.length\"\n class=\"notifications-list-wrapper\">\n @for (item of data; track item?.notification?.id) {\n <bb-notifications-item [notification]=\"item?.notification\"\n [style.z-index]=\"item?.notification?.id\"\n [style.margin-top.rem]=\"item?.styles?.offset\"\n [style.transform]=\"item?.styles?.scale\">\n </bb-notifications-item>\n }\n </div>\n}\n","import {ApplicationRef, ComponentRef, createComponent, createEnvironmentInjector, EnvironmentInjector, inject, Injectable, TemplateRef} from '@angular/core';\nimport {Notification, NotificationAction, NOTIFICATIONS_CONFIG, NOTIFICATIONS_DATA, NotificationsConfig, NotificationType} from './notifications.interfaces';\nimport {BbNotificationsList} from './notifications-list/notifications-list.component';\nimport {Localize} from '@bravobit/bb-foundation/localize';\nimport {Platform} from '@angular/cdk/platform';\nimport {DOCUMENT} from '@angular/common';\nimport {BehaviorSubject} from 'rxjs';\n\nlet nextUniqueId = 0;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Notifications {\n\n // Dependencies.\n private _platform: Platform = inject(Platform);\n private _applicationRef: ApplicationRef = inject(ApplicationRef);\n private _environmentInjector: EnvironmentInjector = inject(EnvironmentInjector);\n private _localize?: Localize = inject(Localize, {optional: true});\n private _config?: NotificationsConfig = inject(NOTIFICATIONS_CONFIG, {optional: true});\n private _document?: Document = inject(DOCUMENT, {optional: true});\n\n // Reference to the list.\n private _componentRef: ComponentRef<BbNotificationsList>;\n\n // The default settings for the notifications.\n private readonly _defaultMode: 'prepend' | 'append' = this._config?.mode ?? 'prepend';\n private readonly _defaultTimeout: number = this._config?.timeout ?? 8_000;\n private readonly _defaultLocalize: boolean = this._config?.localize ?? false;\n private readonly _defaultDismiss: boolean = this._config?.dismiss ?? true;\n private readonly _defaultDismissText: string = this._config?.dismissText ?? 'Dismiss';\n\n // The data containing the notifications.\n private _notifications$ = new BehaviorSubject<Notification[]>([]);\n\n constructor() {\n this.createElement();\n }\n\n success(content: string | TemplateRef<any>, actions: NotificationAction[] = [], timeout = this._defaultTimeout) {\n return this.create({content, timeout, actions, type: NotificationType.Success});\n }\n\n error(content: string | TemplateRef<any>, actions: NotificationAction[] = [], timeout = this._defaultTimeout) {\n return this.create({content, timeout, actions, type: NotificationType.Error});\n }\n\n warn(content: string | TemplateRef<any>, actions: NotificationAction[] = [], timeout = this._defaultTimeout) {\n return this.create({content, timeout, actions, type: NotificationType.Warning});\n }\n\n info(content: string | TemplateRef<any>, actions: NotificationAction[] = [], timeout = this._defaultTimeout) {\n return this.create({content, timeout, actions, type: NotificationType.Info});\n }\n\n create(notification: Notification) {\n const item = this.compose(notification);\n item.destroy = () => this.pull(item);\n return this.push(item);\n }\n\n private push(notification: Notification) {\n // Get the current list.\n const oldList = this._notifications$.getValue();\n\n // Check which mode is activated.\n let newList: Notification[];\n switch (this._defaultMode) {\n case 'append':\n newList = [...oldList, notification];\n break;\n case 'prepend':\n default:\n newList = [notification, ...oldList];\n }\n\n // Push the new notifications.\n this._notifications$.next(newList);\n\n // Return the notification for further use.\n return notification;\n }\n\n private pull(notification: Notification) {\n // Get the current list.\n const newList = this._notifications$\n .getValue()\n .filter(item => item?.id !== notification?.id);\n\n // Push a new list.\n this._notifications$.next(newList);\n }\n\n private compose(notification: Notification) {\n // Attach a random id to the notification.\n notification.id = ++nextUniqueId % 99999;\n\n // Set all properties.\n notification.type = notification?.type ?? NotificationType.Custom;\n notification.content = notification?.content ?? null;\n notification.timeout = notification?.timeout ?? this._defaultTimeout;\n notification.localize = notification?.localize ?? this._defaultLocalize;\n notification.dismiss = notification?.dismiss ?? this._defaultDismiss;\n\n // Dismiss text localization.\n const dismissText = notification.dismissText ?? this._defaultDismissText;\n notification.dismissText = this._defaultLocalize && this._localize\n ? this._localize.translate(dismissText)\n : dismissText;\n\n // Return the composed notification.\n return notification;\n }\n\n private createElement() {\n const environmentInjector = createEnvironmentInjector([\n {provide: NOTIFICATIONS_DATA, useValue: this._notifications$}\n ], this._environmentInjector);\n\n this._componentRef = createComponent(BbNotificationsList, {environmentInjector});\n this._applicationRef.attachView(this._componentRef.hostView);\n\n if (!this._platform.isBrowser) {\n return;\n }\n\n try {\n this._document.body.appendChild(this._componentRef?.location?.nativeElement);\n } catch {\n // Don't do anything, because it must've failed.\n }\n }\n\n}\n","import {NOTIFICATIONS_CONFIG, NotificationsConfig} from './notifications.interfaces';\nimport {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\n\nexport function provideNotificationsConfig(config: NotificationsConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {provide: NOTIFICATIONS_CONFIG, useValue: config ?? {}}\n ]);\n}\n","import {provideNotificationsConfig} from './notifications.config';\nimport {NotificationsConfig} from './notifications.interfaces';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\n\n@NgModule()\nexport class NotificationsModule {\n\n static forRoot(config?: NotificationsConfig): ModuleWithProviders<NotificationsModule> {\n return {\n ngModule: NotificationsModule,\n providers: [\n provideNotificationsConfig(config)\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { map, distinctUntilChanged, switchMap } from 'rxjs/operators';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { Injectable, Directive, Input, InjectionToken,
|
|
3
|
+
import { Injectable, inject, TemplateRef, ViewContainerRef, Directive, Input, InjectionToken, makeEnvironmentProviders, NgModule } from '@angular/core';
|
|
4
4
|
import { BehaviorSubject, Subscription, of, isObservable, combineLatest } from 'rxjs';
|
|
5
5
|
import { Router } from '@angular/router';
|
|
6
6
|
import { Auth } from '@bravobit/bb-foundation/auth';
|
|
@@ -131,9 +131,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImpor
|
|
|
131
131
|
}], ctorParameters: () => [{ type: PermissionsHandler }] });
|
|
132
132
|
|
|
133
133
|
class BbPermission {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
134
|
+
// Dependencies.
|
|
135
|
+
_permissions = inject(Permissions);
|
|
136
|
+
_templateRef = inject(TemplateRef);
|
|
137
|
+
_viewContainerRef = inject(ViewContainerRef);
|
|
137
138
|
// Templates.
|
|
138
139
|
_elseTemplateRef = null;
|
|
139
140
|
// View refs.
|
|
@@ -158,11 +159,6 @@ class BbPermission {
|
|
|
158
159
|
}
|
|
159
160
|
// Subscriptions.
|
|
160
161
|
_subscription = new Subscription();
|
|
161
|
-
constructor(_permissions, _templateRef, _viewContainerRef) {
|
|
162
|
-
this._permissions = _permissions;
|
|
163
|
-
this._templateRef = _templateRef;
|
|
164
|
-
this._viewContainerRef = _viewContainerRef;
|
|
165
|
-
}
|
|
166
162
|
ngOnInit() {
|
|
167
163
|
const check$ = combineLatest([this._permission$, this._mode$]).pipe(switchMap(([permissions, mode]) => this._permissions.has(permissions, { mode })), distinctUntilChanged());
|
|
168
164
|
const subscription = check$.subscribe(valid => {
|
|
@@ -203,7 +199,7 @@ class BbPermission {
|
|
|
203
199
|
static ngAcceptInputType_bbPermission;
|
|
204
200
|
static ngAcceptInputType_bbPermissionElse;
|
|
205
201
|
static ngAcceptInputType_bbPermissionMode;
|
|
206
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: BbPermission, deps: [
|
|
202
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: BbPermission, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
207
203
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.4", type: BbPermission, isStandalone: true, selector: "ng-template[bbPermission]", inputs: { bbPermission: "bbPermission", bbPermissionElse: "bbPermissionElse", bbPermissionMode: "bbPermissionMode" }, ngImport: i0 });
|
|
208
204
|
}
|
|
209
205
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: BbPermission, decorators: [{
|
|
@@ -211,7 +207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImpor
|
|
|
211
207
|
args: [{
|
|
212
208
|
selector: 'ng-template[bbPermission]'
|
|
213
209
|
}]
|
|
214
|
-
}],
|
|
210
|
+
}], propDecorators: { bbPermission: [{
|
|
215
211
|
type: Input
|
|
216
212
|
}], bbPermissionElse: [{
|
|
217
213
|
type: Input
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bravobit-bb-foundation-permissions.mjs","sources":["../../../projects/bb-foundation/permissions/src/lib/handlers/abstract.handler.ts","../../../projects/bb-foundation/permissions/src/lib/handlers/local.handler.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.service.ts","../../../projects/bb-foundation/permissions/src/lib/directives/permission.directive.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.interface.ts","../../../projects/bb-foundation/permissions/src/lib/guards/permission.guard.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.config.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.module.ts","../../../projects/bb-foundation/permissions/src/bravobit-bb-foundation-permissions.ts"],"sourcesContent":["import {Observable} from 'rxjs';\n\nexport abstract class PermissionsHandler {\n\n abstract get(): Observable<string[]> | string[];\n\n}\n","import {LocalPermissionsData} from '../permissions.interface';\nimport {PermissionsHandler} from './abstract.handler';\nimport {Auth} from '@bravobit/bb-foundation/auth';\nimport {map} from 'rxjs/operators';\n\nexport class LocalPermissionsHandler extends PermissionsHandler {\n\n constructor(protected auth: Auth,\n protected localPermissions: LocalPermissionsData) {\n super();\n }\n\n override get() {\n return this.auth.user.pipe(\n map(user => user?.role ?? null),\n map(role => {\n if (role === null || role === undefined) {\n return [];\n }\n\n return this.getPermissionsForRole(role);\n })\n );\n }\n\n protected getPermissionsForRole(role: string) {\n return Object.keys(this.localPermissions ?? {}).reduce((previous, current) => {\n const roles = this.localPermissions?.[current] ?? [];\n if (roles === '*' || roles?.includes(role)) {\n return [...previous, current];\n }\n\n return previous;\n }, []);\n }\n\n}\n","import {BehaviorSubject, isObservable, of, Subscription} from 'rxjs';\nimport {PermissionsHandler} from './handlers/abstract.handler';\nimport {PermissionsOptions} from './permissions.interface';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {Injectable, OnDestroy} from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Permissions implements OnDestroy {\n\n // State.\n private _activePermissions$ = new BehaviorSubject<string[]>([]);\n\n // Subscriptions.\n private _subscription = new Subscription();\n\n constructor(private _handler: PermissionsHandler) {\n this.trackPermissions();\n }\n\n ngOnDestroy() {\n this._subscription?.unsubscribe();\n }\n\n all() {\n return this._activePermissions$.asObservable();\n }\n\n allSync() {\n return this._activePermissions$.getValue();\n }\n\n has(value: string | string[], options?: PermissionsOptions) {\n const requiredPermissions = this.getRequiredPermissions(value);\n if (requiredPermissions?.length <= 0) {\n return of(false);\n }\n\n return this._activePermissions$.pipe(\n map(activePermissions => this.hasPermission(requiredPermissions, activePermissions, options)),\n distinctUntilChanged()\n );\n }\n\n hasSync(value: string | string[], options?: PermissionsOptions) {\n const requiredPermissions = this.getRequiredPermissions(value);\n if (requiredPermissions?.length <= 0) {\n return false;\n }\n\n const activePermissions = this._activePermissions$.getValue();\n return this.hasPermission(requiredPermissions, activePermissions, options);\n }\n\n private hasPermission(requiredPermissions: string[], activePermissions: string[], options?: PermissionsOptions) {\n const mode = options?.mode ?? 'and';\n switch (mode) {\n case 'or':\n return this.verifyModeOr(requiredPermissions, activePermissions);\n case 'not':\n return this.verifyModeNot(requiredPermissions, activePermissions);\n case 'and':\n default:\n return this.verifyModeAnd(requiredPermissions, activePermissions);\n }\n }\n\n private verifyModeAnd(permissions: string[], activePermissions: string[]) {\n for (const permission of permissions) {\n const verified = activePermissions?.includes(permission);\n if (!verified) {\n return false;\n }\n }\n\n return true;\n }\n\n private verifyModeNot(permissions: string[], activePermissions: string[]) {\n for (const permission of permissions) {\n if (activePermissions.includes(permission)) {\n return false;\n }\n }\n\n return true;\n }\n\n private verifyModeOr(permissions: string[], activePermissions: string[]) {\n for (const permission of permissions) {\n const verified = activePermissions?.includes(permission);\n if (verified) {\n return true;\n }\n }\n\n return false;\n }\n\n private getRequiredPermissions(value: string | string[]) {\n return Array.isArray(value)\n ? value\n : [value];\n }\n\n private trackPermissions() {\n const data = this._handler.get();\n const permissions$ = isObservable(data) ? data : of(data);\n\n const subscription = permissions$.subscribe(permissions => {\n this._activePermissions$.next(permissions ?? []);\n });\n this._subscription.add(subscription);\n }\n\n}\n","import {Directive, EmbeddedViewRef, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef} from '@angular/core';\nimport {BehaviorSubject, combineLatest, Subscription} from 'rxjs';\nimport {distinctUntilChanged, switchMap} from 'rxjs/operators';\nimport {PermissionsMode} from '../permissions.interface';\nimport {Permissions} from '../permissions.service';\n\n@Directive({\n selector: 'ng-template[bbPermission]'\n})\nexport class BbPermission implements OnInit, OnDestroy {\n\n // Templates.\n private _elseTemplateRef: TemplateRef<any> | null = null;\n\n // View refs.\n private _thenViewRef: EmbeddedViewRef<any> | null = null;\n private _elseViewRef: EmbeddedViewRef<any> | null = null;\n\n // Data.\n private _valid: boolean = false;\n private _permission$ = new BehaviorSubject<string[]>([]);\n private _mode$ = new BehaviorSubject<PermissionsMode>('and');\n\n @Input()\n set bbPermission(value: string | string[]) {\n const permissions = Array.isArray(value) ? value : [value];\n this._permission$.next(permissions);\n this.updateView();\n }\n\n @Input()\n set bbPermissionElse(templateRef: TemplateRef<any>) {\n this.assertTemplate('bbPermissionElse', templateRef);\n this._elseTemplateRef = templateRef;\n this.updateView();\n }\n\n @Input()\n set bbPermissionMode(mode: PermissionsMode) {\n this._mode$.next(mode);\n }\n\n // Subscriptions.\n private _subscription = new Subscription();\n\n constructor(private _permissions: Permissions,\n private _templateRef: TemplateRef<any>,\n private _viewContainerRef: ViewContainerRef) {\n }\n\n ngOnInit() {\n const check$ = combineLatest([this._permission$, this._mode$]).pipe(\n switchMap(([permissions, mode]) => this._permissions.has(permissions, {mode})),\n distinctUntilChanged()\n );\n\n const subscription = check$.subscribe(valid => {\n this._valid = valid;\n this.updateView();\n });\n this._subscription.add(subscription);\n }\n\n ngOnDestroy() {\n this._subscription?.unsubscribe();\n }\n\n private updateView() {\n if (this._valid) {\n if (!this._thenViewRef) {\n this._viewContainerRef.clear();\n this._elseViewRef = null;\n if (this._templateRef) {\n this._thenViewRef = this._viewContainerRef.createEmbeddedView(this._templateRef);\n }\n }\n } else {\n if (!this._elseViewRef) {\n this._viewContainerRef.clear();\n this._thenViewRef = null;\n if (this._elseTemplateRef) {\n this._elseViewRef = this._viewContainerRef.createEmbeddedView(this._elseTemplateRef);\n }\n }\n }\n }\n\n private assertTemplate(property: string, templateRef: TemplateRef<any> | null) {\n const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);\n if (!isTemplateRefOrNull) {\n throw new Error(`${property} must be a TemplateRef.`);\n }\n }\n\n static ngAcceptInputType_bbPermission: string | string[];\n static ngAcceptInputType_bbPermissionElse: TemplateRef<any>;\n static ngAcceptInputType_bbPermissionMode: PermissionsMode;\n\n}\n","import {ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree} from '@angular/router';\nimport {InjectionToken, Provider} from '@angular/core';\n\nexport class PermissionsConfig {\n provider?: Provider;\n localPermissions?: LocalPermissionsData;\n onPermissionDenied?: (router: Router, snapshot: ActivatedRouteSnapshot, state: RouterStateSnapshot) => UrlTree;\n}\n\nexport interface PermissionsOptions {\n mode?: PermissionsMode;\n}\n\nexport type PermissionsMode = 'and' | 'or' | 'not';\nexport type LocalPermissionsData<T extends string = any> = Record<string, T[] | '*'>;\n\nexport const PERMISSIONS_CONFIG: InjectionToken<PermissionsConfig> = new InjectionToken('permissions config');\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {PermissionsOptions, PERMISSIONS_CONFIG} from '../permissions.interface';\nimport {Permissions} from '../permissions.service';\nimport {inject} from '@angular/core';\n\nexport const bbPermissionGuard = (value: string | string[], options?: PermissionsOptions): CanActivateFn => {\n return (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const router = inject(Router);\n const permissions = inject(Permissions);\n const config = inject(PERMISSIONS_CONFIG, {optional: true});\n\n const valid = permissions.hasSync(value, options);\n if (valid) {\n return true;\n }\n\n const onPermissionDeniedFn = config?.onPermissionDenied ?? null;\n if (!onPermissionDeniedFn) {\n return false;\n }\n\n const urlTree = onPermissionDeniedFn(router, route, state);\n if (!urlTree) {\n return false;\n }\n\n return valid ? true : urlTree;\n };\n};\n","import {EnvironmentProviders, makeEnvironmentProviders, Provider} from '@angular/core';\nimport {PERMISSIONS_CONFIG, PermissionsConfig} from './permissions.interface';\nimport {LocalPermissionsHandler} from './handlers/local.handler';\nimport {PermissionsHandler} from './handlers/abstract.handler';\nimport {Auth} from '@bravobit/bb-foundation/auth';\n\nexport function providePermissionsConfig(config?: PermissionsConfig): EnvironmentProviders {\n const defaultProvider: Provider = {\n provide: PermissionsHandler,\n deps: [Auth],\n useFactory: (auth: Auth) => {\n return new LocalPermissionsHandler(auth, config?.localPermissions ?? {});\n }\n };\n\n const permissionHandlerProvider = config?.provider ?? defaultProvider;\n\n return makeEnvironmentProviders([\n {provide: PERMISSIONS_CONFIG, useValue: config},\n permissionHandlerProvider\n ]);\n}\n","import {BbPermission} from './directives/permission.directive';\nimport {providePermissionsConfig} from './permissions.config';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {PermissionsConfig} from './permissions.interface';\n\n@NgModule({\n imports: [BbPermission],\n exports: [BbPermission]\n})\nexport class PermissionsModule {\n\n static forRoot(config?: PermissionsConfig): ModuleWithProviders<PermissionsModule> {\n return {\n ngModule: PermissionsModule,\n providers: [\n providePermissionsConfig(config)\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PermissionsHandler","i1.Permissions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bravobit-bb-foundation-permissions.mjs","sources":["../../../projects/bb-foundation/permissions/src/lib/handlers/abstract.handler.ts","../../../projects/bb-foundation/permissions/src/lib/handlers/local.handler.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.service.ts","../../../projects/bb-foundation/permissions/src/lib/directives/permission.directive.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.interface.ts","../../../projects/bb-foundation/permissions/src/lib/guards/permission.guard.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.config.ts","../../../projects/bb-foundation/permissions/src/lib/permissions.module.ts","../../../projects/bb-foundation/permissions/src/bravobit-bb-foundation-permissions.ts"],"sourcesContent":["import {Observable} from 'rxjs';\n\nexport abstract class PermissionsHandler {\n\n abstract get(): Observable<string[]> | string[];\n\n}\n","import {LocalPermissionsData} from '../permissions.interface';\nimport {PermissionsHandler} from './abstract.handler';\nimport {Auth} from '@bravobit/bb-foundation/auth';\nimport {map} from 'rxjs/operators';\n\nexport class LocalPermissionsHandler extends PermissionsHandler {\n\n constructor(protected auth: Auth,\n protected localPermissions: LocalPermissionsData) {\n super();\n }\n\n override get() {\n return this.auth.user.pipe(\n map(user => user?.role ?? null),\n map(role => {\n if (role === null || role === undefined) {\n return [];\n }\n\n return this.getPermissionsForRole(role);\n })\n );\n }\n\n protected getPermissionsForRole(role: string) {\n return Object.keys(this.localPermissions ?? {}).reduce((previous, current) => {\n const roles = this.localPermissions?.[current] ?? [];\n if (roles === '*' || roles?.includes(role)) {\n return [...previous, current];\n }\n\n return previous;\n }, []);\n }\n\n}\n","import {BehaviorSubject, isObservable, of, Subscription} from 'rxjs';\nimport {PermissionsHandler} from './handlers/abstract.handler';\nimport {PermissionsOptions} from './permissions.interface';\nimport {distinctUntilChanged, map} from 'rxjs/operators';\nimport {Injectable, OnDestroy} from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class Permissions implements OnDestroy {\n\n // State.\n private _activePermissions$ = new BehaviorSubject<string[]>([]);\n\n // Subscriptions.\n private _subscription = new Subscription();\n\n constructor(private _handler: PermissionsHandler) {\n this.trackPermissions();\n }\n\n ngOnDestroy() {\n this._subscription?.unsubscribe();\n }\n\n all() {\n return this._activePermissions$.asObservable();\n }\n\n allSync() {\n return this._activePermissions$.getValue();\n }\n\n has(value: string | string[], options?: PermissionsOptions) {\n const requiredPermissions = this.getRequiredPermissions(value);\n if (requiredPermissions?.length <= 0) {\n return of(false);\n }\n\n return this._activePermissions$.pipe(\n map(activePermissions => this.hasPermission(requiredPermissions, activePermissions, options)),\n distinctUntilChanged()\n );\n }\n\n hasSync(value: string | string[], options?: PermissionsOptions) {\n const requiredPermissions = this.getRequiredPermissions(value);\n if (requiredPermissions?.length <= 0) {\n return false;\n }\n\n const activePermissions = this._activePermissions$.getValue();\n return this.hasPermission(requiredPermissions, activePermissions, options);\n }\n\n private hasPermission(requiredPermissions: string[], activePermissions: string[], options?: PermissionsOptions) {\n const mode = options?.mode ?? 'and';\n switch (mode) {\n case 'or':\n return this.verifyModeOr(requiredPermissions, activePermissions);\n case 'not':\n return this.verifyModeNot(requiredPermissions, activePermissions);\n case 'and':\n default:\n return this.verifyModeAnd(requiredPermissions, activePermissions);\n }\n }\n\n private verifyModeAnd(permissions: string[], activePermissions: string[]) {\n for (const permission of permissions) {\n const verified = activePermissions?.includes(permission);\n if (!verified) {\n return false;\n }\n }\n\n return true;\n }\n\n private verifyModeNot(permissions: string[], activePermissions: string[]) {\n for (const permission of permissions) {\n if (activePermissions.includes(permission)) {\n return false;\n }\n }\n\n return true;\n }\n\n private verifyModeOr(permissions: string[], activePermissions: string[]) {\n for (const permission of permissions) {\n const verified = activePermissions?.includes(permission);\n if (verified) {\n return true;\n }\n }\n\n return false;\n }\n\n private getRequiredPermissions(value: string | string[]) {\n return Array.isArray(value)\n ? value\n : [value];\n }\n\n private trackPermissions() {\n const data = this._handler.get();\n const permissions$ = isObservable(data) ? data : of(data);\n\n const subscription = permissions$.subscribe(permissions => {\n this._activePermissions$.next(permissions ?? []);\n });\n this._subscription.add(subscription);\n }\n\n}\n","import {Directive, EmbeddedViewRef, inject, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef} from '@angular/core';\nimport {BehaviorSubject, combineLatest, Subscription} from 'rxjs';\nimport {distinctUntilChanged, switchMap} from 'rxjs/operators';\nimport {PermissionsMode} from '../permissions.interface';\nimport {Permissions} from '../permissions.service';\n\n@Directive({\n selector: 'ng-template[bbPermission]'\n})\nexport class BbPermission implements OnInit, OnDestroy {\n\n // Dependencies.\n private readonly _permissions: Permissions = inject(Permissions);\n private readonly _templateRef: TemplateRef<any> = inject(TemplateRef);\n private readonly _viewContainerRef: ViewContainerRef = inject(ViewContainerRef);\n\n // Templates.\n private _elseTemplateRef: TemplateRef<any> | null = null;\n\n // View refs.\n private _thenViewRef: EmbeddedViewRef<any> | null = null;\n private _elseViewRef: EmbeddedViewRef<any> | null = null;\n\n // Data.\n private _valid: boolean = false;\n private _permission$ = new BehaviorSubject<string[]>([]);\n private _mode$ = new BehaviorSubject<PermissionsMode>('and');\n\n @Input()\n set bbPermission(value: string | string[]) {\n const permissions = Array.isArray(value) ? value : [value];\n this._permission$.next(permissions);\n this.updateView();\n }\n\n @Input()\n set bbPermissionElse(templateRef: TemplateRef<any>) {\n this.assertTemplate('bbPermissionElse', templateRef);\n this._elseTemplateRef = templateRef;\n this.updateView();\n }\n\n @Input()\n set bbPermissionMode(mode: PermissionsMode) {\n this._mode$.next(mode);\n }\n\n // Subscriptions.\n private _subscription = new Subscription();\n\n ngOnInit() {\n const check$ = combineLatest([this._permission$, this._mode$]).pipe(\n switchMap(([permissions, mode]) => this._permissions.has(permissions, {mode})),\n distinctUntilChanged()\n );\n\n const subscription = check$.subscribe(valid => {\n this._valid = valid;\n this.updateView();\n });\n this._subscription.add(subscription);\n }\n\n ngOnDestroy() {\n this._subscription?.unsubscribe();\n }\n\n private updateView() {\n if (this._valid) {\n if (!this._thenViewRef) {\n this._viewContainerRef.clear();\n this._elseViewRef = null;\n if (this._templateRef) {\n this._thenViewRef = this._viewContainerRef.createEmbeddedView(this._templateRef);\n }\n }\n } else {\n if (!this._elseViewRef) {\n this._viewContainerRef.clear();\n this._thenViewRef = null;\n if (this._elseTemplateRef) {\n this._elseViewRef = this._viewContainerRef.createEmbeddedView(this._elseTemplateRef);\n }\n }\n }\n }\n\n private assertTemplate(property: string, templateRef: TemplateRef<any> | null) {\n const isTemplateRefOrNull = !!(!templateRef || templateRef.createEmbeddedView);\n if (!isTemplateRefOrNull) {\n throw new Error(`${property} must be a TemplateRef.`);\n }\n }\n\n static ngAcceptInputType_bbPermission: string | string[];\n static ngAcceptInputType_bbPermissionElse: TemplateRef<any>;\n static ngAcceptInputType_bbPermissionMode: PermissionsMode;\n\n}\n","import {ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree} from '@angular/router';\nimport {InjectionToken, Provider} from '@angular/core';\n\nexport class PermissionsConfig {\n provider?: Provider;\n localPermissions?: LocalPermissionsData;\n onPermissionDenied?: (router: Router, snapshot: ActivatedRouteSnapshot, state: RouterStateSnapshot) => UrlTree;\n}\n\nexport interface PermissionsOptions {\n mode?: PermissionsMode;\n}\n\nexport type PermissionsMode = 'and' | 'or' | 'not';\nexport type LocalPermissionsData<T extends string = any> = Record<string, T[] | '*'>;\n\nexport const PERMISSIONS_CONFIG: InjectionToken<PermissionsConfig> = new InjectionToken('permissions config');\n","import {ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot} from '@angular/router';\nimport {PermissionsOptions, PERMISSIONS_CONFIG} from '../permissions.interface';\nimport {Permissions} from '../permissions.service';\nimport {inject} from '@angular/core';\n\nexport const bbPermissionGuard = (value: string | string[], options?: PermissionsOptions): CanActivateFn => {\n return (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const router = inject(Router);\n const permissions = inject(Permissions);\n const config = inject(PERMISSIONS_CONFIG, {optional: true});\n\n const valid = permissions.hasSync(value, options);\n if (valid) {\n return true;\n }\n\n const onPermissionDeniedFn = config?.onPermissionDenied ?? null;\n if (!onPermissionDeniedFn) {\n return false;\n }\n\n const urlTree = onPermissionDeniedFn(router, route, state);\n if (!urlTree) {\n return false;\n }\n\n return valid ? true : urlTree;\n };\n};\n","import {EnvironmentProviders, makeEnvironmentProviders, Provider} from '@angular/core';\nimport {PERMISSIONS_CONFIG, PermissionsConfig} from './permissions.interface';\nimport {LocalPermissionsHandler} from './handlers/local.handler';\nimport {PermissionsHandler} from './handlers/abstract.handler';\nimport {Auth} from '@bravobit/bb-foundation/auth';\n\nexport function providePermissionsConfig(config?: PermissionsConfig): EnvironmentProviders {\n const defaultProvider: Provider = {\n provide: PermissionsHandler,\n deps: [Auth],\n useFactory: (auth: Auth) => {\n return new LocalPermissionsHandler(auth, config?.localPermissions ?? {});\n }\n };\n\n const permissionHandlerProvider = config?.provider ?? defaultProvider;\n\n return makeEnvironmentProviders([\n {provide: PERMISSIONS_CONFIG, useValue: config},\n permissionHandlerProvider\n ]);\n}\n","import {BbPermission} from './directives/permission.directive';\nimport {providePermissionsConfig} from './permissions.config';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {PermissionsConfig} from './permissions.interface';\n\n@NgModule({\n imports: [BbPermission],\n exports: [BbPermission]\n})\nexport class PermissionsModule {\n\n static forRoot(config?: PermissionsConfig): ModuleWithProviders<PermissionsModule> {\n return {\n ngModule: PermissionsModule,\n providers: [\n providePermissionsConfig(config)\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.PermissionsHandler"],"mappings":"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"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, RendererFactory2, LOCALE_ID, Injectable, EventEmitter, booleanAttribute, forwardRef, Component, ChangeDetectionStrategy, ViewEncapsulation,
|
|
2
|
+
import { InjectionToken, inject, RendererFactory2, LOCALE_ID, Injectable, NgZone, Renderer2, ElementRef, EventEmitter, booleanAttribute, forwardRef, Component, ChangeDetectionStrategy, ViewEncapsulation, HostBinding, Input, Output, makeEnvironmentProviders, NgModule } from '@angular/core';
|
|
3
3
|
import { Localize, LOCALIZE_ID } from '@bravobit/bb-foundation/localize';
|
|
4
|
-
import * as i1 from '@angular/cdk/platform';
|
|
5
4
|
import { Platform } from '@angular/cdk/platform';
|
|
6
5
|
import { DOCUMENT } from '@angular/common';
|
|
7
|
-
import * as i3 from 'rxjs';
|
|
8
6
|
import { BehaviorSubject, Subscription } from 'rxjs';
|
|
9
7
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
10
8
|
|
|
@@ -85,13 +83,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImpor
|
|
|
85
83
|
|
|
86
84
|
let nextUniqueId = 0;
|
|
87
85
|
class RecaptchaComponent {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
86
|
+
// Dependencies.
|
|
87
|
+
_zone = inject(NgZone);
|
|
88
|
+
_platform = inject(Platform);
|
|
89
|
+
_renderer = inject(Renderer2);
|
|
90
|
+
_elementRef = inject(ElementRef);
|
|
91
|
+
_loader = inject(RecaptchaLoader);
|
|
92
|
+
_localizeId = inject(LOCALIZE_ID);
|
|
93
|
+
_config = inject(RECAPTCHA_CONFIG, { optional: true });
|
|
95
94
|
// Host bindings.
|
|
96
95
|
id = `bb-recaptcha-${nextUniqueId++}`;
|
|
97
96
|
// Inputs.
|
|
@@ -115,14 +114,7 @@ class RecaptchaComponent {
|
|
|
115
114
|
_onTouched = null;
|
|
116
115
|
// Subscriptions.
|
|
117
116
|
_subscriptions = new Subscription();
|
|
118
|
-
constructor(
|
|
119
|
-
this._zone = _zone;
|
|
120
|
-
this._platform = _platform;
|
|
121
|
-
this._renderer = _renderer;
|
|
122
|
-
this._elementRef = _elementRef;
|
|
123
|
-
this._loader = _loader;
|
|
124
|
-
this._localizeId = _localizeId;
|
|
125
|
-
this._config = _config;
|
|
117
|
+
constructor() {
|
|
126
118
|
this.initializeProperties();
|
|
127
119
|
}
|
|
128
120
|
ngAfterViewInit() {
|
|
@@ -242,7 +234,7 @@ class RecaptchaComponent {
|
|
|
242
234
|
const newSrc = src.replace(/hl=(.*?)&/, `hl=${locale}&`);
|
|
243
235
|
this._renderer.setAttribute(frame, 'src', newSrc);
|
|
244
236
|
}
|
|
245
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: RecaptchaComponent, deps: [
|
|
237
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.4", ngImport: i0, type: RecaptchaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
246
238
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "19.0.4", type: RecaptchaComponent, isStandalone: true, selector: "bb-recaptcha", inputs: { id: "id", siteKey: "siteKey", tabIndex: "tabIndex", type: "type", size: "size", theme: "theme", badge: "badge", errorMode: "errorMode", grouped: ["grouped", "grouped", booleanAttribute] }, outputs: { resolved: "resolved", error: "error" }, host: { properties: { "class.grouped": "grouped", "attr.id": "this.id" }, classAttribute: "bb-recaptcha" }, providers: [
|
|
247
239
|
{
|
|
248
240
|
provide: NG_VALUE_ACCESSOR,
|
|
@@ -263,15 +255,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.4", ngImpor
|
|
|
263
255
|
'class': 'bb-recaptcha',
|
|
264
256
|
'[class.grouped]': 'grouped'
|
|
265
257
|
}, template: "", styles: [".bb-recaptcha{display:block}.bb-recaptcha.grouped{margin-bottom:1.5rem}\n"] }]
|
|
266
|
-
}], ctorParameters: () => [
|
|
267
|
-
type: Inject,
|
|
268
|
-
args: [LOCALIZE_ID]
|
|
269
|
-
}] }, { type: undefined, decorators: [{
|
|
270
|
-
type: Optional
|
|
271
|
-
}, {
|
|
272
|
-
type: Inject,
|
|
273
|
-
args: [RECAPTCHA_CONFIG]
|
|
274
|
-
}] }], propDecorators: { id: [{
|
|
258
|
+
}], ctorParameters: () => [], propDecorators: { id: [{
|
|
275
259
|
type: HostBinding,
|
|
276
260
|
args: ['attr.id']
|
|
277
261
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bravobit-bb-foundation-recaptcha.mjs","sources":["../../../projects/bb-foundation/recaptcha/src/lib/recaptcha.interface.ts","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha-loader.service.ts","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha/recaptcha.component.ts","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha/recaptcha.component.html","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha.config.ts","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha.module.ts","../../../projects/bb-foundation/recaptcha/src/bravobit-bb-foundation-recaptcha.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport const RECAPTCHA_CONFIG = new InjectionToken<RecaptchaConfig>('bb-recaptcha-config');\n\nexport interface RecaptchaConfig {\n baseUrl?: string;\n nonce?: string;\n siteKey?: string;\n theme?: ReCaptchaV2.Theme;\n type?: ReCaptchaV2.Type;\n size?: ReCaptchaV2.Size;\n badge?: ReCaptchaV2.Badge;\n}\n\nexport type NeverUndefined<T> = T extends undefined ? never : T;\nexport type RecaptchaErrorParameters = Parameters<NeverUndefined<ReCaptchaV2.Parameters['error-callback']>>;\n","import {inject, Injectable, LOCALE_ID, RendererFactory2} from '@angular/core';\nimport {Localize} from '@bravobit/bb-foundation/localize';\nimport {RECAPTCHA_CONFIG} from './recaptcha.interface';\nimport {Platform} from '@angular/cdk/platform';\nimport {DOCUMENT} from '@angular/common';\nimport {BehaviorSubject} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RecaptchaLoader {\n\n // Dependencies.\n private readonly _platform = inject(Platform);\n private readonly _rendererFactory = inject(RendererFactory2);\n private readonly _config = inject(RECAPTCHA_CONFIG);\n private readonly _localize = inject(Localize, {optional: true});\n private readonly _localeId = inject(LOCALE_ID, {optional: true});\n private readonly _document = inject(DOCUMENT, {optional: true});\n private readonly _renderer = this._rendererFactory.createRenderer(null, null);\n\n // Ready state.\n readonly ready$: BehaviorSubject<ReCaptchaV2.ReCaptcha | null> | null = null;\n\n // Data.\n private readonly _windowLoadFn: string = 'bbRecaptchaLoad';\n\n constructor() {\n // Set the ready subject if not exists.\n if (this.ready$) {\n return;\n }\n this.ready$ = new BehaviorSubject<ReCaptchaV2.ReCaptcha | null>(null);\n\n // Create the script.\n this.createScript(captcha => this.ready$.next(captcha));\n }\n\n private createScript(callback: (grecaptcha: ReCaptchaV2.ReCaptcha) => void) {\n // Validate we are on a browser.\n if (!this._platform.isBrowser) {\n return;\n }\n\n // Create the script.\n const script = this._renderer.createElement('script');\n\n // Set properties on the script.\n this._renderer.setProperty(script, 'src', this.getUrl());\n this._renderer.setProperty(script, 'async', true);\n this._renderer.setProperty(script, 'defer', true);\n\n // Set the nonce.\n if (this._config.nonce) {\n this._renderer.setAttribute(script, 'nonce', this._config.nonce);\n }\n\n // Set the loading function.\n if (this._platform.isBrowser) {\n window[this._windowLoadFn] = () => callback(grecaptcha);\n }\n\n // Append the script tag.\n this._renderer.appendChild(this._document?.body, script);\n }\n\n private getUrl() {\n const baseUrl = this._config?.baseUrl ?? 'https://www.google.com/recaptcha/api.js';\n return [baseUrl, this.getQueryParams()]\n .filter(item => !!item)\n .join('?');\n }\n\n private getQueryParams() {\n const localeId = this._localize?.current?.id ?? this._localeId ?? null;\n const params = {\n render: 'explicit',\n onload: this._windowLoadFn ?? null,\n hl: localeId\n };\n\n return Object.keys(params)\n .map(key => ({key, value: params[key]}))\n .filter(item => !!item.value)\n .map(item => `${item?.key}=${item?.value}`)\n .join('&');\n }\n\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n Output,\n Renderer2,\n ViewEncapsulation\n} from '@angular/core';\nimport {RECAPTCHA_CONFIG, RecaptchaConfig, RecaptchaErrorParameters} from '../recaptcha.interface';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {LOCALIZE_ID} from '@bravobit/bb-foundation/localize';\nimport {RecaptchaLoader} from '../recaptcha-loader.service';\nimport {Platform} from '@angular/cdk/platform';\nimport {Observable, Subscription} from 'rxjs';\n\nlet nextUniqueId = 0;\n\n@Component({\n selector: 'bb-recaptcha',\n templateUrl: './recaptcha.component.html',\n styleUrls: ['./recaptcha.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'bbRecaptcha',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RecaptchaComponent),\n multi: true\n }\n ],\n host: {\n 'class': 'bb-recaptcha',\n '[class.grouped]': 'grouped'\n },\n})\nexport class RecaptchaComponent implements ControlValueAccessor, AfterViewInit, OnDestroy {\n\n // Host bindings.\n @HostBinding('attr.id') @Input() id: string = `bb-recaptcha-${nextUniqueId++}`;\n\n // Inputs.\n @Input() siteKey: string | null = null;\n @Input() tabIndex: number | null = null;\n @Input() type: ReCaptchaV2.Type | null = null;\n @Input() size: ReCaptchaV2.Size | null = null;\n @Input() theme: ReCaptchaV2.Theme | null = null;\n @Input() badge: ReCaptchaV2.Badge | null = null;\n @Input() errorMode: 'handled' | 'default' = 'default';\n @Input({transform: booleanAttribute}) grouped: boolean = false;\n\n // Outputs.\n @Output() resolved = new EventEmitter<string>();\n @Output() error = new EventEmitter<RecaptchaErrorParameters>();\n\n // Data.\n private _widgetId: number | null = null;\n private _grecaptcha: ReCaptchaV2.ReCaptcha | null = null;\n private _executeRequested: boolean = false;\n\n // Form methods.\n private _onChange: (value: string) => void | null = null;\n private _onTouched: () => void | null = null;\n\n // Subscriptions.\n private _subscriptions = new Subscription();\n\n constructor(private _zone: NgZone,\n private _platform: Platform,\n private _renderer: Renderer2,\n private _elementRef: ElementRef,\n private _loader: RecaptchaLoader,\n @Inject(LOCALIZE_ID) private _localizeId: Observable<string>,\n @Optional() @Inject(RECAPTCHA_CONFIG) private _config?: RecaptchaConfig) {\n this.initializeProperties();\n }\n\n ngAfterViewInit() {\n this.handleOnLoad();\n this.handleLocaleChanges();\n }\n\n ngOnDestroy() {\n // Reset the captcha.\n this.resetCaptchaElement();\n\n // Unsubscribe of ready data.\n this._subscriptions?.unsubscribe();\n }\n\n execute() {\n // Check if the captcha is invisible.\n if (this.size !== 'invisible') {\n return;\n }\n\n // Check if the widget exists else return.\n if (this._widgetId == null) {\n this._executeRequested = true;\n return;\n }\n\n // Execute the captcha.\n this._grecaptcha.execute(this._widgetId).then(_ => _);\n }\n\n reset() {\n if (this._widgetId == null) {\n return;\n }\n\n if (this._grecaptcha.getResponse(this._widgetId)) {\n this.resolved.emit(null);\n }\n\n this.resetCaptchaElement();\n }\n\n writeValue(value: string) {\n if (value) {\n return;\n }\n\n this.reset();\n }\n\n registerOnChange(fn: (value: string) => void) {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this._onTouched = fn;\n }\n\n onResolve(event: string) {\n // Emit the value.\n this.resolved.emit(event);\n\n // Call the form functions.\n this._onChange?.(event);\n this._onTouched?.();\n }\n\n private renderCaptchaElement() {\n const parameters: ReCaptchaV2.Parameters = {\n badge: this.badge,\n sitekey: this.siteKey,\n size: this.size,\n tabindex: this.tabIndex,\n theme: this.theme,\n type: this.type,\n 'callback': (response: string) => this._zone.run(() => this.onResolve(response)),\n 'expired-callback': () => this._zone.run(() => this.onResolve(null))\n };\n\n if (this.errorMode === 'handled') {\n parameters['error-callback'] = (...args: RecaptchaErrorParameters) => {\n return this._zone.run(() => this.error.emit(args));\n };\n }\n\n this._widgetId = this._grecaptcha.render(this._elementRef.nativeElement, parameters);\n\n if (this._executeRequested) {\n this._executeRequested = false;\n this.execute();\n }\n }\n\n private resetCaptchaElement() {\n if (this._widgetId == null) {\n return;\n }\n\n this._zone.runOutsideAngular(() => this._grecaptcha.reset(this._widgetId));\n }\n\n private initializeProperties() {\n this.siteKey = this.siteKey ?? this._config?.siteKey;\n this.theme = this.theme ?? this._config?.theme;\n this.size = this.size ?? this._config?.size;\n this.type = this.type ?? this._config?.type;\n this.badge = this.badge ?? this._config?.badge;\n }\n\n private handleOnLoad() {\n const subscription = this._loader.ready$.subscribe((grecaptcha: ReCaptchaV2.ReCaptcha) => {\n if (grecaptcha == null || !(grecaptcha.render instanceof Function)) {\n return;\n }\n\n this._grecaptcha = grecaptcha;\n this.renderCaptchaElement();\n });\n\n this._subscriptions.add(subscription);\n }\n\n private handleLocaleChanges() {\n const subscription = this._localizeId.subscribe(locale => this.onLocaleChanged(locale));\n this._subscriptions.add(subscription);\n }\n\n private onLocaleChanged(locale: string) {\n const element = this._elementRef?.nativeElement ?? null;\n if (!element || !this._platform.isBrowser) {\n return;\n }\n\n const frame = element?.querySelector('iframe');\n if (!frame) {\n return;\n }\n\n const src = frame.getAttribute('src');\n const currentLanguageId = src.match(/hl=(.*?)&/).pop();\n if (currentLanguageId === locale) {\n return;\n }\n\n const newSrc = src.replace(/hl=(.*?)&/, `hl=${locale}&`);\n this._renderer.setAttribute(frame, 'src', newSrc);\n }\n\n}\n","","import {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport {RECAPTCHA_CONFIG, RecaptchaConfig} from './recaptcha.interface';\n\nexport function provideRecaptchaConfig(config: RecaptchaConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {provide: RECAPTCHA_CONFIG, useValue: config}\n ]);\n}\n","import {RecaptchaComponent} from './recaptcha/recaptcha.component';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {RecaptchaLoader} from './recaptcha-loader.service';\nimport {provideRecaptchaConfig} from './recaptcha.config';\nimport {RecaptchaConfig} from './recaptcha.interface';\n\n@NgModule({\n imports: [RecaptchaComponent],\n exports: [RecaptchaComponent]\n})\nexport class RecaptchaModule {\n\n static forRoot(config?: RecaptchaConfig): ModuleWithProviders<RecaptchaModule> {\n return {\n ngModule: RecaptchaModule,\n providers: [\n provideRecaptchaConfig(config),\n RecaptchaLoader\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i2.RecaptchaLoader"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bravobit-bb-foundation-recaptcha.mjs","sources":["../../../projects/bb-foundation/recaptcha/src/lib/recaptcha.interface.ts","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha-loader.service.ts","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha/recaptcha.component.ts","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha/recaptcha.component.html","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha.config.ts","../../../projects/bb-foundation/recaptcha/src/lib/recaptcha.module.ts","../../../projects/bb-foundation/recaptcha/src/bravobit-bb-foundation-recaptcha.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport const RECAPTCHA_CONFIG = new InjectionToken<RecaptchaConfig>('bb-recaptcha-config');\n\nexport interface RecaptchaConfig {\n baseUrl?: string;\n nonce?: string;\n siteKey?: string;\n theme?: ReCaptchaV2.Theme;\n type?: ReCaptchaV2.Type;\n size?: ReCaptchaV2.Size;\n badge?: ReCaptchaV2.Badge;\n}\n\nexport type NeverUndefined<T> = T extends undefined ? never : T;\nexport type RecaptchaErrorParameters = Parameters<NeverUndefined<ReCaptchaV2.Parameters['error-callback']>>;\n","import {inject, Injectable, LOCALE_ID, RendererFactory2} from '@angular/core';\nimport {Localize} from '@bravobit/bb-foundation/localize';\nimport {RECAPTCHA_CONFIG} from './recaptcha.interface';\nimport {Platform} from '@angular/cdk/platform';\nimport {DOCUMENT} from '@angular/common';\nimport {BehaviorSubject} from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RecaptchaLoader {\n\n // Dependencies.\n private readonly _platform = inject(Platform);\n private readonly _rendererFactory = inject(RendererFactory2);\n private readonly _config = inject(RECAPTCHA_CONFIG);\n private readonly _localize = inject(Localize, {optional: true});\n private readonly _localeId = inject(LOCALE_ID, {optional: true});\n private readonly _document = inject(DOCUMENT, {optional: true});\n private readonly _renderer = this._rendererFactory.createRenderer(null, null);\n\n // Ready state.\n readonly ready$: BehaviorSubject<ReCaptchaV2.ReCaptcha | null> | null = null;\n\n // Data.\n private readonly _windowLoadFn: string = 'bbRecaptchaLoad';\n\n constructor() {\n // Set the ready subject if not exists.\n if (this.ready$) {\n return;\n }\n this.ready$ = new BehaviorSubject<ReCaptchaV2.ReCaptcha | null>(null);\n\n // Create the script.\n this.createScript(captcha => this.ready$.next(captcha));\n }\n\n private createScript(callback: (grecaptcha: ReCaptchaV2.ReCaptcha) => void) {\n // Validate we are on a browser.\n if (!this._platform.isBrowser) {\n return;\n }\n\n // Create the script.\n const script = this._renderer.createElement('script');\n\n // Set properties on the script.\n this._renderer.setProperty(script, 'src', this.getUrl());\n this._renderer.setProperty(script, 'async', true);\n this._renderer.setProperty(script, 'defer', true);\n\n // Set the nonce.\n if (this._config.nonce) {\n this._renderer.setAttribute(script, 'nonce', this._config.nonce);\n }\n\n // Set the loading function.\n if (this._platform.isBrowser) {\n window[this._windowLoadFn] = () => callback(grecaptcha);\n }\n\n // Append the script tag.\n this._renderer.appendChild(this._document?.body, script);\n }\n\n private getUrl() {\n const baseUrl = this._config?.baseUrl ?? 'https://www.google.com/recaptcha/api.js';\n return [baseUrl, this.getQueryParams()]\n .filter(item => !!item)\n .join('?');\n }\n\n private getQueryParams() {\n const localeId = this._localize?.current?.id ?? this._localeId ?? null;\n const params = {\n render: 'explicit',\n onload: this._windowLoadFn ?? null,\n hl: localeId\n };\n\n return Object.keys(params)\n .map(key => ({key, value: params[key]}))\n .filter(item => !!item.value)\n .map(item => `${item?.key}=${item?.value}`)\n .join('&');\n }\n\n}\n","import {\n AfterViewInit,\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n inject,\n Input,\n NgZone,\n OnDestroy,\n Output,\n Renderer2,\n ViewEncapsulation\n} from '@angular/core';\nimport {RECAPTCHA_CONFIG, RecaptchaConfig, RecaptchaErrorParameters} from '../recaptcha.interface';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {LOCALIZE_ID} from '@bravobit/bb-foundation/localize';\nimport {RecaptchaLoader} from '../recaptcha-loader.service';\nimport {Platform} from '@angular/cdk/platform';\nimport {Observable, Subscription} from 'rxjs';\n\nlet nextUniqueId = 0;\n\n@Component({\n selector: 'bb-recaptcha',\n templateUrl: './recaptcha.component.html',\n styleUrls: ['./recaptcha.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'bbRecaptcha',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RecaptchaComponent),\n multi: true\n }\n ],\n host: {\n 'class': 'bb-recaptcha',\n '[class.grouped]': 'grouped'\n }\n})\nexport class RecaptchaComponent implements ControlValueAccessor, AfterViewInit, OnDestroy {\n\n // Dependencies.\n private readonly _zone: NgZone = inject(NgZone);\n private readonly _platform: Platform = inject(Platform);\n private readonly _renderer: Renderer2 = inject(Renderer2);\n private readonly _elementRef: ElementRef = inject(ElementRef);\n private readonly _loader: RecaptchaLoader = inject(RecaptchaLoader);\n private readonly _localizeId: Observable<string> = inject(LOCALIZE_ID);\n private readonly _config?: RecaptchaConfig = inject(RECAPTCHA_CONFIG, {optional: true});\n\n // Host bindings.\n @HostBinding('attr.id') @Input() id: string = `bb-recaptcha-${nextUniqueId++}`;\n\n // Inputs.\n @Input() siteKey: string | null = null;\n @Input() tabIndex: number | null = null;\n @Input() type: ReCaptchaV2.Type | null = null;\n @Input() size: ReCaptchaV2.Size | null = null;\n @Input() theme: ReCaptchaV2.Theme | null = null;\n @Input() badge: ReCaptchaV2.Badge | null = null;\n @Input() errorMode: 'handled' | 'default' = 'default';\n @Input({transform: booleanAttribute}) grouped: boolean = false;\n\n // Outputs.\n @Output() resolved = new EventEmitter<string>();\n @Output() error = new EventEmitter<RecaptchaErrorParameters>();\n\n // Data.\n private _widgetId: number | null = null;\n private _grecaptcha: ReCaptchaV2.ReCaptcha | null = null;\n private _executeRequested: boolean = false;\n\n // Form methods.\n private _onChange: (value: string) => void | null = null;\n private _onTouched: () => void | null = null;\n\n // Subscriptions.\n private _subscriptions = new Subscription();\n\n constructor() {\n this.initializeProperties();\n }\n\n ngAfterViewInit() {\n this.handleOnLoad();\n this.handleLocaleChanges();\n }\n\n ngOnDestroy() {\n // Reset the captcha.\n this.resetCaptchaElement();\n\n // Unsubscribe of ready data.\n this._subscriptions?.unsubscribe();\n }\n\n execute() {\n // Check if the captcha is invisible.\n if (this.size !== 'invisible') {\n return;\n }\n\n // Check if the widget exists else return.\n if (this._widgetId == null) {\n this._executeRequested = true;\n return;\n }\n\n // Execute the captcha.\n this._grecaptcha.execute(this._widgetId).then(_ => _);\n }\n\n reset() {\n if (this._widgetId == null) {\n return;\n }\n\n if (this._grecaptcha.getResponse(this._widgetId)) {\n this.resolved.emit(null);\n }\n\n this.resetCaptchaElement();\n }\n\n writeValue(value: string) {\n if (value) {\n return;\n }\n\n this.reset();\n }\n\n registerOnChange(fn: (value: string) => void) {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this._onTouched = fn;\n }\n\n onResolve(event: string) {\n // Emit the value.\n this.resolved.emit(event);\n\n // Call the form functions.\n this._onChange?.(event);\n this._onTouched?.();\n }\n\n private renderCaptchaElement() {\n const parameters: ReCaptchaV2.Parameters = {\n badge: this.badge,\n sitekey: this.siteKey,\n size: this.size,\n tabindex: this.tabIndex,\n theme: this.theme,\n type: this.type,\n 'callback': (response: string) => this._zone.run(() => this.onResolve(response)),\n 'expired-callback': () => this._zone.run(() => this.onResolve(null))\n };\n\n if (this.errorMode === 'handled') {\n parameters['error-callback'] = (...args: RecaptchaErrorParameters) => {\n return this._zone.run(() => this.error.emit(args));\n };\n }\n\n this._widgetId = this._grecaptcha.render(this._elementRef.nativeElement, parameters);\n\n if (this._executeRequested) {\n this._executeRequested = false;\n this.execute();\n }\n }\n\n private resetCaptchaElement() {\n if (this._widgetId == null) {\n return;\n }\n\n this._zone.runOutsideAngular(() => this._grecaptcha.reset(this._widgetId));\n }\n\n private initializeProperties() {\n this.siteKey = this.siteKey ?? this._config?.siteKey;\n this.theme = this.theme ?? this._config?.theme;\n this.size = this.size ?? this._config?.size;\n this.type = this.type ?? this._config?.type;\n this.badge = this.badge ?? this._config?.badge;\n }\n\n private handleOnLoad() {\n const subscription = this._loader.ready$.subscribe((grecaptcha: ReCaptchaV2.ReCaptcha) => {\n if (grecaptcha == null || !(grecaptcha.render instanceof Function)) {\n return;\n }\n\n this._grecaptcha = grecaptcha;\n this.renderCaptchaElement();\n });\n\n this._subscriptions.add(subscription);\n }\n\n private handleLocaleChanges() {\n const subscription = this._localizeId.subscribe(locale => this.onLocaleChanged(locale));\n this._subscriptions.add(subscription);\n }\n\n private onLocaleChanged(locale: string) {\n const element = this._elementRef?.nativeElement ?? null;\n if (!element || !this._platform.isBrowser) {\n return;\n }\n\n const frame = element?.querySelector('iframe');\n if (!frame) {\n return;\n }\n\n const src = frame.getAttribute('src');\n const currentLanguageId = src.match(/hl=(.*?)&/).pop();\n if (currentLanguageId === locale) {\n return;\n }\n\n const newSrc = src.replace(/hl=(.*?)&/, `hl=${locale}&`);\n this._renderer.setAttribute(frame, 'src', newSrc);\n }\n\n}\n","","import {EnvironmentProviders, makeEnvironmentProviders} from '@angular/core';\nimport {RECAPTCHA_CONFIG, RecaptchaConfig} from './recaptcha.interface';\n\nexport function provideRecaptchaConfig(config: RecaptchaConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {provide: RECAPTCHA_CONFIG, useValue: config}\n ]);\n}\n","import {RecaptchaComponent} from './recaptcha/recaptcha.component';\nimport {ModuleWithProviders, NgModule} from '@angular/core';\nimport {RecaptchaLoader} from './recaptcha-loader.service';\nimport {provideRecaptchaConfig} from './recaptcha.config';\nimport {RecaptchaConfig} from './recaptcha.interface';\n\n@NgModule({\n imports: [RecaptchaComponent],\n exports: [RecaptchaComponent]\n})\nexport class RecaptchaModule {\n\n static forRoot(config?: RecaptchaConfig): ModuleWithProviders<RecaptchaModule> {\n return {\n ngModule: RecaptchaModule,\n providers: [\n provideRecaptchaConfig(config),\n RecaptchaLoader\n ]\n };\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|