alimetry-report 1.0.0 → 1.2.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/README.md CHANGED
@@ -6,9 +6,14 @@ Selector: `lib-report`
6
6
 
7
7
  ### Config Object
8
8
 
9
+ ```js
9
10
  {
10
- owners: User[],
11
- deviceDataModelId
11
+ owners: string[], // user ids
12
+ deviceDataModelId: string
12
13
  }
14
+ ```
15
+
16
+ ### Dependencies
17
+
18
+ `alimetry-shared` library as a peer dependency
13
19
 
14
- [NOTE:] the widget relies on the user object containing the `userId` field.
@@ -3,16 +3,18 @@ import { map, of } from 'rxjs';
3
3
  import { switchMap } from 'rxjs';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/common/http";
6
- import * as i2 from "shared";
6
+ import * as i2 from "alimetry-shared";
7
7
  import * as i3 from "@angular/common";
8
8
  export class ReportComponent {
9
- constructor(http, shared) {
9
+ constructor(http, shared, kvDiffers, itDiffers) {
10
10
  this.http = http;
11
11
  this.shared = shared;
12
+ this.kvDiffers = kvDiffers;
13
+ this.itDiffers = itDiffers;
12
14
  this.status = 'loading';
13
15
  }
14
16
  getReportUrl() {
15
- return this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0].userId, ['PdfReport']).pipe(map(res => res?.data?.['PdfReport']?.link || null));
17
+ return this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0], ['PdfReport']).pipe(map(res => res?.data?.['PdfReport']?.link || null));
16
18
  }
17
19
  getReportDataUrl(link) {
18
20
  return this.http.get(link, { responseType: 'blob' }).pipe(map(res => {
@@ -20,9 +22,12 @@ export class ReportComponent {
20
22
  return URL.createObjectURL(pdfBlob);
21
23
  }));
22
24
  }
23
- ngAfterViewInit() {
24
- if (this.status === 'nouser')
25
+ init() {
26
+ if (!this.config?.owners?.[0]) {
27
+ this.status = 'nouser';
25
28
  return;
29
+ }
30
+ this.status = 'loading';
26
31
  this.subscription = this.getReportUrl().pipe(switchMap(link => link ? this.getReportDataUrl(link) : of(null))).subscribe({
27
32
  next: (url) => {
28
33
  this.status = url ? "success" : "empty";
@@ -40,10 +45,11 @@ export class ReportComponent {
40
45
  },
41
46
  });
42
47
  }
43
- ngOnInit() {
44
- if (!this.config?.owners?.[0]?.userId) {
45
- this.status = 'nouser';
46
- }
48
+ ngAfterViewInit() {
49
+ this.init();
50
+ }
51
+ refresh() {
52
+ this.init();
47
53
  }
48
54
  ngOnDestroy() {
49
55
  if (this.reportDataUrl)
@@ -51,8 +57,21 @@ export class ReportComponent {
51
57
  if (this.subscription)
52
58
  this.subscription.unsubscribe();
53
59
  }
60
+ // NOTE: there could be something wrong / unusual here but it seems to work ok
61
+ ngOnInit() {
62
+ if (this.config && !this.configDiffer)
63
+ this.configDiffer = this.kvDiffers.find(this.config).create();
64
+ if (this.config?.owners && !this.ownersDiffer)
65
+ this.ownersDiffer = this.itDiffers.find(this.config.owners).create();
66
+ }
67
+ ngDoCheck() {
68
+ const configChanges = this.configDiffer?.diff(this.config);
69
+ const ownersChanges = this.ownersDiffer?.diff(this.config?.owners);
70
+ if (configChanges || ownersChanges)
71
+ this.init();
72
+ }
54
73
  }
55
- ReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ReportComponent, deps: [{ token: i1.HttpClient }, { token: i2.SharedService }], target: i0.ɵɵFactoryTarget.Component });
74
+ ReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ReportComponent, deps: [{ token: i1.HttpClient }, { token: i2.SharedService }, { token: i0.KeyValueDiffers }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
56
75
  ReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ReportComponent, selector: "lib-report", inputs: { config: "config" }, viewQueries: [{ propertyName: "renderFrame", first: true, predicate: ["renderFrame"], descendants: true }], ngImport: i0, template: `
57
76
  <div class="wrapper">
58
77
  <div class="status" *ngIf="status === 'empty'">
@@ -99,10 +118,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
99
118
  </div>
100
119
  </div>
101
120
  `, styles: [".wrapper{width:100%;height:100%}.status{font-size:2rem;margin:5rem auto;text-align:center}.aspect-ratio-container{width:100%;position:relative;max-height:1000px;aspect-ratio:1 / 1}iframe{top:0;left:0;width:100%;height:100%;border:none;position:absolute}\n"] }]
102
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SharedService }]; }, propDecorators: { config: [{
121
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SharedService }, { type: i0.KeyValueDiffers }, { type: i0.IterableDiffers }]; }, propDecorators: { config: [{
103
122
  type: Input
104
123
  }], renderFrame: [{
105
124
  type: ViewChild,
106
125
  args: ['renderFrame', { static: false }]
107
126
  }] } });
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydC9zcmMvbGliL3JlcG9ydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7OztBQStCakMsTUFBTSxPQUFPLGVBQWU7SUFVMUIsWUFBb0IsSUFBZ0IsRUFBVSxNQUFxQjtRQUEvQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUZuRSxXQUFNLEdBQXlELFNBQVMsQ0FBQztJQUVGLENBQUM7SUFFaEUsWUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQzVCLENBQUMsV0FBVyxDQUFDLENBQ2QsQ0FBQyxJQUFJLENBQ0osR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsQ0FDbkQsQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFZO1FBQ25DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN2RCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUM3RCxPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBRXJDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FDMUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNqRSxDQUFDLFNBQVMsQ0FBQztZQUNWLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFdBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUE7WUFDMUIsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxtQ0FBbUMsRUFBRTtvQkFDcEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO2lCQUN2QjtZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pELENBQUM7OzZHQTlEVSxlQUFlO2lHQUFmLGVBQWUsNExBMUJROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQmpDOzRGQUtVLGVBQWU7a0JBM0IzQixTQUFTOytCQUNFLFlBQVksWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJqQzs2SEFNUSxNQUFNO3NCQUFkLEtBQUs7Z0JBR04sV0FBVztzQkFEVixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBtYXAsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25maWcsIFNoYXJlZFNlcnZpY2UgfSBmcm9tICdzaGFyZWQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcmVwb3J0JywgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiICpuZ0lmPVwic3RhdHVzID09PSAnZW1wdHknXCI+XG4gICAgICAgIFRoaXMgdXNlciBkb2Vzbid0IGhhdmUgYSByZXBvcnQuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ25vdXNlcidcIj5cbiAgICAgICAgVGhlcmUgaXMgbm8gdXNlciBzcGVjaWZpZWQgYXMgdGhlIGRhdGEgb3duZXIuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ2xvYWRpbmcnXCI+XG4gICAgICAgIExvYWRpbmcgcmVwb3J0IGZvciB1c2VyLi4uXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ2Vycm9yJ1wiPlxuICAgICAgICBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBnZXQgdGhlIHJlcG9ydC5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImFzcGVjdC1yYXRpby1jb250YWluZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7ICdkaXNwbGF5Jzogc3RhdHVzID09PSAnc3VjY2VzcycgPyAnYmxvY2snIDogJ25vbmUnIH1cIlxuICAgICAgPlxuICAgICAgICA8aWZyYW1lICNyZW5kZXJGcmFtZSB0aXRsZT1cIlBERiBSZXBvcnRcIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFtcbiAgICBcIi4vcmVwb3J0LmNvbXBvbmVudC5jc3NcIlxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IENvbmZpZztcblxuICBAVmlld0NoaWxkKCdyZW5kZXJGcmFtZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICByZW5kZXJGcmFtZTogRWxlbWVudFJlZjxIVE1MSUZyYW1lRWxlbWVudD4gfCB1bmRlZmluZWQ7XG5cbiAgcmVwb3J0RGF0YVVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgc3RhdHVzOiAnZXJyb3InIHwgJ2xvYWRpbmcnIHwgJ3N1Y2Nlc3MnIHwgJ2VtcHR5JyB8ICdub3VzZXInID0gJ2xvYWRpbmcnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBzaGFyZWQ6IFNoYXJlZFNlcnZpY2UpIHsgfVxuXG4gIHByaXZhdGUgZ2V0UmVwb3J0VXJsKCk6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZC5nZXREZXZpY2VEYXRhKFxuICAgICAgdGhpcy5jb25maWcuZGV2aWNlRGF0YU1vZGVsSWQsXG4gICAgICB0aGlzLmNvbmZpZy5vd25lcnNbMF0udXNlcklkLFxuICAgICAgWydQZGZSZXBvcnQnXVxuICAgICkucGlwZShcbiAgICAgIG1hcChyZXMgPT4gcmVzPy5kYXRhPy5bJ1BkZlJlcG9ydCddPy5saW5rIHx8IG51bGwpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVwb3J0RGF0YVVybChsaW5rOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGxpbmssIHsgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSkucGlwZShcbiAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICBjb25zdCBwZGZCbG9iID0gbmV3IEJsb2IoW3Jlc10sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicgfSk7XG4gICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKHBkZkJsb2IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLnN0YXR1cyA9PT0gJ25vdXNlcicpIHJldHVybjtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5nZXRSZXBvcnRVcmwoKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKGxpbmsgPT4gbGluayA/IHRoaXMuZ2V0UmVwb3J0RGF0YVVybChsaW5rKSA6IG9mKG51bGwpKSxcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAodXJsKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gdXJsID8gXCJzdWNjZXNzXCIgOiBcImVtcHR5XCI7XG4gICAgICAgIHRoaXMucmVuZGVyRnJhbWUhLm5hdGl2ZUVsZW1lbnQuc3JjID0gdXJsO1xuICAgICAgICB0aGlzLnJlcG9ydERhdGFVcmwgPSB1cmxcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyLmVycm9yID09IFwiSXRlbU5vdEZvdW5kRXhjZXB0aW9uOiBub25lLWZvdW5kXCIpIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IFwiZW1wdHlcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5vd25lcnM/LlswXT8udXNlcklkKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9ICdub3VzZXInO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJlcG9ydERhdGFVcmwpIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5yZXBvcnREYXRhVXJsKTtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydC9zcmMvbGliL3JlcG9ydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBdUIsS0FBSyxFQUFvRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkosT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBK0JqQyxNQUFNLE9BQU8sZUFBZTtJQWExQixZQUFvQixJQUFnQixFQUFVLE1BQXFCLEVBQVUsU0FBMEIsRUFBVSxTQUEwQjtRQUF2SCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFGM0ksV0FBTSxHQUF5RCxTQUFTLENBQUM7SUFFc0UsQ0FBQztJQUV4SSxZQUFZO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUNyQixDQUFDLFdBQVcsQ0FBQyxDQUNkLENBQUMsSUFBSSxDQUNKLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLENBQ25ELENBQUM7SUFDSixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUs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QUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVuRSxJQUFJLGFBQWEsSUFBSSxhQUFhO1lBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xELENBQUM7OzZHQXJGVSxlQUFlO2lHQUFmLGVBQWUsNExBMUJROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQmpDOzRGQUtVLGVBQWU7a0JBM0IzQixTQUFTOytCQUNFLFlBQVksWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJqQzt5TEFNUSxNQUFNO3NCQUFkLEtBQUs7Z0JBTU4sV0FBVztzQkFEVixTQUFTO3VCQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERvQ2hlY2ssIEVsZW1lbnRSZWYsIElucHV0LCBJdGVyYWJsZURpZmZlciwgSXRlcmFibGVEaWZmZXJzLCBLZXlWYWx1ZURpZmZlciwgS2V5VmFsdWVEaWZmZXJzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBtYXAsIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25maWcsIFNoYXJlZFNlcnZpY2UgfSBmcm9tICdhbGltZXRyeS1zaGFyZWQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcmVwb3J0JywgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwid3JhcHBlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiICpuZ0lmPVwic3RhdHVzID09PSAnZW1wdHknXCI+XG4gICAgICAgIFRoaXMgdXNlciBkb2Vzbid0IGhhdmUgYSByZXBvcnQuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ25vdXNlcidcIj5cbiAgICAgICAgVGhlcmUgaXMgbm8gdXNlciBzcGVjaWZpZWQgYXMgdGhlIGRhdGEgb3duZXIuXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ2xvYWRpbmcnXCI+XG4gICAgICAgIExvYWRpbmcgcmVwb3J0IGZvciB1c2VyLi4uXG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ2Vycm9yJ1wiPlxuICAgICAgICBBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyeWluZyB0byBnZXQgdGhlIHJlcG9ydC5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImFzcGVjdC1yYXRpby1jb250YWluZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7ICdkaXNwbGF5Jzogc3RhdHVzID09PSAnc3VjY2VzcycgPyAnYmxvY2snIDogJ25vbmUnIH1cIlxuICAgICAgPlxuICAgICAgICA8aWZyYW1lICNyZW5kZXJGcmFtZSB0aXRsZT1cIlBERiBSZXBvcnRcIj48L2lmcmFtZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFtcbiAgICBcIi4vcmVwb3J0LmNvbXBvbmVudC5jc3NcIlxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgRG9DaGVjayB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IENvbmZpZztcblxuICBwcml2YXRlIGNvbmZpZ0RpZmZlcj86IEtleVZhbHVlRGlmZmVyPGtleW9mIENvbmZpZywgYW55PjtcbiAgcHJpdmF0ZSBvd25lcnNEaWZmZXI/OiBJdGVyYWJsZURpZmZlcjxzdHJpbmc+O1xuXG4gIEBWaWV3Q2hpbGQoJ3JlbmRlckZyYW1lJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHJlbmRlckZyYW1lOiBFbGVtZW50UmVmPEhUTUxJRnJhbWVFbGVtZW50PiB8IHVuZGVmaW5lZDtcblxuICByZXBvcnREYXRhVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBzdGF0dXM6ICdlcnJvcicgfCAnbG9hZGluZycgfCAnc3VjY2VzcycgfCAnZW1wdHknIHwgJ25vdXNlcicgPSAnbG9hZGluZyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIHNoYXJlZDogU2hhcmVkU2VydmljZSwgcHJpdmF0ZSBrdkRpZmZlcnM6IEtleVZhbHVlRGlmZmVycywgcHJpdmF0ZSBpdERpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykgeyB9XG5cbiAgcHJpdmF0ZSBnZXRSZXBvcnRVcmwoKTogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkLmdldERldmljZURhdGEoXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2VEYXRhTW9kZWxJZCxcbiAgICAgIHRoaXMuY29uZmlnLm93bmVyc1swXSxcbiAgICAgIFsnUGRmUmVwb3J0J11cbiAgICApLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcz8uZGF0YT8uWydQZGZSZXBvcnQnXT8ubGluayB8fCBudWxsKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlcG9ydERhdGFVcmwobGluazogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChsaW5rLCB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH0pLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgY29uc3QgcGRmQmxvYiA9IG5ldyBCbG9iKFtyZXNdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnIH0pO1xuICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChwZGZCbG9iKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8ub3duZXJzPy5bMF0pIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gJ25vdXNlcic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0dXMgPSAnbG9hZGluZyc7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuZ2V0UmVwb3J0VXJsKCkucGlwZShcbiAgICAgIHN3aXRjaE1hcChsaW5rID0+IGxpbmsgPyB0aGlzLmdldFJlcG9ydERhdGFVcmwobGluaykgOiBvZihudWxsKSksXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHVybCkgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHVybCA/IFwic3VjY2Vzc1wiIDogXCJlbXB0eVwiO1xuICAgICAgICB0aGlzLnJlbmRlckZyYW1lIS5uYXRpdmVFbGVtZW50LnNyYyA9IHVybDtcbiAgICAgICAgdGhpcy5yZXBvcnREYXRhVXJsID0gdXJsXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5lcnJvciA9PSBcIkl0ZW1Ob3RGb3VuZEV4Y2VwdGlvbjogbm9uZS1mb3VuZFwiKSB7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBcImVtcHR5XCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gXCJlcnJvclwiO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJlcG9ydERhdGFVcmwpIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5yZXBvcnREYXRhVXJsKTtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBOT1RFOiB0aGVyZSBjb3VsZCBiZSBzb21ldGhpbmcgd3JvbmcgLyB1bnVzdWFsIGhlcmUgYnV0IGl0IHNlZW1zIHRvIHdvcmsgb2tcbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnICYmICF0aGlzLmNvbmZpZ0RpZmZlcikgdGhpcy5jb25maWdEaWZmZXIgPSB0aGlzLmt2RGlmZmVycy5maW5kKHRoaXMuY29uZmlnKS5jcmVhdGUoKTtcbiAgICBpZiAodGhpcy5jb25maWc/Lm93bmVycyAmJiAhdGhpcy5vd25lcnNEaWZmZXIpIHRoaXMub3duZXJzRGlmZmVyID0gdGhpcy5pdERpZmZlcnMuZmluZCh0aGlzLmNvbmZpZy5vd25lcnMpLmNyZWF0ZSgpO1xuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGNvbnN0IGNvbmZpZ0NoYW5nZXMgPSB0aGlzLmNvbmZpZ0RpZmZlcj8uZGlmZih0aGlzLmNvbmZpZyk7XG4gICAgY29uc3Qgb3duZXJzQ2hhbmdlcyA9IHRoaXMub3duZXJzRGlmZmVyPy5kaWZmKHRoaXMuY29uZmlnPy5vd25lcnMpO1xuXG4gICAgaWYgKGNvbmZpZ0NoYW5nZXMgfHwgb3duZXJzQ2hhbmdlcykgdGhpcy5pbml0KCk7XG4gIH1cbn1cbiJdfQ==
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, Component, Input, ViewChild, NgModule } from '@angular/core';
3
3
  import { map, switchMap, of } from 'rxjs';
4
4
  import * as i1 from '@angular/common/http';
5
- import * as i2 from 'shared';
5
+ import * as i2 from 'alimetry-shared';
6
6
  import * as i3 from '@angular/common';
7
7
  import { CommonModule } from '@angular/common';
8
8
 
@@ -19,13 +19,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
19
19
  }], ctorParameters: function () { return []; } });
20
20
 
21
21
  class ReportComponent {
22
- constructor(http, shared) {
22
+ constructor(http, shared, kvDiffers, itDiffers) {
23
23
  this.http = http;
24
24
  this.shared = shared;
25
+ this.kvDiffers = kvDiffers;
26
+ this.itDiffers = itDiffers;
25
27
  this.status = 'loading';
26
28
  }
27
29
  getReportUrl() {
28
- return this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0].userId, ['PdfReport']).pipe(map(res => { var _a, _b; return ((_b = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a['PdfReport']) === null || _b === void 0 ? void 0 : _b.link) || null; }));
30
+ return this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0], ['PdfReport']).pipe(map(res => { var _a, _b; return ((_b = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a['PdfReport']) === null || _b === void 0 ? void 0 : _b.link) || null; }));
29
31
  }
30
32
  getReportDataUrl(link) {
31
33
  return this.http.get(link, { responseType: 'blob' }).pipe(map(res => {
@@ -33,9 +35,13 @@ class ReportComponent {
33
35
  return URL.createObjectURL(pdfBlob);
34
36
  }));
35
37
  }
36
- ngAfterViewInit() {
37
- if (this.status === 'nouser')
38
+ init() {
39
+ var _a, _b;
40
+ if (!((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.owners) === null || _b === void 0 ? void 0 : _b[0])) {
41
+ this.status = 'nouser';
38
42
  return;
43
+ }
44
+ this.status = 'loading';
39
45
  this.subscription = this.getReportUrl().pipe(switchMap(link => link ? this.getReportDataUrl(link) : of(null))).subscribe({
40
46
  next: (url) => {
41
47
  this.status = url ? "success" : "empty";
@@ -53,11 +59,11 @@ class ReportComponent {
53
59
  },
54
60
  });
55
61
  }
56
- ngOnInit() {
57
- var _a, _b, _c;
58
- if (!((_c = (_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.owners) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.userId)) {
59
- this.status = 'nouser';
60
- }
62
+ ngAfterViewInit() {
63
+ this.init();
64
+ }
65
+ refresh() {
66
+ this.init();
61
67
  }
62
68
  ngOnDestroy() {
63
69
  if (this.reportDataUrl)
@@ -65,8 +71,23 @@ class ReportComponent {
65
71
  if (this.subscription)
66
72
  this.subscription.unsubscribe();
67
73
  }
74
+ // NOTE: there could be something wrong / unusual here but it seems to work ok
75
+ ngOnInit() {
76
+ var _a;
77
+ if (this.config && !this.configDiffer)
78
+ this.configDiffer = this.kvDiffers.find(this.config).create();
79
+ if (((_a = this.config) === null || _a === void 0 ? void 0 : _a.owners) && !this.ownersDiffer)
80
+ this.ownersDiffer = this.itDiffers.find(this.config.owners).create();
81
+ }
82
+ ngDoCheck() {
83
+ var _a, _b, _c;
84
+ const configChanges = (_a = this.configDiffer) === null || _a === void 0 ? void 0 : _a.diff(this.config);
85
+ const ownersChanges = (_b = this.ownersDiffer) === null || _b === void 0 ? void 0 : _b.diff((_c = this.config) === null || _c === void 0 ? void 0 : _c.owners);
86
+ if (configChanges || ownersChanges)
87
+ this.init();
88
+ }
68
89
  }
69
- ReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ReportComponent, deps: [{ token: i1.HttpClient }, { token: i2.SharedService }], target: i0.ɵɵFactoryTarget.Component });
90
+ ReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ReportComponent, deps: [{ token: i1.HttpClient }, { token: i2.SharedService }, { token: i0.KeyValueDiffers }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
70
91
  ReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ReportComponent, selector: "lib-report", inputs: { config: "config" }, viewQueries: [{ propertyName: "renderFrame", first: true, predicate: ["renderFrame"], descendants: true }], ngImport: i0, template: `
71
92
  <div class="wrapper">
72
93
  <div class="status" *ngIf="status === 'empty'">
@@ -113,7 +134,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
113
134
  </div>
114
135
  </div>
115
136
  `, styles: [".wrapper{width:100%;height:100%}.status{font-size:2rem;margin:5rem auto;text-align:center}.aspect-ratio-container{width:100%;position:relative;max-height:1000px;aspect-ratio:1 / 1}iframe{top:0;left:0;width:100%;height:100%;border:none;position:absolute}\n"] }]
116
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SharedService }]; }, propDecorators: { config: [{
137
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SharedService }, { type: i0.KeyValueDiffers }, { type: i0.IterableDiffers }]; }, propDecorators: { config: [{
117
138
  type: Input
118
139
  }], renderFrame: [{
119
140
  type: ViewChild,
@@ -1 +1 @@
1
- {"version":3,"file":"alimetry-report.mjs","sources":["../../../projects/report/src/lib/report.service.ts","../../../projects/report/src/lib/report.component.ts","../../../projects/report/src/lib/report.module.ts","../../../projects/report/src/public-api.ts","../../../projects/report/src/alimetry-report.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportService {\n\n constructor() { }\n}\n","import { Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { map, of, Subscription } from 'rxjs';\nimport { Observable } from 'rxjs';\nimport { switchMap } from 'rxjs';\nimport { OnDestroy } from '@angular/core';\nimport { Config, SharedService } from 'shared';\n\n@Component({\n selector: 'lib-report', template: `\n <div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'empty'\">\n This user doesn't have a report.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <div class=\"status\" *ngIf=\"status === 'loading'\">\n Loading report for user...\n </div>\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the report.\n </div>\n <div\n class=\"aspect-ratio-container\"\n [ngStyle]=\"{ 'display': status === 'success' ? 'block' : 'none' }\"\n >\n <iframe #renderFrame title=\"PDF Report\"></iframe>\n </div>\n </div>\n `,\n styleUrls: [\n \"./report.component.css\"\n ]\n})\nexport class ReportComponent implements OnDestroy {\n @Input() config!: Config;\n\n @ViewChild('renderFrame', { static: false })\n renderFrame: ElementRef<HTMLIFrameElement> | undefined;\n\n reportDataUrl: string | undefined;\n subscription: Subscription;\n status: 'error' | 'loading' | 'success' | 'empty' | 'nouser' = 'loading';\n\n constructor(private http: HttpClient, private shared: SharedService) { }\n\n private getReportUrl(): Observable<string | null> {\n return this.shared.getDeviceData(\n this.config.deviceDataModelId,\n this.config.owners[0].userId,\n ['PdfReport']\n ).pipe(\n map(res => res?.data?.['PdfReport']?.link || null)\n );\n }\n\n private getReportDataUrl(link: string): Observable<string> {\n return this.http.get(link, { responseType: 'blob' }).pipe(\n map(res => {\n const pdfBlob = new Blob([res], { type: 'application/pdf' });\n return URL.createObjectURL(pdfBlob);\n })\n );\n }\n\n ngAfterViewInit() {\n if (this.status === 'nouser') return;\n\n this.subscription = this.getReportUrl().pipe(\n switchMap(link => link ? this.getReportDataUrl(link) : of(null)),\n ).subscribe({\n next: (url) => {\n this.status = url ? \"success\" : \"empty\";\n this.renderFrame!.nativeElement.src = url;\n this.reportDataUrl = url\n },\n error: (err) => {\n if (err.error == \"ItemNotFoundException: none-found\") {\n this.status = \"empty\";\n } else {\n console.error(err);\n this.status = \"error\";\n }\n },\n });\n }\n\n ngOnInit() {\n if (!this.config?.owners?.[0]?.userId) {\n this.status = 'nouser';\n }\n }\n\n ngOnDestroy() {\n if (this.reportDataUrl) URL.revokeObjectURL(this.reportDataUrl);\n if (this.subscription) this.subscription.unsubscribe();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReportComponent } from './report.component';\n\n\n\n@NgModule({\n declarations: [\n ReportComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n ReportComponent\n ]\n})\nexport class ReportModule { }\n","/*\n * Public API Surface of report\n */\n\nexport * from './lib/report.service';\nexport * from './lib/report.component';\nexport * from './lib/report.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alimetry-report.mjs","sources":["../../../projects/report/src/lib/report.service.ts","../../../projects/report/src/lib/report.component.ts","../../../projects/report/src/lib/report.module.ts","../../../projects/report/src/public-api.ts","../../../projects/report/src/alimetry-report.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportService {\n\n constructor() { }\n}\n","import { Component, DoCheck, ElementRef, Input, IterableDiffer, IterableDiffers, KeyValueDiffer, KeyValueDiffers, ViewChild } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { map, of, Subscription } from 'rxjs';\nimport { Observable } from 'rxjs';\nimport { switchMap } from 'rxjs';\nimport { OnDestroy } from '@angular/core';\nimport { Config, SharedService } from 'alimetry-shared';\n\n@Component({\n selector: 'lib-report', template: `\n <div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'empty'\">\n This user doesn't have a report.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <div class=\"status\" *ngIf=\"status === 'loading'\">\n Loading report for user...\n </div>\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the report.\n </div>\n <div\n class=\"aspect-ratio-container\"\n [ngStyle]=\"{ 'display': status === 'success' ? 'block' : 'none' }\"\n >\n <iframe #renderFrame title=\"PDF Report\"></iframe>\n </div>\n </div>\n `,\n styleUrls: [\n \"./report.component.css\"\n ]\n})\nexport class ReportComponent implements OnDestroy, DoCheck {\n @Input() config!: Config;\n\n private configDiffer?: KeyValueDiffer<keyof Config, any>;\n private ownersDiffer?: IterableDiffer<string>;\n\n @ViewChild('renderFrame', { static: false })\n renderFrame: ElementRef<HTMLIFrameElement> | undefined;\n\n reportDataUrl: string | undefined;\n subscription: Subscription;\n status: 'error' | 'loading' | 'success' | 'empty' | 'nouser' = 'loading';\n\n constructor(private http: HttpClient, private shared: SharedService, private kvDiffers: KeyValueDiffers, private itDiffers: IterableDiffers) { }\n\n private getReportUrl(): Observable<string | null> {\n return this.shared.getDeviceData(\n this.config.deviceDataModelId,\n this.config.owners[0],\n ['PdfReport']\n ).pipe(\n map(res => res?.data?.['PdfReport']?.link || null)\n );\n }\n\n private getReportDataUrl(link: string): Observable<string> {\n return this.http.get(link, { responseType: 'blob' }).pipe(\n map(res => {\n const pdfBlob = new Blob([res], { type: 'application/pdf' });\n return URL.createObjectURL(pdfBlob);\n })\n );\n }\n\n init() {\n if (!this.config?.owners?.[0]) {\n this.status = 'nouser';\n return;\n }\n\n this.status = 'loading';\n\n this.subscription = this.getReportUrl().pipe(\n switchMap(link => link ? this.getReportDataUrl(link) : of(null)),\n ).subscribe({\n next: (url) => {\n this.status = url ? \"success\" : \"empty\";\n this.renderFrame!.nativeElement.src = url;\n this.reportDataUrl = url\n },\n error: (err) => {\n if (err.error == \"ItemNotFoundException: none-found\") {\n this.status = \"empty\";\n } else {\n console.error(err);\n this.status = \"error\";\n }\n },\n });\n }\n\n ngAfterViewInit() {\n this.init();\n }\n\n refresh() {\n this.init();\n }\n\n ngOnDestroy() {\n if (this.reportDataUrl) URL.revokeObjectURL(this.reportDataUrl);\n if (this.subscription) this.subscription.unsubscribe();\n }\n\n // NOTE: there could be something wrong / unusual here but it seems to work ok\n ngOnInit() {\n if (this.config && !this.configDiffer) this.configDiffer = this.kvDiffers.find(this.config).create();\n if (this.config?.owners && !this.ownersDiffer) this.ownersDiffer = this.itDiffers.find(this.config.owners).create();\n }\n\n ngDoCheck() {\n const configChanges = this.configDiffer?.diff(this.config);\n const ownersChanges = this.ownersDiffer?.diff(this.config?.owners);\n\n if (configChanges || ownersChanges) this.init();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReportComponent } from './report.component';\n\n\n\n@NgModule({\n declarations: [\n ReportComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n ReportComponent\n ]\n})\nexport class ReportModule { }\n","/*\n * Public API Surface of report\n */\n\nexport * from './lib/report.service';\nexport * from './lib/report.component';\nexport * from './lib/report.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;MAKa,aAAa,CAAA;AAExB,IAAA,WAAA,GAAA,GAAiB;;2GAFN,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAb,aAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA,CAAA;4FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;iBACnB,CAAA;;;MC+BY,eAAe,CAAA;AAa1B,IAAA,WAAA,CAAoB,IAAgB,EAAU,MAAqB,EAAU,SAA0B,EAAU,SAA0B,EAAA;AAAvH,QAAA,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAY;AAAU,QAAA,IAAM,CAAA,MAAA,GAAN,MAAM,CAAe;AAAU,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAiB;AAAU,QAAA,IAAS,CAAA,SAAA,GAAT,SAAS,CAAiB;AAF3I,QAAA,IAAM,CAAA,MAAA,GAAyD,SAAS,CAAC;KAEuE;IAExI,YAAY,GAAA;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAC9B,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EACrB,CAAC,WAAW,CAAC,CACd,CAAC,IAAI,CACJ,GAAG,CAAC,GAAG,IAAI,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA,CAAA,OAAA,CAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAG,KAAH,IAAA,IAAA,GAAG,KAAH,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,GAAG,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,WAAW,CAAC,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,KAAI,IAAI,CAAA,EAAA,CAAC,CACnD,CAAC;KACH;AAEO,IAAA,gBAAgB,CAAC,IAAY,EAAA;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CACvD,GAAG,CAAC,GAAG,IAAG;AACR,YAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC7D,YAAA,OAAO,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;SACrC,CAAC,CACH,CAAC;KACH;IAED,IAAI,GAAA;;AACF,QAAA,IAAI,EAAC,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,CAAC,CAAC,CAAA,EAAE;AAC7B,YAAA,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;AAExB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAC1C,SAAS,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CACjE,CAAC,SAAS,CAAC;AACV,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,OAAO,CAAC;gBACxC,IAAI,CAAC,WAAY,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;AAC1C,gBAAA,IAAI,CAAC,aAAa,GAAG,GAAG,CAAA;aACzB;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,GAAG,CAAC,KAAK,IAAI,mCAAmC,EAAE;AACpD,oBAAA,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;AACvB,iBAAA;AAAM,qBAAA;AACL,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnB,oBAAA,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;AACvB,iBAAA;aACF;AACF,SAAA,CAAC,CAAC;KACJ;IAED,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;KACb;IAED,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,EAAE,CAAC;KACb;IAED,WAAW,GAAA;QACT,IAAI,IAAI,CAAC,aAAa;AAAE,YAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;KACxD;;IAGD,QAAQ,GAAA;;AACN,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY;AAAE,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QACrG,IAAI,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,KAAI,CAAC,IAAI,CAAC,YAAY;AAAE,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;KACrH;IAED,SAAS,GAAA;;AACP,QAAA,MAAM,aAAa,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3D,QAAA,MAAM,aAAa,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAI,CAAC,CAAA,EAAA,GAAA,IAAI,CAAC,MAAM,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,CAAC,CAAC;QAEnE,IAAI,aAAa,IAAI,aAAa;YAAE,IAAI,CAAC,IAAI,EAAE,CAAC;KACjD;;6GArFU,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,aAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,eAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EA1BQ,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;AAqBjC,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,iQAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;4FAKU,eAAe,EAAA,UAAA,EAAA,CAAA;kBA3B3B,SAAS;YACE,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EAAY,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;AAqBjC,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,iQAAA,CAAA,EAAA,CAAA;yLAMQ,MAAM,EAAA,CAAA;sBAAd,KAAK;gBAMN,WAAW,EAAA,CAAA;sBADV,SAAS;gBAAC,IAAA,EAAA,CAAA,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;;;MCxBhC,YAAY,CAAA;;0GAAZ,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAZ,YAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,EATrB,YAAA,EAAA,CAAA,eAAe,CAGf,EAAA,OAAA,EAAA,CAAA,YAAY,aAGZ,eAAe,CAAA,EAAA,CAAA,CAAA;AAGN,YAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,YANrB,YAAY,CAAA,EAAA,CAAA,CAAA;4FAMH,YAAY,EAAA,UAAA,EAAA,CAAA;kBAXxB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,eAAe;AAChB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;AACb,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,eAAe;AAChB,qBAAA;iBACF,CAAA;;;AChBD;;AAEG;;ACFH;;AAEG;;;;"}
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, Component, Input, ViewChild, NgModule } from '@angular/core';
3
3
  import { map, switchMap, of } from 'rxjs';
4
4
  import * as i1 from '@angular/common/http';
5
- import * as i2 from 'shared';
5
+ import * as i2 from 'alimetry-shared';
6
6
  import * as i3 from '@angular/common';
7
7
  import { CommonModule } from '@angular/common';
8
8
 
@@ -19,13 +19,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
19
19
  }], ctorParameters: function () { return []; } });
20
20
 
21
21
  class ReportComponent {
22
- constructor(http, shared) {
22
+ constructor(http, shared, kvDiffers, itDiffers) {
23
23
  this.http = http;
24
24
  this.shared = shared;
25
+ this.kvDiffers = kvDiffers;
26
+ this.itDiffers = itDiffers;
25
27
  this.status = 'loading';
26
28
  }
27
29
  getReportUrl() {
28
- return this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0].userId, ['PdfReport']).pipe(map(res => res?.data?.['PdfReport']?.link || null));
30
+ return this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0], ['PdfReport']).pipe(map(res => res?.data?.['PdfReport']?.link || null));
29
31
  }
30
32
  getReportDataUrl(link) {
31
33
  return this.http.get(link, { responseType: 'blob' }).pipe(map(res => {
@@ -33,9 +35,12 @@ class ReportComponent {
33
35
  return URL.createObjectURL(pdfBlob);
34
36
  }));
35
37
  }
36
- ngAfterViewInit() {
37
- if (this.status === 'nouser')
38
+ init() {
39
+ if (!this.config?.owners?.[0]) {
40
+ this.status = 'nouser';
38
41
  return;
42
+ }
43
+ this.status = 'loading';
39
44
  this.subscription = this.getReportUrl().pipe(switchMap(link => link ? this.getReportDataUrl(link) : of(null))).subscribe({
40
45
  next: (url) => {
41
46
  this.status = url ? "success" : "empty";
@@ -53,10 +58,11 @@ class ReportComponent {
53
58
  },
54
59
  });
55
60
  }
56
- ngOnInit() {
57
- if (!this.config?.owners?.[0]?.userId) {
58
- this.status = 'nouser';
59
- }
61
+ ngAfterViewInit() {
62
+ this.init();
63
+ }
64
+ refresh() {
65
+ this.init();
60
66
  }
61
67
  ngOnDestroy() {
62
68
  if (this.reportDataUrl)
@@ -64,8 +70,21 @@ class ReportComponent {
64
70
  if (this.subscription)
65
71
  this.subscription.unsubscribe();
66
72
  }
73
+ // NOTE: there could be something wrong / unusual here but it seems to work ok
74
+ ngOnInit() {
75
+ if (this.config && !this.configDiffer)
76
+ this.configDiffer = this.kvDiffers.find(this.config).create();
77
+ if (this.config?.owners && !this.ownersDiffer)
78
+ this.ownersDiffer = this.itDiffers.find(this.config.owners).create();
79
+ }
80
+ ngDoCheck() {
81
+ const configChanges = this.configDiffer?.diff(this.config);
82
+ const ownersChanges = this.ownersDiffer?.diff(this.config?.owners);
83
+ if (configChanges || ownersChanges)
84
+ this.init();
85
+ }
67
86
  }
68
- ReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ReportComponent, deps: [{ token: i1.HttpClient }, { token: i2.SharedService }], target: i0.ɵɵFactoryTarget.Component });
87
+ ReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ReportComponent, deps: [{ token: i1.HttpClient }, { token: i2.SharedService }, { token: i0.KeyValueDiffers }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
69
88
  ReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ReportComponent, selector: "lib-report", inputs: { config: "config" }, viewQueries: [{ propertyName: "renderFrame", first: true, predicate: ["renderFrame"], descendants: true }], ngImport: i0, template: `
70
89
  <div class="wrapper">
71
90
  <div class="status" *ngIf="status === 'empty'">
@@ -112,7 +131,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
112
131
  </div>
113
132
  </div>
114
133
  `, styles: [".wrapper{width:100%;height:100%}.status{font-size:2rem;margin:5rem auto;text-align:center}.aspect-ratio-container{width:100%;position:relative;max-height:1000px;aspect-ratio:1 / 1}iframe{top:0;left:0;width:100%;height:100%;border:none;position:absolute}\n"] }]
115
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SharedService }]; }, propDecorators: { config: [{
134
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SharedService }, { type: i0.KeyValueDiffers }, { type: i0.IterableDiffers }]; }, propDecorators: { config: [{
116
135
  type: Input
117
136
  }], renderFrame: [{
118
137
  type: ViewChild,
@@ -1 +1 @@
1
- {"version":3,"file":"alimetry-report.mjs","sources":["../../../projects/report/src/lib/report.service.ts","../../../projects/report/src/lib/report.component.ts","../../../projects/report/src/lib/report.module.ts","../../../projects/report/src/public-api.ts","../../../projects/report/src/alimetry-report.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportService {\n\n constructor() { }\n}\n","import { Component, ElementRef, Input, ViewChild } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { map, of, Subscription } from 'rxjs';\nimport { Observable } from 'rxjs';\nimport { switchMap } from 'rxjs';\nimport { OnDestroy } from '@angular/core';\nimport { Config, SharedService } from 'shared';\n\n@Component({\n selector: 'lib-report', template: `\n <div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'empty'\">\n This user doesn't have a report.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <div class=\"status\" *ngIf=\"status === 'loading'\">\n Loading report for user...\n </div>\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the report.\n </div>\n <div\n class=\"aspect-ratio-container\"\n [ngStyle]=\"{ 'display': status === 'success' ? 'block' : 'none' }\"\n >\n <iframe #renderFrame title=\"PDF Report\"></iframe>\n </div>\n </div>\n `,\n styleUrls: [\n \"./report.component.css\"\n ]\n})\nexport class ReportComponent implements OnDestroy {\n @Input() config!: Config;\n\n @ViewChild('renderFrame', { static: false })\n renderFrame: ElementRef<HTMLIFrameElement> | undefined;\n\n reportDataUrl: string | undefined;\n subscription: Subscription;\n status: 'error' | 'loading' | 'success' | 'empty' | 'nouser' = 'loading';\n\n constructor(private http: HttpClient, private shared: SharedService) { }\n\n private getReportUrl(): Observable<string | null> {\n return this.shared.getDeviceData(\n this.config.deviceDataModelId,\n this.config.owners[0].userId,\n ['PdfReport']\n ).pipe(\n map(res => res?.data?.['PdfReport']?.link || null)\n );\n }\n\n private getReportDataUrl(link: string): Observable<string> {\n return this.http.get(link, { responseType: 'blob' }).pipe(\n map(res => {\n const pdfBlob = new Blob([res], { type: 'application/pdf' });\n return URL.createObjectURL(pdfBlob);\n })\n );\n }\n\n ngAfterViewInit() {\n if (this.status === 'nouser') return;\n\n this.subscription = this.getReportUrl().pipe(\n switchMap(link => link ? this.getReportDataUrl(link) : of(null)),\n ).subscribe({\n next: (url) => {\n this.status = url ? \"success\" : \"empty\";\n this.renderFrame!.nativeElement.src = url;\n this.reportDataUrl = url\n },\n error: (err) => {\n if (err.error == \"ItemNotFoundException: none-found\") {\n this.status = \"empty\";\n } else {\n console.error(err);\n this.status = \"error\";\n }\n },\n });\n }\n\n ngOnInit() {\n if (!this.config?.owners?.[0]?.userId) {\n this.status = 'nouser';\n }\n }\n\n ngOnDestroy() {\n if (this.reportDataUrl) URL.revokeObjectURL(this.reportDataUrl);\n if (this.subscription) this.subscription.unsubscribe();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReportComponent } from './report.component';\n\n\n\n@NgModule({\n declarations: [\n ReportComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n ReportComponent\n ]\n})\nexport class ReportModule { }\n","/*\n * Public API Surface of report\n */\n\nexport * from './lib/report.service';\nexport * from './lib/report.component';\nexport * from './lib/report.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"alimetry-report.mjs","sources":["../../../projects/report/src/lib/report.service.ts","../../../projects/report/src/lib/report.component.ts","../../../projects/report/src/lib/report.module.ts","../../../projects/report/src/public-api.ts","../../../projects/report/src/alimetry-report.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ReportService {\n\n constructor() { }\n}\n","import { Component, DoCheck, ElementRef, Input, IterableDiffer, IterableDiffers, KeyValueDiffer, KeyValueDiffers, ViewChild } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { map, of, Subscription } from 'rxjs';\nimport { Observable } from 'rxjs';\nimport { switchMap } from 'rxjs';\nimport { OnDestroy } from '@angular/core';\nimport { Config, SharedService } from 'alimetry-shared';\n\n@Component({\n selector: 'lib-report', template: `\n <div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'empty'\">\n This user doesn't have a report.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <div class=\"status\" *ngIf=\"status === 'loading'\">\n Loading report for user...\n </div>\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the report.\n </div>\n <div\n class=\"aspect-ratio-container\"\n [ngStyle]=\"{ 'display': status === 'success' ? 'block' : 'none' }\"\n >\n <iframe #renderFrame title=\"PDF Report\"></iframe>\n </div>\n </div>\n `,\n styleUrls: [\n \"./report.component.css\"\n ]\n})\nexport class ReportComponent implements OnDestroy, DoCheck {\n @Input() config!: Config;\n\n private configDiffer?: KeyValueDiffer<keyof Config, any>;\n private ownersDiffer?: IterableDiffer<string>;\n\n @ViewChild('renderFrame', { static: false })\n renderFrame: ElementRef<HTMLIFrameElement> | undefined;\n\n reportDataUrl: string | undefined;\n subscription: Subscription;\n status: 'error' | 'loading' | 'success' | 'empty' | 'nouser' = 'loading';\n\n constructor(private http: HttpClient, private shared: SharedService, private kvDiffers: KeyValueDiffers, private itDiffers: IterableDiffers) { }\n\n private getReportUrl(): Observable<string | null> {\n return this.shared.getDeviceData(\n this.config.deviceDataModelId,\n this.config.owners[0],\n ['PdfReport']\n ).pipe(\n map(res => res?.data?.['PdfReport']?.link || null)\n );\n }\n\n private getReportDataUrl(link: string): Observable<string> {\n return this.http.get(link, { responseType: 'blob' }).pipe(\n map(res => {\n const pdfBlob = new Blob([res], { type: 'application/pdf' });\n return URL.createObjectURL(pdfBlob);\n })\n );\n }\n\n init() {\n if (!this.config?.owners?.[0]) {\n this.status = 'nouser';\n return;\n }\n\n this.status = 'loading';\n\n this.subscription = this.getReportUrl().pipe(\n switchMap(link => link ? this.getReportDataUrl(link) : of(null)),\n ).subscribe({\n next: (url) => {\n this.status = url ? \"success\" : \"empty\";\n this.renderFrame!.nativeElement.src = url;\n this.reportDataUrl = url\n },\n error: (err) => {\n if (err.error == \"ItemNotFoundException: none-found\") {\n this.status = \"empty\";\n } else {\n console.error(err);\n this.status = \"error\";\n }\n },\n });\n }\n\n ngAfterViewInit() {\n this.init();\n }\n\n refresh() {\n this.init();\n }\n\n ngOnDestroy() {\n if (this.reportDataUrl) URL.revokeObjectURL(this.reportDataUrl);\n if (this.subscription) this.subscription.unsubscribe();\n }\n\n // NOTE: there could be something wrong / unusual here but it seems to work ok\n ngOnInit() {\n if (this.config && !this.configDiffer) this.configDiffer = this.kvDiffers.find(this.config).create();\n if (this.config?.owners && !this.ownersDiffer) this.ownersDiffer = this.itDiffers.find(this.config.owners).create();\n }\n\n ngDoCheck() {\n const configChanges = this.configDiffer?.diff(this.config);\n const ownersChanges = this.ownersDiffer?.diff(this.config?.owners);\n\n if (configChanges || ownersChanges) this.init();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReportComponent } from './report.component';\n\n\n\n@NgModule({\n declarations: [\n ReportComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n ReportComponent\n ]\n})\nexport class ReportModule { }\n","/*\n * Public API Surface of report\n */\n\nexport * from './lib/report.service';\nexport * from './lib/report.component';\nexport * from './lib/report.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,23 +1,30 @@
1
- import { ElementRef } from '@angular/core';
1
+ import { DoCheck, ElementRef, IterableDiffers, KeyValueDiffers } from '@angular/core';
2
2
  import { HttpClient } from '@angular/common/http';
3
3
  import { Subscription } from 'rxjs';
4
4
  import { OnDestroy } from '@angular/core';
5
- import { Config, SharedService } from 'shared';
5
+ import { Config, SharedService } from 'alimetry-shared';
6
6
  import * as i0 from "@angular/core";
7
- export declare class ReportComponent implements OnDestroy {
7
+ export declare class ReportComponent implements OnDestroy, DoCheck {
8
8
  private http;
9
9
  private shared;
10
+ private kvDiffers;
11
+ private itDiffers;
10
12
  config: Config;
13
+ private configDiffer?;
14
+ private ownersDiffer?;
11
15
  renderFrame: ElementRef<HTMLIFrameElement> | undefined;
12
16
  reportDataUrl: string | undefined;
13
17
  subscription: Subscription;
14
18
  status: 'error' | 'loading' | 'success' | 'empty' | 'nouser';
15
- constructor(http: HttpClient, shared: SharedService);
19
+ constructor(http: HttpClient, shared: SharedService, kvDiffers: KeyValueDiffers, itDiffers: IterableDiffers);
16
20
  private getReportUrl;
17
21
  private getReportDataUrl;
22
+ init(): void;
18
23
  ngAfterViewInit(): void;
19
- ngOnInit(): void;
24
+ refresh(): void;
20
25
  ngOnDestroy(): void;
26
+ ngOnInit(): void;
27
+ ngDoCheck(): void;
21
28
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportComponent, never>;
22
29
  static ɵcmp: i0.ɵɵComponentDeclaration<ReportComponent, "lib-report", never, { "config": "config"; }, {}, never, never, false, never>;
23
30
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alimetry-report",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^15.2.0",
6
6
  "@angular/core": "^15.2.0",