@sumaris-net/ngx-components 1.18.7 → 1.19.0
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/bundles/sumaris-net.ngx-components.umd.js +779 -420
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/doc/changelog.md +4 -0
- package/esm2015/public_api.js +10 -5
- package/esm2015/src/app/admin/admin-routing.module.js +3 -1
- package/esm2015/src/app/admin/admin.module.js +2 -1
- package/esm2015/src/app/admin/users/list/users.js +45 -7
- package/esm2015/src/app/core/services/local-settings.service.js +5 -5
- package/esm2015/src/app/core/services/platform.service.js +3 -4
- package/esm2015/src/app/shared/material/datetime/material.date.js +82 -70
- package/esm2015/src/app/shared/material/datetime/material.datetime.js +3 -3
- package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +7 -5
- package/esm2015/src/app/shared/validator/validators.js +2 -2
- package/esm2015/src/app/social/message/message.form.js +73 -0
- package/esm2015/src/app/social/message/message.modal.js +96 -0
- package/esm2015/src/app/social/message/message.model.js +65 -0
- package/esm2015/src/app/social/message/message.service.js +87 -0
- package/esm2015/src/app/social/social.errors.js +6 -0
- package/esm2015/src/app/social/social.module.js +12 -15
- package/esm2015/src/app/social/user-event/user-event.fragments.js +27 -0
- package/esm2015/src/app/social/user-event/user-event.model.js +46 -0
- package/esm2015/src/app/social/user-event/user-event.service.js +367 -0
- package/esm2015/src/app/social/user-event/user-events.table.js +154 -0
- package/fesm2015/sumaris-net.ngx-components.js +710 -403
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +4 -3
- package/public_api.d.ts +9 -4
- package/src/app/admin/users/list/users.d.ts +10 -6
- package/src/app/core/services/local-settings.service.d.ts +3 -2
- package/src/app/shared/material/datetime/material.date.d.ts +6 -8
- package/src/app/shared/material/datetime/material.datetime.d.ts +2 -2
- package/src/app/social/message/message.form.d.ts +27 -0
- package/src/app/social/message/message.modal.d.ts +36 -0
- package/src/app/social/message/message.model.d.ts +31 -0
- package/src/app/social/message/message.service.d.ts +24 -0
- package/src/app/social/{services/errors.d.ts → social.errors.d.ts} +2 -1
- package/src/app/social/social.module.d.ts +0 -2
- package/src/app/social/{services/social.fragments.d.ts → user-event/user-event.fragments.d.ts} +1 -1
- package/src/app/social/{services/model → user-event}/user-event.model.d.ts +1 -1
- package/src/app/social/{services → user-event}/user-event.service.d.ts +4 -3
- package/src/app/social/{list → user-event}/user-events.table.d.ts +2 -2
- package/src/assets/i18n/en-US.json +4 -4
- package/src/assets/i18n/en.json +5 -4
- package/src/assets/i18n/fr.json +24 -4
- package/src/theme/_ionic.globals.scss +2 -1
- package/sumaris-net.ngx-components.metadata.json +1 -1
- package/esm2015/src/app/admin/services/errors.js +0 -6
- package/esm2015/src/app/social/list/user-events.table.js +0 -154
- package/esm2015/src/app/social/services/errors.js +0 -5
- package/esm2015/src/app/social/services/model/user-event.model.js +0 -46
- package/esm2015/src/app/social/services/social.fragments.js +0 -27
- package/esm2015/src/app/social/services/user-event.service.js +0 -367
- package/src/app/admin/services/errors.d.ts +0 -5
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export const ErrorCodes = {
|
|
2
|
-
LOAD_PERSONS_ERROR: 100,
|
|
3
|
-
SAVE_PERSONS_ERROR: 101,
|
|
4
|
-
DELETE_PERSONS_ERROR: 102,
|
|
5
|
-
};
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9hZG1pbi9zZXJ2aWNlcy9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLGtCQUFrQixFQUFFLEdBQUc7SUFDdkIsa0JBQWtCLEVBQUUsR0FBRztJQUN2QixvQkFBb0IsRUFBRSxHQUFHO0NBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgTE9BRF9QRVJTT05TX0VSUk9SOiAxMDAsXG4gIFNBVkVfUEVSU09OU19FUlJPUjogMTAxLFxuICBERUxFVEVfUEVSU09OU19FUlJPUjogMTAyLFxufTtcbiJdfQ==
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Injector, Input } from '@angular/core';
|
|
3
|
-
import { UserEventFilter, UserEventService } from '../services/user-event.service';
|
|
4
|
-
import { AccountService } from '../../core/services/account.service';
|
|
5
|
-
import { UserEvent, UserEventTypes } from '../services/model/user-event.model';
|
|
6
|
-
import { toBoolean } from '../../shared/functions';
|
|
7
|
-
import { AppTable, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS } from '../../core/table/table.class';
|
|
8
|
-
import { EntitiesTableDataSource } from '../../core/table/entities-table-datasource.class';
|
|
9
|
-
import { EntitiesStorage } from '../../core/services/storage/entities-storage.service';
|
|
10
|
-
import { ENVIRONMENT } from '../../../environments/environment.class';
|
|
11
|
-
const ICONS_MAP = {
|
|
12
|
-
DEBUG_DATA: { matIcon: 'bug_report' },
|
|
13
|
-
INBOX_MESSAGE: { matIcon: 'mail' },
|
|
14
|
-
};
|
|
15
|
-
// TODO: refactor with a registration done by data service:
|
|
16
|
-
// - userEventService.registerEventAction({__typename: 'TripVO', ...})
|
|
17
|
-
// - userEventService.getActionsFor(__typename): UserEventDetailAction
|
|
18
|
-
/*const DETAILS_MAP: {[key: string]: UserEventAction<RootDataEntity<any>>} = {
|
|
19
|
-
"TripVO": {
|
|
20
|
-
icon: null,
|
|
21
|
-
matIcon: "content_copy",
|
|
22
|
-
action: 'copyToLocal',
|
|
23
|
-
actionTitle: 'SOCIAL.USER_EVENT.BTN_COPY_TO_LOCAL',
|
|
24
|
-
actionColor: 'primary',
|
|
25
|
-
fromObject: Trip.fromObject,
|
|
26
|
-
childrenFields: ['operation', 'landing']
|
|
27
|
-
},
|
|
28
|
-
"ObservedLocationVO": {
|
|
29
|
-
icon: null,
|
|
30
|
-
matIcon: "content_copy",
|
|
31
|
-
action: 'copyToLocal',
|
|
32
|
-
actionTitle: 'SOCIAL.USER_EVENT.BTN_COPY_TO_LOCAL',
|
|
33
|
-
actionColor: 'primary',
|
|
34
|
-
fromObject: ObservedLocation.fromObject,
|
|
35
|
-
childrenFields: ['landings']
|
|
36
|
-
}
|
|
37
|
-
}*/
|
|
38
|
-
export class UserEventsTable extends AppTable {
|
|
39
|
-
constructor(injector, accountService, service, entities, cd, environment) {
|
|
40
|
-
super(injector,
|
|
41
|
-
// columns
|
|
42
|
-
RESERVED_START_COLUMNS
|
|
43
|
-
.concat([
|
|
44
|
-
'creationDate',
|
|
45
|
-
'icon',
|
|
46
|
-
'eventType',
|
|
47
|
-
'message'
|
|
48
|
-
])
|
|
49
|
-
.concat(RESERVED_END_COLUMNS), null, null);
|
|
50
|
-
this.accountService = accountService;
|
|
51
|
-
this.service = service;
|
|
52
|
-
this.entities = entities;
|
|
53
|
-
this.cd = cd;
|
|
54
|
-
this.environment = environment;
|
|
55
|
-
this.i18nColumnPrefix = 'SOCIAL.USER_EVENT.';
|
|
56
|
-
this.autoLoad = false; // this.start()
|
|
57
|
-
this.inlineEdition = false;
|
|
58
|
-
this.defaultSortBy = 'creationDate';
|
|
59
|
-
this.defaultSortDirection = 'desc';
|
|
60
|
-
}
|
|
61
|
-
ngOnInit() {
|
|
62
|
-
super.ngOnInit();
|
|
63
|
-
// Load date/time pattern
|
|
64
|
-
this.dateTimePattern = this.translate.instant('COMMON.DATE_TIME_PATTERN');
|
|
65
|
-
this.withContent = toBoolean(this.withContent, false);
|
|
66
|
-
const account = this.accountService.account;
|
|
67
|
-
const pubkey = account && account.pubkey;
|
|
68
|
-
this.isAdmin = this.accountService.isAdmin();
|
|
69
|
-
this.canEdit = this.isAdmin || pubkey === this.recipient;
|
|
70
|
-
this.canDelete = this.canEdit;
|
|
71
|
-
this.setDatasource(new EntitiesTableDataSource(UserEvent, this.service, null, {
|
|
72
|
-
prependNewElements: false,
|
|
73
|
-
suppressErrors: true,
|
|
74
|
-
dataServiceOptions: {
|
|
75
|
-
withContent: this.withContent
|
|
76
|
-
}
|
|
77
|
-
}));
|
|
78
|
-
const filter = this.filter || new UserEventFilter();
|
|
79
|
-
filter.recipient = this.recipient;
|
|
80
|
-
this.setFilter(filter, { emitEvent: true });
|
|
81
|
-
}
|
|
82
|
-
start() {
|
|
83
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
-
console.debug('[user-event] Starting...');
|
|
85
|
-
// Waiting account to be ready
|
|
86
|
-
yield this.accountService.ready();
|
|
87
|
-
// Load data
|
|
88
|
-
this.onRefresh.emit();
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
getIcon(source) {
|
|
92
|
-
return ICONS_MAP[source.eventType];
|
|
93
|
-
}
|
|
94
|
-
getDetail(source) {
|
|
95
|
-
if (!source)
|
|
96
|
-
return undefined;
|
|
97
|
-
if (source.content && source.eventType === UserEventTypes.DEBUG_DATA) {
|
|
98
|
-
const context = source.content.context;
|
|
99
|
-
if (context && context.__typename) {
|
|
100
|
-
const actions = this.service.getActionsByTypename(context.__typename);
|
|
101
|
-
return {
|
|
102
|
-
actions,
|
|
103
|
-
title: source.content.error && source.content.error.message || source.content.message,
|
|
104
|
-
description: source.content.error && source.content.error.details || undefined
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
console.debug('TODO: implement getDetail() for event: ', source);
|
|
109
|
-
return {};
|
|
110
|
-
}
|
|
111
|
-
doAction(action, row) {
|
|
112
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
113
|
-
const event = row.currentData;
|
|
114
|
-
const context = event.content && event.content.context;
|
|
115
|
-
this.markAsLoading();
|
|
116
|
-
if (action && typeof action.executeAction === 'function') {
|
|
117
|
-
try {
|
|
118
|
-
let res = action.executeAction(event, context);
|
|
119
|
-
res = (res instanceof Promise) ? yield res : res;
|
|
120
|
-
}
|
|
121
|
-
catch (err) {
|
|
122
|
-
this.setError(err && err.message || err);
|
|
123
|
-
console.error(`[user-event] Failed to execute action ${action.name}: ${err && err.message || err}`, err);
|
|
124
|
-
}
|
|
125
|
-
finally {
|
|
126
|
-
this.markAsLoaded();
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
UserEventsTable.decorators = [
|
|
133
|
-
{ type: Component, args: [{
|
|
134
|
-
selector: 'app-user-events-table',
|
|
135
|
-
template: "\n<!-- Type = options menu -->\n<mat-menu #optionsMenu=\"matMenu\" xPosition=\"after\">\n\n <!-- display columns -->\n <button mat-menu-item\n (click)=\"openSelectColumnsModal($event)\">\n <mat-icon>view_column</mat-icon>\n <ion-label translate>COMMON.DISPLAYED_COLUMNS_DOTS</ion-label>\n </button>\n\n</mat-menu>\n\n<!-- top header -->\n<mat-toolbar>\n\n <ng-container *ngIf=\"!selection.hasValue(); else hasSelection\">\n\n <button mat-icon-button [title]=\"'COMMON.BTN_REFRESH'|translate\" (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n </ng-container>\n\n <!-- if row selection -->\n <ng-template #hasSelection>\n\n <!-- delete -->\n <button mat-icon-button class=\"hidden-xs hidden-sm\" *ngIf=\"canDelete\"\n [title]=\"'COMMON.BTN_DELETE'|translate\" (click)=\"deleteSelection($event)\">\n <mat-icon>delete</mat-icon>\n </button>\n </ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" hidden-xs hidden-sm hidden-mobile lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_OPTIONS'|translate\"\n [matMenuTriggerFor]=\"optionsMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n</mat-toolbar>\n\n\n<mat-table [dataSource]=\"dataSource\" matSort\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n matSortDisableClear [trackBy]=\"trackByFn\">\n\n <!-- select -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n <!-- id -->\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef mat-sort-header [class.cdk-visually-hidden]=\"!isAdmin\">\n <app-loading-spinner [loading]=\"loadingSubject|async\"><ion-label>#</ion-label></app-loading-spinner>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!isAdmin\">{{ row.currentData.id | mathAbs }}</mat-cell>\n </ng-container>\n\n <!-- creationDate -->\n <ng-container matColumnDef=\"creationDate\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.CREATION_DATE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ion-text>\n {{row.currentData.creationDate | dateFromNow }}<br/>\n <ion-text color=\"medium\"><small>{{row.currentData.creationDate | dateFormat: {time: true} }}</small></ion-text>\n </ion-text>\n </mat-cell>\n </ng-container>\n\n <!-- icon -->\n <ng-container matColumnDef=\"icon\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getIcon(row.currentData); let details\">\n <ion-icon slot=\"start\" *ngIf=\"details.icon\" [name]=\"details.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"details.matIcon\">{{details.matIcon}}</mat-icon>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- event type -->\n <ng-container matColumnDef=\"eventType\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label translate>SOCIAL.USER_EVENT.EVENT_TYPE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <span>{{'SOCIAL.EVENT_TYPE_ENUM.' + row.currentData.eventType | translate}}</span>\n </mat-cell>\n </ng-container>\n\n <!-- message -->\n <ng-container matColumnDef=\"message\">\n <mat-header-cell *matHeaderCellDef>\n <ion-label translate>SOCIAL.USER_EVENT.MESSAGE</ion-label>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"getDetail(row.currentData); let details\">\n <ion-text [innerHTML]=\"details.title|translate\">\n </ion-text>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <!-- Actions buttons column -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\">\n <ng-container *ngIf=\"getDetail(row.currentData); let details\">\n <button mat-icon-button color=\"light\"\n *ngFor=\"let action of details.actions\"\n [title]=\"action.title |translate\"\n [color]=\"action.color\"\n (click)=\"doAction(action, row)\">\n <ion-icon slot=\"start\" *ngIf=\"action.icon\" [name]=\"action.icon\"></ion-icon>\n <mat-icon slot=\"start\" *ngIf=\"action.matIcon\">{{action.matIcon}}</mat-icon>\n </button>\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n class=\"mat-row-disabled\"\n (click)=\"clickRow($event, row)\"></mat-row>\n\n</mat-table>\n\n<ion-row class=\"ion-no-padding\">\n <ion-col></ion-col>\n <ion-col class=\"ion-no-padding\" size=\"auto\">\n <mat-paginator [length]=\"totalRowCount\" [pageSize]=\"defaultPageSize\" [pageSizeOptions]=\"defaultPageSizeOptions\" showFirstLastButtons>\n </mat-paginator>\n </ion-col>\n</ion-row>\n",
|
|
136
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
137
|
-
styles: [".mat-header-row .mat-column-icon,.mat-row .mat-column-icon{max-width:40px;padding-left:0}.mat-header-row .mat-column-icon ion-icon,.mat-header-row .mat-column-icon mat-icon,.mat-row .mat-column-icon ion-icon,.mat-row .mat-column-icon mat-icon{font-size:1.2em;height:1.2em;width:1.2em}.mat-header-row .mat-column-creationDate,.mat-row .mat-column-creationDate{min-width:100px;max-width:120px}"]
|
|
138
|
-
},] }
|
|
139
|
-
];
|
|
140
|
-
UserEventsTable.ctorParameters = () => [
|
|
141
|
-
{ type: Injector },
|
|
142
|
-
{ type: AccountService },
|
|
143
|
-
{ type: UserEventService },
|
|
144
|
-
{ type: EntitiesStorage },
|
|
145
|
-
{ type: ChangeDetectorRef },
|
|
146
|
-
{ type: undefined, decorators: [{ type: Inject, args: [ENVIRONMENT,] }] }
|
|
147
|
-
];
|
|
148
|
-
UserEventsTable.propDecorators = {
|
|
149
|
-
recipient: [{ type: Input }],
|
|
150
|
-
withContent: [{ type: Input }],
|
|
151
|
-
defaultSortBy: [{ type: Input }],
|
|
152
|
-
defaultSortDirection: [{ type: Input }]
|
|
153
|
-
};
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudHMudGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NvY2lhbC9saXN0L3VzZXItZXZlbnRzLnRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBbUIsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFaEcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5ELE9BQU8sRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUl0RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUUzRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFHdkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBK0J0RSxNQUFNLFNBQVMsR0FBb0M7SUFDakQsVUFBVSxFQUFFLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQztJQUNuQyxhQUFhLEVBQUUsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDO0NBQ2pDLENBQUM7QUFFRiwyREFBMkQ7QUFDM0Qsc0VBQXNFO0FBQ3RFLHNFQUFzRTtBQUN0RTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQVNILE1BQU0sT0FBTyxlQUFnQixTQUFRLFFBQW9DO0lBY3ZFLFlBQ0UsUUFBa0IsRUFDUixjQUE4QixFQUM5QixPQUF5QixF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QUFHLENBQUM7aUJBQ2xEO2dCQUFDLE9BQU8sR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQ3pDLE9BQU8sQ0FBQyxLQUFLLENBQUMseUNBQXlDLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQzFHO3dCQUNPO29CQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztpQkFDckI7YUFDRjtRQUNILENBQUM7S0FBQTs7O1lBbklGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsdUJBQXVCO2dCQUVqQywyMUxBQXVDO2dCQUN2QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDOUM7OztZQW5GcUUsUUFBUTtZQUd2RSxjQUFjO1lBREcsZ0JBQWdCO1lBWWpDLGVBQWU7WUFkVSxpQkFBaUI7NENBd0c5QyxNQUFNLFNBQUMsV0FBVzs7O3dCQVpwQixLQUFLOzBCQUVMLEtBQUs7NEJBQ0wsS0FBSzttQ0FDTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhYmxlRWxlbWVudCB9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQgeyBVc2VyRXZlbnRGaWx0ZXIsIFVzZXJFdmVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91c2VyLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWNjb3VudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyRXZlbnQsIFVzZXJFdmVudEFjdGlvbiwgVXNlckV2ZW50VHlwZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC91c2VyLWV2ZW50Lm1vZGVsJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEFwcFRhYmxlLCBSRVNFUlZFRF9FTkRfQ09MVU1OUywgUkVTRVJWRURfU1RBUlRfQ09MVU1OUyB9IGZyb20gJy4uLy4uL2NvcmUvdGFibGUvdGFibGUuY2xhc3MnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIFBsYXRmb3JtIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRW50aXRpZXNUYWJsZURhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi9jb3JlL3RhYmxlL2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2UuY2xhc3MnO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgRW50aXRpZXNTdG9yYWdlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9zdG9yYWdlL2VudGl0aWVzLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVkZWZpbmVkQ29sb3JzIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHsgSUVudGl0eSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJFdmVudERldGFpbDxUIGV4dGVuZHMgSUVudGl0eTxUPj4ge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcblxuICBhY3Rpb24/OiBzdHJpbmcgfCBhbnk7XG4gIGFjdGlvblRpdGxlPzogc3RyaW5nO1xuICBhY3Rpb25Db2xvcj86IFByZWRlZmluZWRDb2xvcnM7XG5cbiAgaWNvbj86IHN0cmluZztcbiAgbWF0SWNvbj86IHN0cmluZztcbiAgY29sb3I/OiBzdHJpbmc7XG4gIGNzc0NsYXNzPzogc3RyaW5nO1xuICB0aW1lPzogTW9tZW50O1xuXG4gIC8vIEEgY29uZmlnIHByb3BlcnR5LCB0byBvdmVycmlkZSB0aGUgdGl0bGVcbiAgdGl0bGVQcm9wZXJ0eT86IHN0cmluZztcbiAgdGl0bGVBcmdzPzoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG5cbiAgLy8gY29udmVyc2lvblxuICBmcm9tT2JqZWN0PzogKHNvdXJjZTogYW55KSA9PiBUO1xuICBjaGlsZHJlbkZpZWxkcz86IHN0cmluZ1tdO1xufVxuZXhwb3J0IGludGVyZmFjZSBVc2VyRXZlbnRJY29ue1xuICBpY29uPzogc3RyaW5nO1xuICBtYXRJY29uPzogc3RyaW5nO1xuICBjb2xvcj86IFByZWRlZmluZWRDb2xvcnM7XG59XG5jb25zdCBJQ09OU19NQVA6IHtba2V5OiBzdHJpbmddOiBVc2VyRXZlbnRJY29uIH0gPSB7XG4gIERFQlVHX0RBVEE6IHttYXRJY29uOiAnYnVnX3JlcG9ydCd9LFxuICBJTkJPWF9NRVNTQUdFOiB7bWF0SWNvbjogJ21haWwnfSxcbn07XG5cbi8vIFRPRE86IHJlZmFjdG9yIHdpdGggYSByZWdpc3RyYXRpb24gZG9uZSBieSBkYXRhIHNlcnZpY2U6XG4vLyAtIHVzZXJFdmVudFNlcnZpY2UucmVnaXN0ZXJFdmVudEFjdGlvbih7X190eXBlbmFtZTogJ1RyaXBWTycsIC4uLn0pXG4vLyAtIHVzZXJFdmVudFNlcnZpY2UuZ2V0QWN0aW9uc0ZvcihfX3R5cGVuYW1lKTogVXNlckV2ZW50RGV0YWlsQWN0aW9uXG4vKmNvbnN0IERFVEFJTFNfTUFQOiB7W2tleTogc3RyaW5nXTogVXNlckV2ZW50QWN0aW9uPFJvb3REYXRhRW50aXR5PGFueT4+fSA9IHtcbiAgXCJUcmlwVk9cIjoge1xuICAgIGljb246IG51bGwsXG4gICAgbWF0SWNvbjogXCJjb250ZW50X2NvcHlcIixcbiAgICBhY3Rpb246ICdjb3B5VG9Mb2NhbCcsXG4gICAgYWN0aW9uVGl0bGU6ICdTT0NJQUwuVVNFUl9FVkVOVC5CVE5fQ09QWV9UT19MT0NBTCcsXG4gICAgYWN0aW9uQ29sb3I6ICdwcmltYXJ5JyxcbiAgICBmcm9tT2JqZWN0OiBUcmlwLmZyb21PYmplY3QsXG4gICAgY2hpbGRyZW5GaWVsZHM6IFsnb3BlcmF0aW9uJywgJ2xhbmRpbmcnXVxuICB9LFxuICBcIk9ic2VydmVkTG9jYXRpb25WT1wiOiB7XG4gICAgaWNvbjogbnVsbCxcbiAgICBtYXRJY29uOiBcImNvbnRlbnRfY29weVwiLFxuICAgIGFjdGlvbjogJ2NvcHlUb0xvY2FsJyxcbiAgICBhY3Rpb25UaXRsZTogJ1NPQ0lBTC5VU0VSX0VWRU5ULkJUTl9DT1BZX1RPX0xPQ0FMJyxcbiAgICBhY3Rpb25Db2xvcjogJ3ByaW1hcnknLFxuICAgIGZyb21PYmplY3Q6IE9ic2VydmVkTG9jYXRpb24uZnJvbU9iamVjdCxcbiAgICBjaGlsZHJlbkZpZWxkczogWydsYW5kaW5ncyddXG4gIH1cbn0qL1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC11c2VyLWV2ZW50cy10YWJsZScsXG4gIHN0eWxlVXJsczogWyd1c2VyLWV2ZW50cy50YWJsZS5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWV2ZW50cy50YWJsZS5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbiAgfSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnRzVGFibGUgZXh0ZW5kcyBBcHBUYWJsZTxVc2VyRXZlbnQsIFVzZXJFdmVudEZpbHRlcj5cbiAgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGRhdGVUaW1lUGF0dGVybjogc3RyaW5nO1xuICBjYW5FZGl0OiBib29sZWFuO1xuICBjYW5EZWxldGU6IGJvb2xlYW47XG4gIGlzQWRtaW46IGJvb2xlYW47XG5cbiAgQElucHV0KCkgcmVjaXBpZW50OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgd2l0aENvbnRlbnQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRlZmF1bHRTb3J0Qnk6IHN0cmluZztcbiAgQElucHV0KCkgZGVmYXVsdFNvcnREaXJlY3Rpb246IFNvcnREaXJlY3Rpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHNlcnZpY2U6IFVzZXJFdmVudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGVudGl0aWVzOiBFbnRpdGllc1N0b3JhZ2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnRcbiAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IsXG4gICAgICAvLyBjb2x1bW5zXG4gICAgICBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TXG4gICAgICAgIC5jb25jYXQoW1xuICAgICAgICAgICdjcmVhdGlvbkRhdGUnLFxuICAgICAgICAgICdpY29uJyxcbiAgICAgICAgICAnZXZlbnRUeXBlJyxcbiAgICAgICAgICAnbWVzc2FnZSdcbiAgICAgICAgXSlcbiAgICAgICAgLmNvbmNhdChSRVNFUlZFRF9FTkRfQ09MVU1OUyksXG4gICAgICBudWxsLFxuICAgICAgbnVsbCk7XG5cbiAgICB0aGlzLmkxOG5Db2x1bW5QcmVmaXggPSAnU09DSUFMLlVTRVJfRVZFTlQuJztcbiAgICB0aGlzLmF1dG9Mb2FkID0gZmFsc2U7IC8vIHRoaXMuc3RhcnQoKVxuICAgIHRoaXMuaW5saW5lRWRpdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdFNvcnRCeSA9ICdjcmVhdGlvbkRhdGUnO1xuICAgIHRoaXMuZGVmYXVsdFNvcnREaXJlY3Rpb24gPSAnZGVzYyc7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAvLyBMb2FkIGRhdGUvdGltZSBwYXR0ZXJuXG4gICAgdGhpcy5kYXRlVGltZVBhdHRlcm4gPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDT01NT04uREFURV9USU1FX1BBVFRFUk4nKTtcbiAgICB0aGlzLndpdGhDb250ZW50ID0gdG9Cb29sZWFuKHRoaXMud2l0aENvbnRlbnQsIGZhbHNlKTtcblxuICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQ7XG4gICAgY29uc3QgcHVia2V5ID0gYWNjb3VudCAmJiBhY2NvdW50LnB1YmtleTtcbiAgICB0aGlzLmlzQWRtaW4gPSB0aGlzLmFjY291bnRTZXJ2aWNlLmlzQWRtaW4oKTtcbiAgICB0aGlzLmNhbkVkaXQgPSB0aGlzLmlzQWRtaW4gfHwgcHVia2V5ID09PSB0aGlzLnJlY2lwaWVudDtcbiAgICB0aGlzLmNhbkRlbGV0ZSA9IHRoaXMuY2FuRWRpdDtcblxuICAgIHRoaXMuc2V0RGF0YXNvdXJjZShuZXcgRW50aXRpZXNUYWJsZURhdGFTb3VyY2UoVXNlckV2ZW50LFxuICAgICAgdGhpcy5zZXJ2aWNlLFxuICAgICAgbnVsbCxcbiAgICAgIHtcbiAgICAgICAgcHJlcGVuZE5ld0VsZW1lbnRzOiBmYWxzZSxcbiAgICAgICAgc3VwcHJlc3NFcnJvcnM6IHRydWUsXG4gICAgICAgIGRhdGFTZXJ2aWNlT3B0aW9uczoge1xuICAgICAgICAgIHdpdGhDb250ZW50OiB0aGlzLndpdGhDb250ZW50XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZmlsdGVyIHx8IG5ldyBVc2VyRXZlbnRGaWx0ZXIoKTtcbiAgICBmaWx0ZXIucmVjaXBpZW50ID0gdGhpcy5yZWNpcGllbnQ7XG4gICAgdGhpcy5zZXRGaWx0ZXIoZmlsdGVyLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbdXNlci1ldmVudF0gU3RhcnRpbmcuLi4nKTtcblxuICAgIC8vIFdhaXRpbmcgYWNjb3VudCB0byBiZSByZWFkeVxuICAgIGF3YWl0IHRoaXMuYWNjb3VudFNlcnZpY2UucmVhZHkoKTtcblxuICAgIC8vIExvYWQgZGF0YVxuICAgIHRoaXMub25SZWZyZXNoLmVtaXQoKTtcbiAgfVxuXG4gIGdldEljb24oc291cmNlOiBVc2VyRXZlbnQpOiBVc2VyRXZlbnRJY29uIHtcbiAgICByZXR1cm4gSUNPTlNfTUFQW3NvdXJjZS5ldmVudFR5cGVdO1xuICB9XG5cbiAgZ2V0RGV0YWlsKHNvdXJjZTogVXNlckV2ZW50KTogUGFydGlhbDxVc2VyRXZlbnREZXRhaWw8SUVudGl0eTxhbnk+PiAmIHthY3Rpb25zOiBVc2VyRXZlbnRBY3Rpb248YW55PltdfT4ge1xuICAgIGlmICghc291cmNlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHNvdXJjZS5jb250ZW50ICYmIHNvdXJjZS5ldmVudFR5cGUgPT09IFVzZXJFdmVudFR5cGVzLkRFQlVHX0RBVEEpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBzb3VyY2UuY29udGVudC5jb250ZXh0O1xuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fX3R5cGVuYW1lKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLnNlcnZpY2UuZ2V0QWN0aW9uc0J5VHlwZW5hbWUoY29udGV4dC5fX3R5cGVuYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3Rpb25zLFxuICAgICAgICAgIHRpdGxlOiBzb3VyY2UuY29udGVudC5lcnJvciAmJiBzb3VyY2UuY29udGVudC5lcnJvci5tZXNzYWdlIHx8IHNvdXJjZS5jb250ZW50Lm1lc3NhZ2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNvdXJjZS5jb250ZW50LmVycm9yICYmIHNvdXJjZS5jb250ZW50LmVycm9yLmRldGFpbHMgfHwgdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5kZWJ1ZygnVE9ETzogaW1wbGVtZW50IGdldERldGFpbCgpIGZvciBldmVudDogJywgc291cmNlKTtcbiAgICByZXR1cm4ge307XG4gIH1cblxuXG4gIGFzeW5jIGRvQWN0aW9uKGFjdGlvbjogVXNlckV2ZW50QWN0aW9uPGFueT4sIHJvdzogVGFibGVFbGVtZW50PFVzZXJFdmVudD4pIHtcblxuICAgIGNvbnN0IGV2ZW50ID0gcm93LmN1cnJlbnREYXRhO1xuICAgIGNvbnN0IGNvbnRleHQgPSBldmVudC5jb250ZW50ICYmIGV2ZW50LmNvbnRlbnQuY29udGV4dDtcblxuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgaWYgKGFjdGlvbiAmJiB0eXBlb2YgYWN0aW9uLmV4ZWN1dGVBY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCByZXMgPSBhY3Rpb24uZXhlY3V0ZUFjdGlvbihldmVudCwgY29udGV4dCk7XG4gICAgICAgIHJlcyA9IChyZXMgaW5zdGFuY2VvZiBQcm9taXNlKSA/IGF3YWl0IHJlcyA6IHJlcztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLnNldEVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbdXNlci1ldmVudF0gRmFpbGVkIHRvIGV4ZWN1dGUgYWN0aW9uICR7YWN0aW9uLm5hbWV9OiAke2VyciAmJiBlcnIubWVzc2FnZSB8fCBlcnJ9YCwgZXJyKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkge1xuICAgICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG4iXX0=
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
export const ErrorCodes = {
|
|
2
|
-
LOAD_USER_EVENTS_ERROR: 50000,
|
|
3
|
-
SAVE_USER_EVENT_ERROR: 50001
|
|
4
|
-
};
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvc2VydmljZXMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixzQkFBc0IsRUFBRSxLQUFLO0lBQzdCLHFCQUFxQixFQUFFLEtBQUs7Q0FDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGNvbnN0IEVycm9yQ29kZXMgPSB7XG4gIExPQURfVVNFUl9FVkVOVFNfRVJST1I6IDUwMDAwLFxuICBTQVZFX1VTRVJfRVZFTlRfRVJST1I6IDUwMDAxXG59O1xuIl19
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
var UserEvent_1;
|
|
2
|
-
import { __decorate } from "tslib";
|
|
3
|
-
import { Entity } from '../../../core/services/model/entity.model';
|
|
4
|
-
import { fromDateISOString } from '../../../shared/dates';
|
|
5
|
-
import { EntityClass } from '../../../core/services/model/entity.decorators';
|
|
6
|
-
export const UserEventTypes = {
|
|
7
|
-
DEBUG_DATA: 'DEBUG_DATA',
|
|
8
|
-
INBOX_MESSAGE: 'INBOX_MESSAGE'
|
|
9
|
-
};
|
|
10
|
-
// @dynamic
|
|
11
|
-
let UserEvent = UserEvent_1 = class UserEvent extends Entity {
|
|
12
|
-
constructor() {
|
|
13
|
-
super(UserEvent_1.TYPENAME);
|
|
14
|
-
}
|
|
15
|
-
asObject(opts) {
|
|
16
|
-
const target = super.asObject(opts);
|
|
17
|
-
// Serialize content
|
|
18
|
-
if (typeof target.content === 'object') {
|
|
19
|
-
target.content = JSON.stringify(target.content);
|
|
20
|
-
}
|
|
21
|
-
return target;
|
|
22
|
-
}
|
|
23
|
-
fromObject(source) {
|
|
24
|
-
Object.assign(this, source); // Copy all properties
|
|
25
|
-
super.fromObject(source);
|
|
26
|
-
this.creationDate = fromDateISOString(source.creationDate);
|
|
27
|
-
try {
|
|
28
|
-
// Deserialize content
|
|
29
|
-
if (typeof source.content === 'string' && source.content.startsWith('{')) {
|
|
30
|
-
this.content = JSON.parse(source.content);
|
|
31
|
-
}
|
|
32
|
-
// Deserialize content.context
|
|
33
|
-
if (this.content && typeof this.content.context === 'string' && this.content.context.startsWith('{')) {
|
|
34
|
-
this.content.context = JSON.parse(this.content.context);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
catch (err) {
|
|
38
|
-
console.error('Error during UserEvent deserialization', err);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
UserEvent = UserEvent_1 = __decorate([
|
|
43
|
-
EntityClass({ typename: 'UserEventVO' })
|
|
44
|
-
], UserEvent);
|
|
45
|
-
export { UserEvent };
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1ldmVudC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3NlcnZpY2VzL21vZGVsL3VzZXItZXZlbnQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxPQUFPLEVBQUMsTUFBTSxFQUFpQyxNQUFNLDJDQUEyQyxDQUFDO0FBRWpHLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsYUFBYSxFQUFFLGVBQWU7Q0FDL0IsQ0FBQztBQUVGLFdBQVc7SUFFRSxTQUFTLHVCQUFULFNBQVUsU0FBUSxNQUFpQjtJQWM5QztRQUNFLEtBQUssQ0FBQyxXQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUE0QjtRQUNuQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBDLG9CQUFvQjtRQUNwQixJQUFJLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7WUFDdEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNqRDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBVztRQUNwQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtRQUNuRCxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNELElBQUk7WUFDRixzQkFBc0I7WUFDdEIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN4RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzNDO1lBRUQsOEJBQThCO1lBQzlCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN6RDtTQUNGO1FBQ0QsT0FBTSxHQUFHLEVBQUU7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUFqRFksU0FBUztJQURyQixXQUFXLENBQUMsRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFDLENBQUM7R0FDMUIsU0FBUyxDQWlEckI7U0FqRFksU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TW9tZW50fSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtFbnRpdHksIEVudGl0eUFzT2JqZWN0T3B0aW9ucywgSUVudGl0eX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtQcmVkZWZpbmVkQ29sb3JzfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge2Zyb21EYXRlSVNPU3RyaW5nfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHtFbnRpdHlDbGFzc30gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkuZGVjb3JhdG9ycyc7XG5cbmV4cG9ydCBjb25zdCBVc2VyRXZlbnRUeXBlcyA9IHtcbiAgREVCVUdfREFUQTogJ0RFQlVHX0RBVEEnLFxuICBJTkJPWF9NRVNTQUdFOiAnSU5CT1hfTUVTU0FHRSdcbn07XG5cbi8vIEBkeW5hbWljXG5ARW50aXR5Q2xhc3Moe3R5cGVuYW1lOiAnVXNlckV2ZW50Vk8nfSlcbmV4cG9ydCBjbGFzcyBVc2VyRXZlbnQgZXh0ZW5kcyBFbnRpdHk8VXNlckV2ZW50PiB7XG5cbiAgc3RhdGljIGZyb21PYmplY3Q6IChzb3VyY2U6IGFueSwgb3B0cz86IGFueSkgPT4gVXNlckV2ZW50O1xuXG4gIGV2ZW50VHlwZTogc3RyaW5nO1xuICBpc3N1ZXI6IHN0cmluZztcbiAgcmVjaXBpZW50OiBzdHJpbmc7XG4gIHVwZGF0ZURhdGU6IE1vbWVudDtcbiAgY3JlYXRpb25EYXRlOiBNb21lbnQ7XG5cbiAgY29udGVudDogc3RyaW5nIHwgYW55O1xuICBzaWduYXR1cmU6IHN0cmluZztcbiAgcmVhZFNpZ25hdHVyZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFVzZXJFdmVudC5UWVBFTkFNRSk7XG4gIH1cblxuICBhc09iamVjdChvcHRzPzogRW50aXR5QXNPYmplY3RPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCB0YXJnZXQgPSBzdXBlci5hc09iamVjdChvcHRzKTtcblxuICAgIC8vIFNlcmlhbGl6ZSBjb250ZW50XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQuY29udGVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRhcmdldC5jb250ZW50ID0gSlNPTi5zdHJpbmdpZnkodGFyZ2V0LmNvbnRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICBmcm9tT2JqZWN0KHNvdXJjZTogYW55KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBzb3VyY2UpOyAvLyBDb3B5IGFsbCBwcm9wZXJ0aWVzXG4gICAgc3VwZXIuZnJvbU9iamVjdChzb3VyY2UpO1xuICAgIHRoaXMuY3JlYXRpb25EYXRlID0gZnJvbURhdGVJU09TdHJpbmcoc291cmNlLmNyZWF0aW9uRGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRGVzZXJpYWxpemUgY29udGVudFxuICAgICAgaWYgKHR5cGVvZiBzb3VyY2UuY29udGVudCA9PT0gJ3N0cmluZycgJiYgc291cmNlLmNvbnRlbnQuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgIHRoaXMuY29udGVudCA9IEpTT04ucGFyc2Uoc291cmNlLmNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXNlcmlhbGl6ZSBjb250ZW50LmNvbnRleHRcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdHlwZW9mIHRoaXMuY29udGVudC5jb250ZXh0ID09PSAnc3RyaW5nJyAmJiB0aGlzLmNvbnRlbnQuY29udGV4dC5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgdGhpcy5jb250ZW50LmNvbnRleHQgPSBKU09OLnBhcnNlKHRoaXMuY29udGVudC5jb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgVXNlckV2ZW50IGRlc2VyaWFsaXphdGlvbicsIGVycik7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyRXZlbnRBY3Rpb248VCBleHRlbmRzIElFbnRpdHk8VD4+IHtcblxuICBuYW1lOiBzdHJpbmcgfCBhbnk7XG4gIHRpdGxlPzogc3RyaW5nO1xuXG4gIGljb24/OiBzdHJpbmc7XG4gIG1hdEljb24/OiBzdHJpbmc7XG4gIGNvbG9yPzogUHJlZGVmaW5lZENvbG9ycztcblxuICBleGVjdXRlQWN0aW9uOiAoZXZlbnQ6IFVzZXJFdmVudCwgY29udGV4dD86IFQpID0+IGFueSB8IFByb21pc2U8YW55PjtcblxufVxuIl19
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { gql } from '@apollo/client/core';
|
|
2
|
-
export const SocialFragments = {
|
|
3
|
-
userEvent: gql `fragment UserEventFragment on UserEventVO {
|
|
4
|
-
id
|
|
5
|
-
issuer
|
|
6
|
-
updateDate
|
|
7
|
-
creationDate
|
|
8
|
-
eventType
|
|
9
|
-
recipient
|
|
10
|
-
content
|
|
11
|
-
hash
|
|
12
|
-
signature
|
|
13
|
-
readSignature
|
|
14
|
-
__typename
|
|
15
|
-
}`,
|
|
16
|
-
lightUserEvent: gql `fragment LightUserEventFragment on UserEventVO {
|
|
17
|
-
id
|
|
18
|
-
issuer
|
|
19
|
-
recipient
|
|
20
|
-
updateDate
|
|
21
|
-
creationDate
|
|
22
|
-
eventType
|
|
23
|
-
readSignature
|
|
24
|
-
__typename
|
|
25
|
-
}`
|
|
26
|
-
};
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLmZyYWdtZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL3NlcnZpY2VzL3NvY2lhbC5mcmFnbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixTQUFTLEVBQUUsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7SUFZWjtJQUNGLGNBQWMsRUFBRSxHQUFHLENBQUE7Ozs7Ozs7OztJQVNqQjtDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2dxbH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBTb2NpYWxGcmFnbWVudHMgPSB7XG4gIHVzZXJFdmVudDogZ3FsYGZyYWdtZW50IFVzZXJFdmVudEZyYWdtZW50IG9uIFVzZXJFdmVudFZPIHtcbiAgICBpZFxuICAgIGlzc3VlclxuICAgIHVwZGF0ZURhdGVcbiAgICBjcmVhdGlvbkRhdGVcbiAgICBldmVudFR5cGVcbiAgICByZWNpcGllbnRcbiAgICBjb250ZW50XG4gICAgaGFzaFxuICAgIHNpZ25hdHVyZVxuICAgIHJlYWRTaWduYXR1cmVcbiAgICBfX3R5cGVuYW1lXG4gIH1gLFxuICBsaWdodFVzZXJFdmVudDogZ3FsYGZyYWdtZW50IExpZ2h0VXNlckV2ZW50RnJhZ21lbnQgb24gVXNlckV2ZW50Vk8ge1xuICAgIGlkXG4gICAgaXNzdWVyXG4gICAgcmVjaXBpZW50XG4gICAgdXBkYXRlRGF0ZVxuICAgIGNyZWF0aW9uRGF0ZVxuICAgIGV2ZW50VHlwZVxuICAgIHJlYWRTaWduYXR1cmVcbiAgICBfX3R5cGVuYW1lXG4gIH1gXG59O1xuIl19
|