@sumaris-net/ngx-components 1.22.9 → 1.22.11-rc10

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.
Files changed (42) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +752 -73
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +6 -0
  6. package/esm2015/public_api.js +11 -2
  7. package/esm2015/src/app/core/menu/menu.component.js +2 -2
  8. package/esm2015/src/app/shared/events.js +8 -3
  9. package/esm2015/src/app/shared/services/entity-service.class.js +1 -1
  10. package/esm2015/src/app/social/job/testing/job-progression.testing.js +48 -0
  11. package/esm2015/src/app/social/job/testing/job-progression.testing.service.js +30 -0
  12. package/esm2015/src/app/social/job/testing/job.testing.module.js +25 -0
  13. package/esm2015/src/app/social/social.module.js +6 -1
  14. package/esm2015/src/app/social/social.testing.module.js +39 -0
  15. package/esm2015/src/app/social/user-event/notification/user-event-notification.icon.js +94 -0
  16. package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +131 -30
  17. package/esm2015/src/app/social/user-event/testing/user-event.testing.js +179 -0
  18. package/esm2015/src/app/social/user-event/testing/user-event.testing.module.js +25 -0
  19. package/esm2015/src/app/social/user-event/testing/user-event.testing.service.js +35 -6
  20. package/esm2015/src/app/social/user-event/user-event.model.js +1 -1
  21. package/esm2015/src/app/social/user-event/user-event.module.js +4 -4
  22. package/esm2015/src/app/social/user-event/user-event.service.js +74 -17
  23. package/fesm2015/sumaris-net.ngx-components.js +637 -63
  24. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  25. package/package.json +1 -1
  26. package/public_api.d.ts +8 -1
  27. package/src/app/shared/events.d.ts +1 -1
  28. package/src/app/shared/services/entity-service.class.d.ts +7 -0
  29. package/src/app/social/job/testing/job-progression.testing.d.ts +11 -0
  30. package/src/app/social/job/testing/job-progression.testing.service.d.ts +10 -0
  31. package/src/app/social/job/testing/job.testing.module.d.ts +2 -0
  32. package/src/app/social/social.testing.module.d.ts +4 -0
  33. package/src/app/social/user-event/notification/{user-event-notification.component.d.ts → user-event-notification.icon.d.ts} +3 -2
  34. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +37 -12
  35. package/src/app/social/user-event/testing/user-event.testing.d.ts +23 -0
  36. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +2 -0
  37. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +4 -3
  38. package/src/app/social/user-event/user-event.model.d.ts +1 -0
  39. package/src/app/social/user-event/user-event.service.d.ts +16 -12
  40. package/src/theme/_ngx-components.scss +12 -0
  41. package/sumaris-net.ngx-components.metadata.json +1 -1
  42. package/esm2015/src/app/social/user-event/notification/user-event-notification.component.js +0 -89
@@ -0,0 +1,39 @@
1
+ import { RouterModule } from '@angular/router';
2
+ import { NgModule } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { TranslateModule } from '@ngx-translate/core';
5
+ import { JobTestingModule } from './job/testing/job.testing.module';
6
+ import { JobProgressionTestingPage } from './job/testing/job-progression.testing';
7
+ import { UserEventTestingModule } from './user-event/testing/user-event.testing.module';
8
+ import { UserEventTestingPage } from './user-event/testing/user-event.testing';
9
+ export const SOCIAL_TESTING_PAGES = [
10
+ { label: 'Social components', divider: true },
11
+ { label: 'User event', page: '/testing/social/user-event' },
12
+ { label: 'Job progression', page: '/testing/social/job-progression' }
13
+ ];
14
+ const routes = [
15
+ {
16
+ path: 'job-progression',
17
+ pathMatch: 'full',
18
+ component: JobProgressionTestingPage
19
+ },
20
+ {
21
+ path: 'user-event',
22
+ pathMatch: 'full',
23
+ component: UserEventTestingPage
24
+ },
25
+ ];
26
+ export class SocialTestingModule {
27
+ }
28
+ SocialTestingModule.decorators = [
29
+ { type: NgModule, args: [{
30
+ imports: [
31
+ CommonModule,
32
+ TranslateModule.forChild(),
33
+ RouterModule.forChild(routes),
34
+ JobTestingModule,
35
+ UserEventTestingModule
36
+ ],
37
+ },] }
38
+ ];
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLnRlc3RpbmcubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvc29jaWFsLnRlc3RpbmcubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFL0UsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWtCO0lBQ2pELEVBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUM7SUFDM0MsRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBQztJQUN6RCxFQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsaUNBQWlDLEVBQUM7Q0FDcEUsQ0FBQztBQUVGLE1BQU0sTUFBTSxHQUFXO0lBQ3JCO1FBQ0UsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixTQUFTLEVBQUUsTUFBTTtRQUNqQixTQUFTLEVBQUUseUJBQXlCO0tBQ3JDO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsWUFBWTtRQUNsQixTQUFTLEVBQUUsTUFBTTtRQUNqQixTQUFTLEVBQUUsb0JBQW9CO0tBQ2hDO0NBQ0YsQ0FBQztBQVlGLE1BQU0sT0FBTyxtQkFBbUI7OztZQVYvQixRQUFRLFNBQUM7Z0JBQ1IsT0FBTyxFQUFFO29CQUNQLFlBQVk7b0JBQ1osZUFBZSxDQUFDLFFBQVEsRUFBRTtvQkFDMUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7b0JBRTdCLGdCQUFnQjtvQkFDaEIsc0JBQXNCO2lCQUN2QjthQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVzdGluZ1BhZ2UgfSBmcm9tICcuLi9zaGFyZWQvdGVzdGluZy90ZXN0cy5wYWdlJztcbmltcG9ydCB7IFJvdXRlck1vZHVsZSwgUm91dGVzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBKb2JUZXN0aW5nTW9kdWxlIH0gZnJvbSAnLi9qb2IvdGVzdGluZy9qb2IudGVzdGluZy5tb2R1bGUnO1xuaW1wb3J0IHsgSm9iUHJvZ3Jlc3Npb25UZXN0aW5nUGFnZSB9IGZyb20gJy4vam9iL3Rlc3Rpbmcvam9iLXByb2dyZXNzaW9uLnRlc3RpbmcnO1xuaW1wb3J0IHsgVXNlckV2ZW50VGVzdGluZ01vZHVsZSB9IGZyb20gJy4vdXNlci1ldmVudC90ZXN0aW5nL3VzZXItZXZlbnQudGVzdGluZy5tb2R1bGUnO1xuaW1wb3J0IHsgVXNlckV2ZW50VGVzdGluZ1BhZ2UgfSBmcm9tICcuL3VzZXItZXZlbnQvdGVzdGluZy91c2VyLWV2ZW50LnRlc3RpbmcnO1xuXG5leHBvcnQgY29uc3QgU09DSUFMX1RFU1RJTkdfUEFHRVM6IFRlc3RpbmdQYWdlW10gPSBbXG4gIHtsYWJlbDogJ1NvY2lhbCBjb21wb25lbnRzJywgZGl2aWRlcjogdHJ1ZX0sXG4gIHtsYWJlbDogJ1VzZXIgZXZlbnQnLCBwYWdlOiAnL3Rlc3Rpbmcvc29jaWFsL3VzZXItZXZlbnQnfSxcbiAge2xhYmVsOiAnSm9iIHByb2dyZXNzaW9uJywgcGFnZTogJy90ZXN0aW5nL3NvY2lhbC9qb2ItcHJvZ3Jlc3Npb24nfVxuXTtcblxuY29uc3Qgcm91dGVzOiBSb3V0ZXMgPSBbXG4gIHtcbiAgICBwYXRoOiAnam9iLXByb2dyZXNzaW9uJyxcbiAgICBwYXRoTWF0Y2g6ICdmdWxsJyxcbiAgICBjb21wb25lbnQ6IEpvYlByb2dyZXNzaW9uVGVzdGluZ1BhZ2VcbiAgfSxcbiAge1xuICAgIHBhdGg6ICd1c2VyLWV2ZW50JyxcbiAgICBwYXRoTWF0Y2g6ICdmdWxsJyxcbiAgICBjb21wb25lbnQ6IFVzZXJFdmVudFRlc3RpbmdQYWdlXG4gIH0sXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZS5mb3JDaGlsZCgpLFxuICAgIFJvdXRlck1vZHVsZS5mb3JDaGlsZChyb3V0ZXMpLFxuXG4gICAgSm9iVGVzdGluZ01vZHVsZSxcbiAgICBVc2VyRXZlbnRUZXN0aW5nTW9kdWxlXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNvY2lhbFRlc3RpbmdNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,94 @@
1
+ import { __awaiter } from "tslib";
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Optional } from '@angular/core';
3
+ import { of } from 'rxjs';
4
+ import { PopoverController } from '@ionic/angular';
5
+ import { USER_EVENT_SERVICE } from '../user-event.service';
6
+ import { UserEventNotificationList } from './user-event-notification.list';
7
+ import { AccountService } from '../../../core/services/account.service';
8
+ import { map } from 'rxjs/operators';
9
+ import { isNil } from '../../../shared/functions';
10
+ export class AppUserEventNotificationIcon {
11
+ constructor(userEventService, accountService, popoverController) {
12
+ this.userEventService = userEventService;
13
+ this.accountService = accountService;
14
+ this.popoverController = popoverController;
15
+ this.debug = false;
16
+ this.titleI18n = 'SOCIAL.USER_EVENT.NOTIFICATION.TITLE';
17
+ this.disabled = false;
18
+ this.filter = null;
19
+ this._logPrefix = '[user-event-notification] ';
20
+ this._readEvent = new EventEmitter();
21
+ this._readEvents = new EventEmitter();
22
+ }
23
+ get countChanges() {
24
+ if (!this.userEventService)
25
+ return of();
26
+ return this.userEventService
27
+ .countSubject
28
+ .pipe(map(value => value === 0 ? undefined : value));
29
+ }
30
+ ngOnInit() {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ if (isNil(this.userEventService)) {
33
+ console.warn(`${this._logPrefix}No service injected`);
34
+ this.disabled = true;
35
+ return;
36
+ }
37
+ // Wait service
38
+ yield this.userEventService.ready();
39
+ // Subscribe to read event
40
+ this._readEvent.subscribe(value => {
41
+ // default: mark event as read
42
+ this.userEventService.markAsRead([value]);
43
+ });
44
+ this._readEvents.subscribe(value => {
45
+ this.userEventService.markAsRead(value);
46
+ });
47
+ });
48
+ }
49
+ showList(event) {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ // Reset count
52
+ this.userEventService.resetCount();
53
+ const popover = yield this.popoverController.create({
54
+ component: UserEventNotificationList,
55
+ componentProps: {
56
+ debug: this.debug,
57
+ titleI18n: this.titleI18n,
58
+ readEvent: this._readEvent,
59
+ readEvents: this._readEvents
60
+ },
61
+ backdropDismiss: true,
62
+ keyboardClose: true,
63
+ event,
64
+ translucent: true,
65
+ cssClass: 'popover-large popover-notifications'
66
+ });
67
+ yield popover.present();
68
+ });
69
+ }
70
+ ngOnDestroy() {
71
+ if (this.debug) {
72
+ console.debug(`${this._logPrefix}Destroying`);
73
+ }
74
+ }
75
+ }
76
+ AppUserEventNotificationIcon.decorators = [
77
+ { type: Component, args: [{
78
+ selector: 'app-user-event-notification-icon',
79
+ template: "<button\n #button\n mat-icon-button\n [title]=\"titleI18n | translate\"\n [disabled]=\"disabled\"\n (click)=\"showList($event)\"\n>\n <mat-icon\n [matBadge]=\"countChanges | async\"\n matBadgeColor=\"accent\"\n matBadgeSize=\"small\"\n matBadgePosition=\"above after\"\n >notifications\n </mat-icon>\n</button>\n\n",
80
+ changeDetection: ChangeDetectionStrategy.OnPush
81
+ },] }
82
+ ];
83
+ AppUserEventNotificationIcon.ctorParameters = () => [
84
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [USER_EVENT_SERVICE,] }] },
85
+ { type: AccountService },
86
+ { type: PopoverController }
87
+ ];
88
+ AppUserEventNotificationIcon.propDecorators = {
89
+ debug: [{ type: Input }],
90
+ titleI18n: [{ type: Input }],
91
+ disabled: [{ type: Input }],
92
+ filter: [{ type: Input }]
93
+ };
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmljb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SCxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBcUIsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUseUJBQXlCLEVBQW9DLE1BQU0sZ0NBQWdDLENBQUM7QUFFN0csT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFPbEQsTUFBTSxPQUFPLDRCQUE0QjtJQWtCdkMsWUFDaUQsZ0JBQTJFLEVBQ2hILGNBQThCLEVBQzlCLGlCQUFvQztRQUZDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBMkQ7UUFDaEgsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFuQnZDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQUcsc0NBQXNDLENBQUM7UUFDbkQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixXQUFNLEdBQVEsSUFBSSxDQUFDO1FBU3BCLGVBQVUsR0FBRyw0QkFBNEIsQ0FBQztRQUMxQyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFDakQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztJQU14RCxDQUFDO0lBZkwsSUFBSSxZQUFZO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQjthQUN6QixZQUFZO2FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBWUssUUFBUTs7WUFFWixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtnQkFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixPQUFPO2FBQ1I7WUFFRCxlQUFlO1lBQ2YsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFcEMsMEJBQTBCO1lBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNoQyw4QkFBOEI7Z0JBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO0tBQUE7SUFFSyxRQUFRLENBQUMsS0FBYzs7WUFDM0IsY0FBYztZQUNkLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUVuQyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xELFNBQVMsRUFBRSx5QkFBeUI7Z0JBQ3BDLGNBQWMsRUFBb0M7b0JBQ2hELEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztvQkFDakIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzFCLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVztpQkFDN0I7Z0JBQ0QsZUFBZSxFQUFFLElBQUk7Z0JBQ3JCLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixLQUFLO2dCQUNMLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixRQUFRLEVBQUUscUNBQXFDO2FBQ2hELENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFCLENBQUM7S0FBQTtJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsWUFBWSxDQUFDLENBQUM7U0FDL0M7SUFDSCxDQUFDOzs7WUEzRUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQ0FBa0M7Z0JBQzVDLDBWQUFrRDtnQkFDbEQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07YUFDaEQ7Ozs0Q0FvQkksUUFBUSxZQUFJLE1BQU0sU0FBQyxrQkFBa0I7WUE1QmpDLGNBQWM7WUFKZCxpQkFBaUI7OztvQkFldkIsS0FBSzt3QkFDTCxLQUFLO3VCQUNMLEtBQUs7cUJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBvcG92ZXJDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgSVVzZXJFdmVudFNlcnZpY2UsIFVTRVJfRVZFTlRfU0VSVklDRSB9IGZyb20gJy4uL3VzZXItZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0LCBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0T3B0aW9ucyB9IGZyb20gJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdCc7XG5pbXBvcnQgeyBJVXNlckV2ZW50LCBJVXNlckV2ZW50RmlsdGVyIH0gZnJvbSAnLi4vdXNlci1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC11c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1pY29uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmljb24uaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEFwcFVzZXJFdmVudE5vdGlmaWNhdGlvbkljb24gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgZGVidWcgPSBmYWxzZTtcbiAgQElucHV0KCkgdGl0bGVJMThuID0gJ1NPQ0lBTC5VU0VSX0VWRU5ULk5PVElGSUNBVElPTi5USVRMRSc7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZpbHRlcjogYW55ID0gbnVsbDtcblxuICBnZXQgY291bnRDaGFuZ2VzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKCF0aGlzLnVzZXJFdmVudFNlcnZpY2UpIHJldHVybiBvZigpO1xuICAgIHJldHVybiB0aGlzLnVzZXJFdmVudFNlcnZpY2VcbiAgICAgIC5jb3VudFN1YmplY3RcbiAgICAgIC5waXBlKG1hcCh2YWx1ZSA9PiB2YWx1ZSA9PT0gMCA/IHVuZGVmaW5lZCA6IHZhbHVlKSk7XG4gIH1cblxuICBwcml2YXRlIF9sb2dQcmVmaXggPSAnW3VzZXItZXZlbnQtbm90aWZpY2F0aW9uXSAnO1xuICBwcml2YXRlIF9yZWFkRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPElVc2VyRXZlbnQ8YW55Pj4oKTtcbiAgcHJpdmF0ZSBfcmVhZEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXI8SVVzZXJFdmVudDxhbnk+W10+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChVU0VSX0VWRU5UX1NFUlZJQ0UpIHB1YmxpYyB1c2VyRXZlbnRTZXJ2aWNlOiBJVXNlckV2ZW50U2VydmljZTxJVXNlckV2ZW50PGFueT4sIElVc2VyRXZlbnRGaWx0ZXI8YW55Pj4sXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcG9wb3ZlckNvbnRyb2xsZXI6IFBvcG92ZXJDb250cm9sbGVyXG4gICkgeyB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG5cbiAgICBpZiAoaXNOaWwodGhpcy51c2VyRXZlbnRTZXJ2aWNlKSkge1xuICAgICAgY29uc29sZS53YXJuKGAke3RoaXMuX2xvZ1ByZWZpeH1ObyBzZXJ2aWNlIGluamVjdGVkYCk7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXYWl0IHNlcnZpY2VcbiAgICBhd2FpdCB0aGlzLnVzZXJFdmVudFNlcnZpY2UucmVhZHkoKTtcblxuICAgIC8vIFN1YnNjcmliZSB0byByZWFkIGV2ZW50XG4gICAgdGhpcy5fcmVhZEV2ZW50LnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICAvLyBkZWZhdWx0OiBtYXJrIGV2ZW50IGFzIHJlYWRcbiAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5tYXJrQXNSZWFkKFt2YWx1ZV0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3JlYWRFdmVudHMuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5tYXJrQXNSZWFkKHZhbHVlKTtcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgc2hvd0xpc3QoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICAvLyBSZXNldCBjb3VudFxuICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5yZXNldENvdW50KCk7XG5cbiAgICBjb25zdCBwb3BvdmVyID0gYXdhaXQgdGhpcy5wb3BvdmVyQ29udHJvbGxlci5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0LFxuICAgICAgY29tcG9uZW50UHJvcHM6IDxVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0T3B0aW9ucz57XG4gICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgICB0aXRsZUkxOG46IHRoaXMudGl0bGVJMThuLFxuICAgICAgICByZWFkRXZlbnQ6IHRoaXMuX3JlYWRFdmVudCxcbiAgICAgICAgcmVhZEV2ZW50czogdGhpcy5fcmVhZEV2ZW50c1xuICAgICAgfSxcbiAgICAgIGJhY2tkcm9wRGlzbWlzczogdHJ1ZSxcbiAgICAgIGtleWJvYXJkQ2xvc2U6IHRydWUsXG4gICAgICBldmVudCxcbiAgICAgIHRyYW5zbHVjZW50OiB0cnVlLFxuICAgICAgY3NzQ2xhc3M6ICdwb3BvdmVyLWxhcmdlIHBvcG92ZXItbm90aWZpY2F0aW9ucydcbiAgICB9KTtcbiAgICBhd2FpdCBwb3BvdmVyLnByZXNlbnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1EZXN0cm95aW5nYCk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,57 +1,149 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, Optional, Output } from '@angular/core';
1
+ import { __awaiter } from "tslib";
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, Optional, Output, ViewChild, ViewChildren } from '@angular/core';
2
3
  import { BehaviorSubject, Subscription } from 'rxjs';
3
- import { PopoverController } from '@ionic/angular';
4
+ import { IonContent, IonItem, PopoverController } from '@ionic/angular';
4
5
  import { USER_EVENT_SERVICE } from '../user-event.service';
6
+ import { LocalSettingsService } from '../../../core/services/local-settings.service';
7
+ import { removeDuplicatesFromArray } from '../../../shared/functions';
8
+ import { fromScrollEndEvent } from '../../../shared/events';
9
+ import { waitFor } from '../../../shared/observables';
5
10
  export class UserEventNotificationList {
6
- constructor(cd, popoverController, userEventService) {
11
+ constructor(cd, popoverController, settings, userEventService) {
12
+ var _a;
7
13
  this.cd = cd;
8
14
  this.popoverController = popoverController;
15
+ this.settings = settings;
9
16
  this.userEventService = userEventService;
10
- this.debug = false;
11
- this.userEvents = new BehaviorSubject(undefined);
12
17
  this.subscriptions = new Subscription();
18
+ this._fetchingMore = false;
19
+ this.debug = false;
20
+ this.pageSize = 10;
21
+ this.sortBy = 'creationDate';
22
+ this.sortDirection = 'desc';
23
+ this.enableInfiniteScroll = true;
24
+ this.$items = new BehaviorSubject(undefined);
25
+ this.$itemCount = new BehaviorSubject(undefined);
26
+ this.mobile = ((_a = this.settings) === null || _a === void 0 ? void 0 : _a.mobile) || false;
27
+ }
28
+ get canFetchMore() {
29
+ return this.enableInfiniteScroll && !!this._fetchMoreFn;
13
30
  }
14
31
  ngOnInit() {
15
32
  // Watch all user events
16
- this.subscriptions.add(this.userEventService
17
- .watchAll(0, 10, 'creationDate', "desc", undefined)
18
- .subscribe(result => {
19
- if (this.debug)
20
- console.debug(`[user-event-notification-list] receiving ${result.total} user events`, result.data);
21
- this.userEvents.next(result.data);
22
- this.markForCheck();
23
- }));
24
- // Listen changes
25
- this.subscriptions.add(this.userEventService.listenChanges(undefined)
26
- .subscribe(data => {
27
- if (this.debug)
28
- console.debug(`[user-event-notification-list] receiving ${data.length} new user events`, data);
29
- }));
33
+ if (this.userEventService) {
34
+ this.subscriptions.add(this.userEventService
35
+ .watchAll(0, this.pageSize, this.sortBy, this.sortDirection, this.filter)
36
+ .subscribe(result => {
37
+ var _a;
38
+ if (this.debug)
39
+ console.debug(`[user-event-notification-list] receiving ${result.total} user events`, result.data);
40
+ this.$items.next(result.data);
41
+ this.$itemCount.next(result.total || ((_a = result.data) === null || _a === void 0 ? void 0 : _a.length) || 0);
42
+ this._fetchMoreFn = result.fetchMore;
43
+ this.markForCheck();
44
+ }));
45
+ // Listen changes
46
+ this.subscriptions.add(this.userEventService.listenAllChanges(undefined)
47
+ .subscribe(data => {
48
+ if (this.debug)
49
+ console.debug(`[user-event-notification-list] receiving ${data.length} new user events`, data);
50
+ }));
51
+ }
30
52
  }
31
53
  ngOnDestroy() {
32
54
  this.subscriptions.unsubscribe();
33
55
  }
34
- read(event, userEvent) {
56
+ click(event, userEvent) {
57
+ if (!userEvent)
58
+ return; // Skip
59
+ // MarkAsRead
60
+ this.markAsRead(event, userEvent);
61
+ // Get the default action (if any)
62
+ const defaultAction = ((userEvent === null || userEvent === void 0 ? void 0 : userEvent.actions) || []).find(a => a.default);
63
+ if (defaultAction) {
64
+ this.executeAction(event, defaultAction, userEvent);
65
+ }
66
+ }
67
+ isDefaultAction(action) {
68
+ return action && action.default || false;
69
+ }
70
+ markAsRead(event, userEvent) {
35
71
  var _a;
36
72
  if (userEvent === null || userEvent === void 0 ? void 0 : userEvent.readDate)
37
73
  return;
38
74
  (_a = this.readEvent) === null || _a === void 0 ? void 0 : _a.emit(userEvent);
39
75
  }
40
- readAll(event) {
76
+ markAllAsRead(event) {
41
77
  var _a;
42
- const unreadUserEvents = (this.userEvents.value || []).filter(value => !value.readDate);
78
+ const unreadUserEvents = (this.$items.value || []).filter(value => !value.readDate);
43
79
  if (!unreadUserEvents.length)
44
80
  return;
45
81
  (_a = this.readEvents) === null || _a === void 0 ? void 0 : _a.emit(unreadUserEvents);
46
82
  }
47
- executeAction(action, userEvent) {
48
- // Execute then close popover
49
- action.executeAction(userEvent);
50
- this.dismiss();
83
+ executeAction(event, action, userEvent) {
84
+ return __awaiter(this, void 0, void 0, function* () {
85
+ if (event === null || event === void 0 ? void 0 : event.defaultPrevented)
86
+ return; // Skip if prevented
87
+ // Disable default action (.e.g avoid to call click() function)
88
+ if (event)
89
+ event.preventDefault();
90
+ // Execute then close popover
91
+ try {
92
+ const res = action.executeAction(userEvent);
93
+ this.dismiss();
94
+ if (res instanceof Promise)
95
+ yield res;
96
+ }
97
+ catch (err) {
98
+ console.error(err);
99
+ }
100
+ });
51
101
  }
52
102
  dismiss() {
53
103
  this.popoverController.dismiss();
54
104
  }
105
+ fetchMore(event) {
106
+ var _a;
107
+ return __awaiter(this, void 0, void 0, function* () {
108
+ if (!this._fetchMoreFn || this._fetchingMore)
109
+ return;
110
+ console.debug('[user-event-notification-list] Fetching more notifications...', event);
111
+ this._fetchingMore = true;
112
+ try {
113
+ const result = yield this._fetchMoreFn();
114
+ let data = [
115
+ ...(this.$items.value || []),
116
+ ...result.data
117
+ ];
118
+ // Remove duplication (e.g. when new user event was added by subscription)
119
+ data = removeDuplicatesFromArray(data, 'id');
120
+ this.$items.next(data);
121
+ this.$itemCount.next(result.total || ((_a = result.data) === null || _a === void 0 ? void 0 : _a.length) || 0);
122
+ this._fetchMoreFn = result.fetchMore;
123
+ }
124
+ catch (err) {
125
+ console.error(err);
126
+ this._fetchMoreFn = undefined;
127
+ }
128
+ finally {
129
+ this.markForCheck();
130
+ this._fetchingMore = false;
131
+ }
132
+ });
133
+ }
134
+ _initInfiniteScroll(threshold) {
135
+ return __awaiter(this, void 0, void 0, function* () {
136
+ if (this._fetchMoreSubscription)
137
+ this._fetchMoreSubscription.unsubscribe();
138
+ threshold = threshold || (this.mobile ? '15%' : '2%');
139
+ yield waitFor(() => !!this.ionContent);
140
+ const panel = yield this.ionContent.getScrollElement();
141
+ // Trigger fetch more, end end scroll reached
142
+ this._fetchMoreSubscription = fromScrollEndEvent(panel, threshold, 250 /*force to check when no scrollbar - e.g. in large screen*/)
143
+ .subscribe(() => this.fetchMore());
144
+ this.subscriptions.add(this._fetchMoreSubscription);
145
+ });
146
+ }
55
147
  markForCheck() {
56
148
  this.cd.markForCheck();
57
149
  }
@@ -59,20 +151,29 @@ export class UserEventNotificationList {
59
151
  UserEventNotificationList.decorators = [
60
152
  { type: Component, args: [{
61
153
  selector: 'app-user-event-notification-list',
62
- template: "\n<ion-list class=\"ion-list-popover\">\n\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{titleI18n | translate}}</ion-label>\n </ion-col>\n <ion-col class=\"top-action\" *ngIf=\"userEvents|async|isNotEmptyArray\">\n <ion-text color=\"primary\">\n <a (click)=\"readAll($event)\">{{'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate}}</a>\n </ion-text>\n </ion-col>\n </ion-row>\n\n <ion-item *ngIf=\"userEvents|async|isEmptyArray\" lines=\"none\">\n <ion-text color=\"dark\" class=\"text-italic\">{{'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate}}</ion-text>\n </ion-item>\n <ion-item\n *ngFor=\"let userEvent of userEvents | async\"\n (click)=\"read($event, userEvent)\"\n >\n\n <ion-avatar slot=\"start\">\n\n <img *ngIf=\"userEvent.avatar; else avatarIcon\" src=\"{{ userEvent.avatar }}\">\n\n <ng-template #avatarIcon>\n <app-icon\n *ngIf=\"userEvent.avatarIcon\"\n [ref]=\"userEvent.avatarIcon\"\n height=\"40\"\n width=\"40\"\n ></app-icon>\n </ng-template>\n\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col>\n <p [class.unread]=\"!userEvent.readDate\" [innerHTML]=\"userEvent.message\"></p>\n </ion-col>\n </ion-row>\n <ion-row *ngIf=\"userEvent.actions?.length\">\n <ion-col>\n <span *ngFor=\"let action of userEvent.actions\" class=\"action\">\n <a (click)=\"executeAction(action, userEvent)\">\n <app-icon *ngIf=\"action.iconRef\" slot=\"start\" height=\"20\" width=\"20\" [ref]=\"action.iconRef\"></app-icon>\n {{ action.name }}\n </a>\n </span>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <app-icon\n *ngIf=\"userEvent.icon\"\n [ref]=\"userEvent.icon\"\n height=\"16\"\n width=\"16\"\n style=\"vertical-align: sub; margin-right: 3px\"\n ></app-icon>\n <small>\n <span>{{userEvent.creationDate|dateFromNow}}</span>\n <span style=\"color: gray\">{{ ' | ' + (userEvent.creationDate|dateFormat:{time:true}) }}</span>\n </small>\n </ion-col>\n </ion-row>\n </ion-grid>\n </ion-item>\n\n <ion-row class=\"ion-list-footer column\">\n </ion-row>\n\n</ion-list>\n",
154
+ template: "<ion-content>\n <ion-list class=\"ion-list-popover\">\n\n <ion-row class=\"ion-list-header column\">\n <ion-col>\n <ion-label>{{titleI18n | translate}}</ion-label>\n </ion-col>\n <ion-col class=\"top-action\" *ngIf=\"$items|async|isNotEmptyArray\">\n <ion-text color=\"primary\">\n <a (click)=\"markAllAsRead($event)\">{{'SOCIAL.USER_EVENT.NOTIFICATION.READ_ALL' | translate}}</a>\n </ion-text>\n </ion-col>\n </ion-row>\n\n <ion-item\n *ngFor=\"let item of $items | async; last as last\"\n [lines]=\"last ? 'none' : undefined\"\n [class.unread]=\"!item.readDate\"\n [class.tappable]=\"item.actions|arrayFilter:isDefaultAction|isNotEmptyArray\"\n (click)=\"click($event, item)\">\n\n <ion-avatar slot=\"start\">\n\n <img *ngIf=\"item.avatar; else avatarIcon\" src=\"{{ item.avatar }}\">\n\n <ng-template #avatarIcon>\n <app-icon\n *ngIf=\"item.avatarIcon\"\n [ref]=\"item.avatarIcon\"\n height=\"40\"\n width=\"40\"\n ></app-icon>\n </ng-template>\n\n </ion-avatar>\n\n <ion-grid class=\"ion-no-margin ion-no-padding message\">\n <ion-row>\n <ion-col size=\"12\">\n <p [class.unread]=\"!item.readDate\" [innerHTML]=\"item.message\"></p>\n </ion-col>\n </ion-row>\n\n <!-- date -->\n <ion-row>\n <ion-col size=\"12\">\n <app-icon\n *ngIf=\"item.icon\"\n [ref]=\"item.icon\"\n height=\"16\"\n width=\"16\"\n style=\"vertical-align: sub; margin-right: 3px\"\n ></app-icon>\n <small>\n <span>{{item.creationDate|dateFromNow}}</span>\n <span style=\"color: gray\">{{ ' | ' + (item.creationDate|dateFormat:{time:true}) }}</span>\n </small>\n </ion-col>\n </ion-row>\n\n <!-- actions -->\n <ion-row *ngIf=\"item.actions|isNotEmptyArray\">\n <ion-col></ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngFor=\"let action of item.actions\">\n <a *ngIf=\"!action.default\" class=\"action\" (click)=\"executeAction($event, action, item)\" [title]=\"(action.title || action.name) |translate\">\n <app-icon *ngIf=\"action.iconRef\" slot=\"start\" height=\"20\" width=\"20\" [ref]=\"action.iconRef\"></app-icon>\n <span>{{ action.name | translate }}</span>\n </a>\n </ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n <mat-icon slot=\"end\" *ngIf=\"item.actions|arrayFilter: isDefaultAction|isNotEmptyArray\">chevron_right</mat-icon>\n </ion-item>\n\n <!-- loading -->\n <ion-item *ngIf=\"!($items|async); else noResult\" lines=\"none\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n\n <!-- no result -->\n <ng-template #noResult>\n <ion-item *ngIf=\"$items|async|isEmptyArray\" lines=\"none\">\n <ion-text color=\"dark\" class=\"text-italic\">{{'SOCIAL.USER_EVENT.NOTIFICATION.EMPTY' | translate}}</ion-text>\n </ion-item>\n </ng-template>\n\n <!-- Loading more spinner -->\n <ion-item *ngIf=\"canFetchMore\" (ngInit)=\"_initInfiniteScroll()\" lines=\"none\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </ion-item>\n\n <!-- footer -->\n <ion-row *ngIf=\"$itemCount|async; let count\"\n class=\"ion-list-footer column\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </ion-list>\n</ion-content>\n",
63
155
  changeDetection: ChangeDetectionStrategy.OnPush,
64
- styles: [":host(.popover-viewport){overflow-y:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.unread{font-weight:700}.message{font-size:.9em}.message p{margin-top:5px;margin-bottom:5px}.top-action{text-align:end;margin-right:8px}.top-action a{cursor:pointer;color:var(--ion-color-contrast)}.top-action a:hover{text-decoration:underline}.action a{margin-right:10px;cursor:pointer}.action app-icon{vertical-align:middle}"]
156
+ styles: [":host(.popover-viewport){overflow-y:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-height:calc(90vh - 20px)}ion-list ion-item.tappable{cursor:pointer}ion-list ion-item.tappable:hover{--ion-item-background:var(--ion-item-background-color-hover)}.message{font-size:.9em}.message p{margin-top:5px;margin-bottom:5px}.message p.unread{font-weight:700}.top-action{text-align:end;margin-right:8px}.top-action a{cursor:pointer;color:var(--ion-color-contrast)}.top-action a:hover{text-decoration:underline}a.action{font-size:.9em;margin-right:10px;cursor:pointer}a.action:hover span{text-decoration:underline}a.action app-icon{vertical-align:middle}"]
65
157
  },] }
66
158
  ];
67
159
  UserEventNotificationList.ctorParameters = () => [
68
160
  { type: ChangeDetectorRef },
69
161
  { type: PopoverController },
162
+ { type: LocalSettingsService, decorators: [{ type: Optional }] },
70
163
  { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [USER_EVENT_SERVICE,] }] }
71
164
  ];
72
165
  UserEventNotificationList.propDecorators = {
73
166
  debug: [{ type: Input }],
167
+ mobile: [{ type: Input }],
74
168
  titleI18n: [{ type: Input }],
169
+ pageSize: [{ type: Input }],
170
+ sortBy: [{ type: Input }],
171
+ sortDirection: [{ type: Input }],
172
+ filter: [{ type: Input }],
173
+ enableInfiniteScroll: [{ type: Input }],
75
174
  readEvent: [{ type: Output }],
76
- readEvents: [{ type: Output }]
175
+ readEvents: [{ type: Output }],
176
+ ionContent: [{ type: ViewChild, args: [IonContent,] }],
177
+ ionItems: [{ type: ViewChildren, args: [IonItem,] }]
77
178
  };
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBZ0IsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4SixPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQXFCLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFlOUUsTUFBTSxPQUFPLHlCQUF5QjtJQVVwQyxZQUNZLEVBQXFCLEVBQ3JCLGlCQUFvQyxFQUNDLGdCQUEyRTtRQUZoSCxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ0MscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEyRDtRQVhuSCxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBS3ZCLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBb0IsU0FBUyxDQUFDLENBQUM7UUFDckQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBTzdDLENBQUM7SUFFRCxRQUFRO1FBRU4sd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsZ0JBQWdCO2FBQ2xCLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO2FBQ2xELFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxLQUFLO2dCQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsNENBQTRDLE1BQU0sQ0FBQyxLQUFLLGNBQWMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2pDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FDTCxDQUFDO1FBRUYsaUJBQWlCO1FBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQzthQUMzQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEIsSUFBSSxJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxJQUFJLENBQUMsTUFBTSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqSCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBYyxFQUFFLFNBQTBCOztRQUM3QyxJQUFJLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxRQUFRO1lBQUUsT0FBTztRQUNoQyxNQUFBLElBQUksQ0FBQyxTQUFTLDBDQUFFLElBQUksQ0FBQyxTQUFTLEVBQUU7SUFDbEMsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFjOztRQUNwQixNQUFNLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3JDLE1BQUEsSUFBSSxDQUFDLFVBQVUsMENBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFO0lBQzFDLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBdUIsRUFBRSxTQUEwQjtRQUMvRCw2QkFBNkI7UUFDN0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVTLFlBQVk7UUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDOzs7WUF4RUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQ0FBa0M7Z0JBQzVDLDI1RUFBa0Q7Z0JBRWxELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNoRDs7O1lBbEJpQyxpQkFBaUI7WUFHMUMsaUJBQWlCOzRDQTZCckIsUUFBUSxZQUFJLE1BQU0sU0FBQyxrQkFBa0I7OztvQkFYdkMsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLE1BQU07eUJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJVXNlckV2ZW50LCBJVXNlckV2ZW50RmlsdGVyLCBVc2VyRXZlbnRBY3Rpb24gfSBmcm9tICcuLi91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IElVc2VyRXZlbnRTZXJ2aWNlLCBVU0VSX0VWRU5UX1NFUlZJQ0UgfSBmcm9tICcuLi91c2VyLWV2ZW50LnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3RPcHRpb25zIHtcbiAgZGVidWc/OiBib29sZWFuO1xuICB0aXRsZUkxOG4/OiBzdHJpbmc7XG4gIHJlYWRFdmVudD86IEV2ZW50RW1pdHRlcjxJVXNlckV2ZW50PGFueT4+O1xuICByZWFkRXZlbnRzPzogRXZlbnRFbWl0dGVyPElVc2VyRXZlbnQ8YW55PltdPjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVzZXItZXZlbnQtbm90aWZpY2F0aW9uLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJFdmVudE5vdGlmaWNhdGlvbkxpc3QgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdE9wdGlvbnMge1xuXG4gIEBJbnB1dCgpIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRpdGxlSTE4bjogc3RyaW5nO1xuICBAT3V0cHV0KCkgcmVhZEV2ZW50OiBFdmVudEVtaXR0ZXI8SVVzZXJFdmVudDxhbnk+PjtcbiAgQE91dHB1dCgpIHJlYWRFdmVudHM6IEV2ZW50RW1pdHRlcjxJVXNlckV2ZW50PGFueT5bXT47XG5cbiAgdXNlckV2ZW50cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SVVzZXJFdmVudDxhbnk+W10+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIHBvcG92ZXJDb250cm9sbGVyOiBQb3BvdmVyQ29udHJvbGxlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFVTRVJfRVZFTlRfU0VSVklDRSkgcHVibGljIHVzZXJFdmVudFNlcnZpY2U6IElVc2VyRXZlbnRTZXJ2aWNlPElVc2VyRXZlbnQ8YW55PiwgSVVzZXJFdmVudEZpbHRlcjxhbnk+PixcbiAgKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFdhdGNoIGFsbCB1c2VyIGV2ZW50c1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2VcbiAgICAgICAgLndhdGNoQWxsKDAsIDEwLCAnY3JlYXRpb25EYXRlJywgXCJkZXNjXCIsIHVuZGVmaW5lZClcbiAgICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKGBbdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdF0gcmVjZWl2aW5nICR7cmVzdWx0LnRvdGFsfSB1c2VyIGV2ZW50c2AsIHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICB0aGlzLnVzZXJFdmVudHMubmV4dChyZXN1bHQuZGF0YSlcbiAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBMaXN0ZW4gY2hhbmdlc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UubGlzdGVuQ2hhbmdlcyh1bmRlZmluZWQpXG4gICAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt1c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1saXN0XSByZWNlaXZpbmcgJHtkYXRhLmxlbmd0aH0gbmV3IHVzZXIgZXZlbnRzYCwgZGF0YSk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcmVhZChldmVudDogVUlFdmVudCwgdXNlckV2ZW50OiBJVXNlckV2ZW50PGFueT4pIHtcbiAgICBpZiAodXNlckV2ZW50Py5yZWFkRGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50Py5lbWl0KHVzZXJFdmVudCk7XG4gIH1cblxuICByZWFkQWxsKGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgY29uc3QgdW5yZWFkVXNlckV2ZW50cyA9ICh0aGlzLnVzZXJFdmVudHMudmFsdWUgfHwgW10pLmZpbHRlcih2YWx1ZSA9PiAhdmFsdWUucmVhZERhdGUpO1xuICAgIGlmICghdW5yZWFkVXNlckV2ZW50cy5sZW5ndGgpIHJldHVybjtcbiAgICB0aGlzLnJlYWRFdmVudHM/LmVtaXQodW5yZWFkVXNlckV2ZW50cyk7XG4gIH1cblxuICBleGVjdXRlQWN0aW9uKGFjdGlvbjogVXNlckV2ZW50QWN0aW9uLCB1c2VyRXZlbnQ6IElVc2VyRXZlbnQ8YW55Pikge1xuICAgIC8vIEV4ZWN1dGUgdGhlbiBjbG9zZSBwb3BvdmVyXG4gICAgYWN0aW9uLmV4ZWN1dGVBY3Rpb24odXNlckV2ZW50KTtcbiAgICB0aGlzLmRpc21pc3MoKTtcbiAgfVxuXG4gIGRpc21pc3MoKSB7XG4gICAgdGhpcy5wb3BvdmVyQ29udHJvbGxlci5kaXNtaXNzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC1ub3RpZmljYXRpb24ubGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3VzZXItZXZlbnQvbm90aWZpY2F0aW9uL3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLmxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sU0FBUyxFQUNULFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBb0Isa0JBQWtCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUVuRixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFnQnBELE1BQU0sT0FBTyx5QkFBeUI7SUE4QnBDLFlBQ1ksRUFBcUIsRUFDckIsaUJBQW9DLEVBQ3hCLFFBQThCLEVBQ0wsZ0JBQTZEOztRQUhsRyxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQXNCO1FBQ0wscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE2QztRQWhDcEcsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFD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TixTQUFTLFNBQUMsVUFBVTt1QkFDcEIsWUFBWSxTQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0lVc2VyRXZlbnQsIElVc2VyRXZlbnRGaWx0ZXIsIFVzZXJFdmVudEFjdGlvbn0gZnJvbSAnLi4vdXNlci1ldmVudC5tb2RlbCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7SW9uQ29udGVudCwgSW9uSXRlbSwgUG9wb3ZlckNvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7SVVzZXJFdmVudFNlcnZpY2UsIFVTRVJfRVZFTlRfU0VSVklDRX0gZnJvbSAnLi4vdXNlci1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7TG9jYWxTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQge0ZldGNoTW9yZUZuLCBMb2FkUmVzdWx0fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtyZW1vdmVEdXBsaWNhdGVzRnJvbUFycmF5fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7ZnJvbVNjcm9sbEVuZEV2ZW50fSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZXZlbnRzJztcbmltcG9ydCB7d2FpdEZvcn0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL29ic2VydmFibGVzJztcbmltcG9ydCB7U29ydERpcmVjdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdE9wdGlvbnMge1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIHRpdGxlSTE4bj86IHN0cmluZztcbiAgcmVhZEV2ZW50PzogRXZlbnRFbWl0dGVyPElVc2VyRXZlbnQ8YW55Pj47XG4gIHJlYWRFdmVudHM/OiBFdmVudEVtaXR0ZXI8SVVzZXJFdmVudDxhbnk+W10+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci1ldmVudC1ub3RpZmljYXRpb24tbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi5saXN0LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVXNlckV2ZW50Tm90aWZpY2F0aW9uTGlzdDxFIGV4dGVuZHMgSVVzZXJFdmVudDxhbnk+ID0gSVVzZXJFdmVudDxhbnk+PiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBVc2VyRXZlbnROb3RpZmljYXRpb25MaXN0T3B0aW9ucyB7XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByb3RlY3RlZCBfZmV0Y2hNb3JlRm46IEZldGNoTW9yZUZuPExvYWRSZXN1bHQ8RT4+O1xuICBwcm90ZWN0ZWQgX2ZldGNoaW5nTW9yZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX2ZldGNoTW9yZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIEBJbnB1dCgpIGRlYnVnID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KCkgdGl0bGVJMThuOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcGFnZVNpemUgPSAxMDtcbiAgQElucHV0KCkgc29ydEJ5ID0gJ2NyZWF0aW9uRGF0ZSc7XG4gIEBJbnB1dCgpIHNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG4gIEBJbnB1dCgpIGZpbHRlcjogUGFydGlhbDxJVXNlckV2ZW50RmlsdGVyPGFueT4+O1xuXG4gIEBJbnB1dCgpIGVuYWJsZUluZmluaXRlU2Nyb2xsID0gdHJ1ZTtcbiAgQE91dHB1dCgpIHJlYWRFdmVudDogRXZlbnRFbWl0dGVyPEU+O1xuXG4gIEBPdXRwdXQoKSByZWFkRXZlbnRzOiBFdmVudEVtaXR0ZXI8RVtdPjtcblxuICBAVmlld0NoaWxkKElvbkNvbnRlbnQpIGlvbkNvbnRlbnQ6IElvbkNvbnRlbnQ7XG4gIEBWaWV3Q2hpbGRyZW4oSW9uSXRlbSkgaW9uSXRlbXM6IFF1ZXJ5TGlzdDxJb25JdGVtPjtcbiAgJGl0ZW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxFW10+KHVuZGVmaW5lZCk7XG4gICRpdGVtQ291bnQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4odW5kZWZpbmVkKTtcblxuICBnZXQgY2FuRmV0Y2hNb3JlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVuYWJsZUluZmluaXRlU2Nyb2xsICYmICEhdGhpcy5fZmV0Y2hNb3JlRm47XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCBwb3BvdmVyQ29udHJvbGxlcjogUG9wb3ZlckNvbnRyb2xsZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFVTRVJfRVZFTlRfU0VSVklDRSkgcHVibGljIHVzZXJFdmVudFNlcnZpY2U6IElVc2VyRXZlbnRTZXJ2aWNlPEUsIElVc2VyRXZlbnRGaWx0ZXI8YW55Pj5cbiAgKSB7XG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLnNldHRpbmdzPy5tb2JpbGUgfHwgZmFsc2U7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFdhdGNoIGFsbCB1c2VyIGV2ZW50c1xuICAgIGlmICh0aGlzLnVzZXJFdmVudFNlcnZpY2UpIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZVxuICAgICAgICAgIC53YXRjaEFsbCgwLCB0aGlzLnBhZ2VTaXplLCB0aGlzLnNvcnRCeSwgdGhpcy5zb3J0RGlyZWN0aW9uLCB0aGlzLmZpbHRlcilcbiAgICAgICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3VzZXItZXZlbnQtbm90aWZpY2F0aW9uLWxpc3RdIHJlY2VpdmluZyAke3Jlc3VsdC50b3RhbH0gdXNlciBldmVudHNgLCByZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLiRpdGVtcy5uZXh0KHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuJGl0ZW1Db3VudC5uZXh0KHJlc3VsdC50b3RhbCB8fCByZXN1bHQuZGF0YT8ubGVuZ3RoIHx8IDApO1xuICAgICAgICAgICAgdGhpcy5fZmV0Y2hNb3JlRm4gPSByZXN1bHQuZmV0Y2hNb3JlO1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gTGlzdGVuIGNoYW5nZXNcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5saXN0ZW5BbGxDaGFuZ2VzKHVuZGVmaW5lZClcbiAgICAgICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoYFt1c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1saXN0XSByZWNlaXZpbmcgJHtkYXRhLmxlbmd0aH0gbmV3IHVzZXIgZXZlbnRzYCwgZGF0YSk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBjbGljayhldmVudDogVUlFdmVudCwgdXNlckV2ZW50OiBFKSB7XG4gICAgaWYgKCF1c2VyRXZlbnQpIHJldHVybiAvLyBTa2lwXG5cbiAgICAvLyBNYXJrQXNSZWFkXG4gICAgdGhpcy5tYXJrQXNSZWFkKGV2ZW50LCB1c2VyRXZlbnQpO1xuXG4gICAgLy8gR2V0IHRoZSBkZWZhdWx0IGFjdGlvbiAoaWYgYW55KVxuICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSAodXNlckV2ZW50Py5hY3Rpb25zIHx8IFtdKS5maW5kKGEgPT4gYS5kZWZhdWx0KTtcblxuICAgIGlmIChkZWZhdWx0QWN0aW9uKSB7XG4gICAgICAgdGhpcy5leGVjdXRlQWN0aW9uKGV2ZW50LCBkZWZhdWx0QWN0aW9uLCB1c2VyRXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGlzRGVmYXVsdEFjdGlvbihhY3Rpb246IFVzZXJFdmVudEFjdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhY3Rpb24gJiYgYWN0aW9uLmRlZmF1bHQgfHwgZmFsc2U7XG4gIH1cblxuICBtYXJrQXNSZWFkKGV2ZW50OiBVSUV2ZW50LCB1c2VyRXZlbnQ6IEUpIHtcbiAgICBpZiAodXNlckV2ZW50Py5yZWFkRGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50Py5lbWl0KHVzZXJFdmVudCk7XG4gIH1cblxuICBtYXJrQWxsQXNSZWFkKGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgY29uc3QgdW5yZWFkVXNlckV2ZW50cyA9ICh0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSkuZmlsdGVyKHZhbHVlID0+ICF2YWx1ZS5yZWFkRGF0ZSk7XG4gICAgaWYgKCF1bnJlYWRVc2VyRXZlbnRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIHRoaXMucmVhZEV2ZW50cz8uZW1pdCh1bnJlYWRVc2VyRXZlbnRzKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVBY3Rpb24oXG4gICAgICBldmVudDogVUlFdmVudCxcbiAgICAgIGFjdGlvbjogVXNlckV2ZW50QWN0aW9uLFxuICAgICAgdXNlckV2ZW50OiBJVXNlckV2ZW50PGFueT4pIHtcblxuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuOyAvLyBTa2lwIGlmIHByZXZlbnRlZFxuXG4gICAgLy8gRGlzYWJsZSBkZWZhdWx0IGFjdGlvbiAoLmUuZyBhdm9pZCB0byBjYWxsIGNsaWNrKCkgZnVuY3Rpb24pXG4gICAgaWYgKGV2ZW50KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGVuIGNsb3NlIHBvcG92ZXJcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYWN0aW9uLmV4ZWN1dGVBY3Rpb24odXNlckV2ZW50KTtcbiAgICAgIHRoaXMuZGlzbWlzcygpO1xuICAgICAgaWYgKHJlcyBpbnN0YW5jZW9mIFByb21pc2UpIGF3YWl0IHJlcztcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgZGlzbWlzcygpIHtcbiAgICB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmRpc21pc3MoKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShldmVudD86IEN1c3RvbUV2ZW50ICYgeyB0YXJnZXQ/OiBFdmVudFRhcmdldCAmIHsgY29tcGxldGU/OiAoKSA9PiB2b2lkIH19KSB7XG4gICAgaWYgKCF0aGlzLl9mZXRjaE1vcmVGbiB8fCB0aGlzLl9mZXRjaGluZ01vcmUpIHJldHVybjtcblxuICAgIGNvbnNvbGUuZGVidWcoJ1t1c2VyLWV2ZW50LW5vdGlmaWNhdGlvbi1saXN0XSBGZXRjaGluZyBtb3JlIG5vdGlmaWNhdGlvbnMuLi4nLCBldmVudCk7XG4gICAgdGhpcy5fZmV0Y2hpbmdNb3JlID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9mZXRjaE1vcmVGbigpO1xuICAgICAgbGV0IGRhdGEgPSBbXG4gICAgICAgIC4uLih0aGlzLiRpdGVtcy52YWx1ZSB8fCBbXSksXG4gICAgICAgIC4uLnJlc3VsdC5kYXRhXG4gICAgICBdO1xuXG4gICAgICAvLyBSZW1vdmUgZHVwbGljYXRpb24gKGUuZy4gd2hlbiBuZXcgdXNlciBldmVudCB3YXMgYWRkZWQgYnkgc3Vic2NyaXB0aW9uKVxuICAgICAgZGF0YSA9IHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXkoZGF0YSwgJ2lkJyk7XG5cbiAgICAgIHRoaXMuJGl0ZW1zLm5leHQoZGF0YSk7XG4gICAgICB0aGlzLiRpdGVtQ291bnQubmV4dChyZXN1bHQudG90YWwgfHwgcmVzdWx0LmRhdGE/Lmxlbmd0aCB8fCAwKTtcbiAgICAgIHRoaXMuX2ZldGNoTW9yZUZuID0gcmVzdWx0LmZldGNoTW9yZTtcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB0aGlzLl9mZXRjaE1vcmVGbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgdGhpcy5fZmV0Y2hpbmdNb3JlID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2luaXRJbmZpbml0ZVNjcm9sbCh0aHJlc2hvbGQ/OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fZmV0Y2hNb3JlU3Vic2NyaXB0aW9uKSB0aGlzLl9mZXRjaE1vcmVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCB8fCAodGhpcy5tb2JpbGUgPyAnMTUlJyA6ICcyJScpO1xuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4gISF0aGlzLmlvbkNvbnRlbnQpO1xuICAgIGNvbnN0IHBhbmVsID0gYXdhaXQgdGhpcy5pb25Db250ZW50LmdldFNjcm9sbEVsZW1lbnQoKTtcblxuICAgIC8vIFRyaWdnZXIgZmV0Y2ggbW9yZSwgZW5kIGVuZCBzY3JvbGwgcmVhY2hlZFxuICAgIHRoaXMuX2ZldGNoTW9yZVN1YnNjcmlwdGlvbiA9IGZyb21TY3JvbGxFbmRFdmVudChwYW5lbCwgdGhyZXNob2xkLCAyNTAgLypmb3JjZSB0byBjaGVjayB3aGVuIG5vIHNjcm9sbGJhciAtIGUuZy4gaW4gbGFyZ2Ugc2NyZWVuKi8pXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZmV0Y2hNb3JlKCkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLl9mZXRjaE1vcmVTdWJzY3JpcHRpb24pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,179 @@
1
+ import { Component, Inject, ViewChild } from '@angular/core';
2
+ import { USER_EVENT_SERVICE } from '../user-event.service';
3
+ import { UserEvent } from '../user-event.model';
4
+ import { Router } from '@angular/router';
5
+ import { Alerts } from '../../../shared/alerts';
6
+ import { AlertController } from '@ionic/angular';
7
+ import { TranslateService } from '@ngx-translate/core';
8
+ import * as momentImported from 'moment';
9
+ import { UserEventTestService } from './user-event.testing.service';
10
+ const moment = momentImported;
11
+ export class UserEventTestingPage {
12
+ constructor(userEventService, router, alertController, translateService) {
13
+ this.userEventService = userEventService;
14
+ this.router = router;
15
+ this.alertController = alertController;
16
+ this.translateService = translateService;
17
+ userEventService.registerListener({
18
+ accept: (userEvent) => { return true; },
19
+ onReceived: (userEvent) => {
20
+ this.customize(userEvent);
21
+ return userEvent;
22
+ }
23
+ });
24
+ userEventService.registerListener({
25
+ accept: (userEvent) => { return userEvent.level == "DEBUG"; },
26
+ onRead: (userEvent) => { this.showMessage("debug message read "); }
27
+ });
28
+ }
29
+ customize(userEvent) {
30
+ // Choose avatarIcon
31
+ switch (userEvent.level) {
32
+ case 'ERROR':
33
+ userEvent.avatarIcon = { icon: 'close-outline', color: 'danger' };
34
+ break;
35
+ case 'WARNING':
36
+ userEvent.avatarIcon = { icon: 'warning-outline', color: 'warning' };
37
+ break;
38
+ case 'INFO':
39
+ userEvent.avatarIcon = { icon: 'information-circle-outline' };
40
+ break;
41
+ case 'DEBUG':
42
+ userEvent.avatarIcon = { icon: 'cog', color: "medium" };
43
+ break;
44
+ }
45
+ // Choose icon
46
+ switch (userEvent.type) {
47
+ case 'message':
48
+ userEvent.icon = { matIcon: 'inbox', color: 'accent' };
49
+ break;
50
+ case 'upload':
51
+ userEvent.icon = { matIcon: 'file_upload' };
52
+ break;
53
+ case 'download':
54
+ userEvent.icon = { matIcon: 'file_download' };
55
+ break;
56
+ }
57
+ }
58
+ addNotification() {
59
+ this.userEventService.add(UserEvent.fromObject({
60
+ issuer: 'system',
61
+ recipient: 'me',
62
+ type: 'message',
63
+ level: 'INFO',
64
+ message: 'message test message test message test message test message test message test message test message test',
65
+ creationDate: moment(),
66
+ }));
67
+ }
68
+ addError() {
69
+ this.userEventService.add(UserEvent.fromObject({
70
+ issuer: 'system',
71
+ recipient: 'me',
72
+ type: 'upload',
73
+ level: 'ERROR',
74
+ message: 'message error',
75
+ creationDate: moment(),
76
+ }));
77
+ }
78
+ addWarning() {
79
+ this.userEventService.add(UserEvent.fromObject({
80
+ issuer: 'system',
81
+ recipient: 'me',
82
+ type: 'download',
83
+ level: 'WARNING',
84
+ message: 'message warning',
85
+ creationDate: moment(),
86
+ }));
87
+ }
88
+ addDebug() {
89
+ this.userEventService.add(UserEvent.fromObject({
90
+ issuer: 'system',
91
+ recipient: 'me',
92
+ type: 'debug',
93
+ level: 'DEBUG',
94
+ message: 'message DEBUG',
95
+ creationDate: moment(),
96
+ }));
97
+ }
98
+ addNotificationWithLink() {
99
+ this.userEventService.add(UserEvent.fromObject({
100
+ issuer: 'system',
101
+ recipient: 'me',
102
+ type: 'message',
103
+ level: 'INFO',
104
+ message: 'message with link',
105
+ creationDate: moment(),
106
+ actions: [{
107
+ name: 'click here',
108
+ iconRef: {
109
+ icon: 'arrow-forward-outline'
110
+ },
111
+ executeAction: event => { this.router.navigateByUrl('/'); }
112
+ }]
113
+ }));
114
+ }
115
+ addNotificationWithAction() {
116
+ this.userEventService.add(UserEvent.fromObject({
117
+ issuer: 'system',
118
+ recipient: 'me',
119
+ type: 'message',
120
+ level: 'INFO',
121
+ message: 'message with action',
122
+ creationDate: moment(),
123
+ actions: [
124
+ {
125
+ name: 'click here',
126
+ iconRef: {
127
+ icon: 'arrow-forward-outline',
128
+ color: 'warning'
129
+ },
130
+ executeAction: event => { this.showMessage('action 1'); }
131
+ },
132
+ {
133
+ name: 'click here 2',
134
+ iconRef: {
135
+ matIcon: 'settings_applications',
136
+ color: 'secondary'
137
+ },
138
+ executeAction: event => { this.showMessage('action 2'); }
139
+ }
140
+ ]
141
+ }));
142
+ }
143
+ addNotificationWithDefaultAction() {
144
+ this.userEventService.add(UserEvent.fromObject({
145
+ issuer: 'system',
146
+ recipient: 'me',
147
+ type: 'message',
148
+ level: 'INFO',
149
+ message: 'message with action',
150
+ creationDate: moment(),
151
+ actions: [
152
+ {
153
+ default: true,
154
+ name: 'default',
155
+ executeAction: event => { this.showMessage('default action'); }
156
+ }
157
+ ]
158
+ }));
159
+ }
160
+ showMessage(text) {
161
+ return Alerts.showError(text, this.alertController, this.translateService);
162
+ }
163
+ }
164
+ UserEventTestingPage.decorators = [
165
+ { type: Component, args: [{
166
+ selector: 'job-progression-testing',
167
+ template: "<ion-toolbar color=\"primary\">\n <ion-title>User events</ion-title>\n</ion-toolbar>\n\n<ion-content class=\"ion-padding\">\n\n <app-user-event-notification-icon #notification [debug]=\"true\"></app-user-event-notification-icon>\n\n <p>\n <ion-button (click)=\"addNotification()\">Add notification</ion-button>\n <ion-button (click)=\"addError()\">Add error</ion-button>\n <ion-button (click)=\"addWarning()\">Add warning</ion-button>\n <ion-button (click)=\"addDebug()\">Add debug</ion-button>\n </p>\n <p>\n <ion-button (click)=\"addNotificationWithLink()\">Add notification with link</ion-button>\n <ion-button (click)=\"addNotificationWithAction()\">Add notification with action</ion-button>\n <ion-button (click)=\"addNotificationWithDefaultAction()\">Add notification with default action</ion-button>\n </p>\n</ion-content>\n"
168
+ },] }
169
+ ];
170
+ UserEventTestingPage.ctorParameters = () => [
171
+ { type: UserEventTestService, decorators: [{ type: Inject, args: [USER_EVENT_SERVICE,] }] },
172
+ { type: Router },
173
+ { type: AlertController },
174
+ { type: TranslateService }
175
+ ];
176
+ UserEventTestingPage.propDecorators = {
177
+ notification: [{ type: ViewChild, args: ['notification',] }]
178
+ };
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC50ZXN0aW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvdXNlci1ldmVudC90ZXN0aW5nL3VzZXItZXZlbnQudGVzdGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssY0FBYyxNQUFNLFFBQVEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUdsRSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFNOUIsTUFBTSxPQUFPLG9CQUFvQjtJQUsvQixZQUN3QyxnQkFBc0MsRUFDbEUsTUFBYyxFQUNkLGVBQWdDLEVBQ2hDLGdCQUFrQztRQUhOLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBc0I7UUFDbEUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRzVDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1lBQ2hDLE1BQU0sRUFBRSxDQUFDLFNBQW9CLEVBQUUsRUFBRSxHQUFHLE9BQU8sSUFBSSxDQUFBLENBQUMsQ0FBQztZ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SUFDN0UsQ0FBQzs7O1lBcExGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUseUJBQXlCO2dCQUNuQyxzMkJBQXNDO2FBQ3ZDOzs7WUFSTyxvQkFBb0IsdUJBZXZCLE1BQU0sU0FBQyxrQkFBa0I7WUFwQnRCLE1BQU07WUFFTixlQUFlO1lBQ2YsZ0JBQWdCOzs7MkJBYXJCLFNBQVMsU0FBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VVNFUl9FVkVOVF9TRVJWSUNFfSBmcm9tICcuLi91c2VyLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtVc2VyRXZlbnQsIFVzZXJFdmVudEFjdGlvbn0gZnJvbSAnLi4vdXNlci1ldmVudC5tb2RlbCc7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7QWxlcnRzfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvYWxlcnRzJztcbmltcG9ydCB7QWxlcnRDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7VXNlckV2ZW50VGVzdFNlcnZpY2V9IGZyb20gJy4vdXNlci1ldmVudC50ZXN0aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHtBcHBVc2VyRXZlbnROb3RpZmljYXRpb25JY29ufSBmcm9tICcuLi9ub3RpZmljYXRpb24vdXNlci1ldmVudC1ub3RpZmljYXRpb24uaWNvbic7XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudEltcG9ydGVkO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqb2ItcHJvZ3Jlc3Npb24tdGVzdGluZycsXG4gIHRlbXBsYXRlVXJsOiAndXNlci1ldmVudC50ZXN0aW5nLmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJFdmVudFRlc3RpbmdQYWdlIHtcblxuICBAVmlld0NoaWxkKCdub3RpZmljYXRpb24nKSBub3RpZmljYXRpb246IEFwcFVzZXJFdmVudE5vdGlmaWNhdGlvbkljb247XG5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFVTRVJfRVZFTlRfU0VSVklDRSkgcHJvdGVjdGVkIHVzZXJFdmVudFNlcnZpY2U6IFVzZXJFdmVudFRlc3RTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBwcm90ZWN0ZWQgYWxlcnRDb250cm9sbGVyOiBBbGVydENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG5cbiAgICB1c2VyRXZlbnRTZXJ2aWNlLnJlZ2lzdGVyTGlzdGVuZXIoe1xuICAgICAgYWNjZXB0OiAodXNlckV2ZW50OiBVc2VyRXZlbnQpID0+IHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIG9uUmVjZWl2ZWQ6ICh1c2VyRXZlbnQ6IFVzZXJFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLmN1c3RvbWl6ZSh1c2VyRXZlbnQpO1xuICAgICAgICByZXR1cm4gdXNlckV2ZW50XG4gICAgICB9XG4gICAgfSlcbiAgICB1c2VyRXZlbnRTZXJ2aWNlLnJlZ2lzdGVyTGlzdGVuZXIoe1xuICAgICAgYWNjZXB0OiAodXNlckV2ZW50OiBVc2VyRXZlbnQpID0+IHsgcmV0dXJuIHVzZXJFdmVudC5sZXZlbCA9PSBcIkRFQlVHXCIgfSxcbiAgICAgIG9uUmVhZDogKHVzZXJFdmVudDogVXNlckV2ZW50KSA9PiB7IHRoaXMuc2hvd01lc3NhZ2UoXCJkZWJ1ZyBtZXNzYWdlIHJlYWQgXCIpfVxuICAgIH0pXG4gIH1cblxuICBwcm90ZWN0ZWQgY3VzdG9taXplKHVzZXJFdmVudDogVXNlckV2ZW50KSB7XG5cbiAgICAvLyBDaG9vc2UgYXZhdGFySWNvblxuICAgIHN3aXRjaCAodXNlckV2ZW50LmxldmVsKSB7XG4gICAgICBjYXNlICdFUlJPUic6XG4gICAgICAgIHVzZXJFdmVudC5hdmF0YXJJY29uID0geyBpY29uOiAnY2xvc2Utb3V0bGluZScsIGNvbG9yOiAnZGFuZ2VyJyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dBUk5JTkcnOlxuICAgICAgICB1c2VyRXZlbnQuYXZhdGFySWNvbiA9IHsgaWNvbjogJ3dhcm5pbmctb3V0bGluZScsIGNvbG9yOiAnd2FybmluZycgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdJTkZPJzpcbiAgICAgICAgdXNlckV2ZW50LmF2YXRhckljb24gPSB7IGljb246ICdpbmZvcm1hdGlvbi1jaXJjbGUtb3V0bGluZScgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdERUJVRyc6XG4gICAgICAgIHVzZXJFdmVudC5hdmF0YXJJY29uID0geyBpY29uOiAnY29nJywgY29sb3I6IFwibWVkaXVtXCIgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gQ2hvb3NlIGljb25cbiAgICBzd2l0Y2ggKHVzZXJFdmVudC50eXBlKSB7XG4gICAgICBjYXNlICdtZXNzYWdlJzpcbiAgICAgICAgdXNlckV2ZW50Lmljb24gPSB7IG1hdEljb246ICdpbmJveCcsIGNvbG9yOiAnYWNjZW50JyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VwbG9hZCc6XG4gICAgICAgIHVzZXJFdmVudC5pY29uID0geyBtYXRJY29uOiAnZmlsZV91cGxvYWQnIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZG93bmxvYWQnOlxuICAgICAgICB1c2VyRXZlbnQuaWNvbiA9IHsgbWF0SWNvbjogJ2ZpbGVfZG93bmxvYWQnIH07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICB9XG5cbiAgYWRkTm90aWZpY2F0aW9uKCkge1xuICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5hZGQoVXNlckV2ZW50LmZyb21PYmplY3Qoe1xuICAgICAgICBpc3N1ZXI6ICdzeXN0ZW0nLFxuICAgICAgICByZWNpcGllbnQ6ICdtZScsXG4gICAgICAgIHR5cGU6ICdtZXNzYWdlJyxcbiAgICAgICAgbGV2ZWw6ICdJTkZPJyxcbiAgICAgICAgbWVzc2FnZTogJ21lc3NhZ2UgdGVzdCBtZXNzYWdlIHRlc3QgbWVzc2FnZSB0ZXN0IG1lc3NhZ2UgdGVzdCBtZXNzYWdlIHRlc3QgbWVzc2FnZSB0ZXN0IG1lc3NhZ2UgdGVzdCBtZXNzYWdlIHRlc3QnLFxuICAgICAgICBjcmVhdGlvbkRhdGU6IG1vbWVudCgpLFxuICAgICAgfVxuICAgICkpO1xuICB9XG5cbiAgYWRkRXJyb3IoKSB7XG4gICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLmFkZChVc2VyRXZlbnQuZnJvbU9iamVjdCh7XG4gICAgICAgIGlzc3VlcjogJ3N5c3RlbScsXG4gICAgICAgIHJlY2lwaWVudDogJ21lJyxcbiAgICAgICAgdHlwZTogJ3VwbG9hZCcsXG4gICAgICAgIGxldmVsOiAnRVJST1InLFxuICAgICAgICBtZXNzYWdlOiAnbWVzc2FnZSBlcnJvcicsXG4gICAgICAgIGNyZWF0aW9uRGF0ZTogbW9tZW50KCksXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBhZGRXYXJuaW5nKCkge1xuICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5hZGQoVXNlckV2ZW50LmZyb21PYmplY3Qoe1xuICAgICAgICBpc3N1ZXI6ICdzeXN0ZW0nLFxuICAgICAgICByZWNpcGllbnQ6ICdtZScsXG4gICAgICAgIHR5cGU6ICdkb3dubG9hZCcsXG4gICAgICAgIGxldmVsOiAnV0FSTklORycsXG4gICAgICAgIG1lc3NhZ2U6ICdtZXNzYWdlIHdhcm5pbmcnLFxuICAgICAgICBjcmVhdGlvbkRhdGU6IG1vbWVudCgpLFxuICAgICAgfVxuICAgICkpO1xuICB9XG5cbiAgYWRkRGVidWcoKSB7XG4gICAgdGhpcy51c2VyRXZlbnRTZXJ2aWNlLmFkZChVc2VyRXZlbnQuZnJvbU9iamVjdCh7XG4gICAgICAgIGlzc3VlcjogJ3N5c3RlbScsXG4gICAgICAgIHJlY2lwaWVudDogJ21lJyxcbiAgICAgICAgdHlwZTogJ2RlYnVnJyxcbiAgICAgICAgbGV2ZWw6ICdERUJVRycsXG4gICAgICAgIG1lc3NhZ2U6ICdtZXNzYWdlIERFQlVHJyxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBtb21lbnQoKSxcbiAgICAgIH1cbiAgICApKTtcbiAgfVxuXG4gIGFkZE5vdGlmaWNhdGlvbldpdGhMaW5rKCkge1xuICAgIHRoaXMudXNlckV2ZW50U2VydmljZS5hZGQoVXNlckV2ZW50LmZyb21PYmplY3Qoe1xuICAgICAgICBpc3N1ZXI6ICdzeXN0ZW0nLFxuICAgICAgICByZWNpcGllbnQ6ICdtZScsXG4gICAgICAgIHR5cGU6ICdtZXNzYWdlJyxcbiAgICAgICAgbGV2ZWw6ICdJTkZPJyxcbiAgICAgICAgbWVzc2FnZTogJ21lc3NhZ2Ugd2l0aCBsaW5rJyxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBtb21lbnQoKSxcbiAgICAgICAgYWN0aW9uczogWzxVc2VyRXZlbnRBY3Rpb24+e1xuICAgICAgICAgIG5hbWU6ICdjbGljayBoZXJlJyxcbiAgICAgICAgICBpY29uUmVmOiB7XG4gICAgICAgICAgICBpY29uOiAnYXJyb3ctZm9yd2FyZC1vdXRsaW5lJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXhlY3V0ZUFjdGlvbjogZXZlbnQgPT4geyB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvJykgfVxuICAgICAgICB9XVxuICAgICAgfVxuICAgICkpO1xuICB9XG5cbiAgYWRkTm90aWZpY2F0aW9uV2l0aEFjdGlvbigpIHtcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UuYWRkKFVzZXJFdmVudC5mcm9tT2JqZWN0KHtcbiAgICAgICAgaXNzdWVyOiAnc3lzdGVtJyxcbiAgICAgICAgcmVjaXBpZW50OiAnbWUnLFxuICAgICAgICB0eXBlOiAnbWVzc2FnZScsXG4gICAgICAgIGxldmVsOiAnSU5GTycsXG4gICAgICAgIG1lc3NhZ2U6ICdtZXNzYWdlIHdpdGggYWN0aW9uJyxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBtb21lbnQoKSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIDxVc2VyRXZlbnRBY3Rpb24+e1xuICAgICAgICAgICAgbmFtZTogJ2NsaWNrIGhlcmUnLFxuICAgICAgICAgICAgaWNvblJlZjoge1xuICAgICAgICAgICAgICBpY29uOiAnYXJyb3ctZm9yd2FyZC1vdXRsaW5lJyxcbiAgICAgICAgICAgICAgY29sb3I6ICd3YXJuaW5nJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4ZWN1dGVBY3Rpb246IGV2ZW50ID0+IHsgdGhpcy5zaG93TWVzc2FnZSgnYWN0aW9uIDEnKSB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICA8VXNlckV2ZW50QWN0aW9uPntcbiAgICAgICAgICAgIG5hbWU6ICdjbGljayBoZXJlIDInLFxuICAgICAgICAgICAgaWNvblJlZjoge1xuICAgICAgICAgICAgICBtYXRJY29uOiAnc2V0dGluZ3NfYXBwbGljYXRpb25zJyxcbiAgICAgICAgICAgICAgY29sb3I6ICdzZWNvbmRhcnknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXhlY3V0ZUFjdGlvbjogZXZlbnQgPT4geyB0aGlzLnNob3dNZXNzYWdlKCdhY3Rpb24gMicpIH1cbiAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBhZGROb3RpZmljYXRpb25XaXRoRGVmYXVsdEFjdGlvbigpIHtcbiAgICB0aGlzLnVzZXJFdmVudFNlcnZpY2UuYWRkKFVzZXJFdmVudC5mcm9tT2JqZWN0KHtcbiAgICAgICAgaXNzdWVyOiAnc3lzdGVtJyxcbiAgICAgICAgcmVjaXBpZW50OiAnbWUnLFxuICAgICAgICB0eXBlOiAnbWVzc2FnZScsXG4gICAgICAgIGxldmVsOiAnSU5GTycsXG4gICAgICAgIG1lc3NhZ2U6ICdtZXNzYWdlIHdpdGggYWN0aW9uJyxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBtb21lbnQoKSxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIDxVc2VyRXZlbnRBY3Rpb24+e1xuICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIGV4ZWN1dGVBY3Rpb246IGV2ZW50ID0+IHsgdGhpcy5zaG93TWVzc2FnZSgnZGVmYXVsdCBhY3Rpb24nKSB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd01lc3NhZ2UodGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIEFsZXJ0cy5zaG93RXJyb3IodGV4dCwgdGhpcy5hbGVydENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlU2VydmljZSk7XG4gIH1cbn1cblxuIl19