alimetry-detail-edit 1.0.0 → 1.1.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 +8 -4
- package/esm2020/lib/detail-edit.component.mjs +23 -31
- package/esm2020/lib/utils.mjs +6 -1
- package/fesm2015/alimetry-detail-edit.mjs +27 -34
- package/fesm2015/alimetry-detail-edit.mjs.map +1 -1
- package/fesm2020/alimetry-detail-edit.mjs +26 -29
- package/fesm2020/alimetry-detail-edit.mjs.map +1 -1
- package/lib/detail-edit.component.d.ts +3 -3
- package/lib/utils.d.ts +8 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,10 +6,14 @@ Selector: `lib-detail-edit`
|
|
|
6
6
|
|
|
7
7
|
### Config Object
|
|
8
8
|
|
|
9
|
+
```js
|
|
9
10
|
{
|
|
10
|
-
owners:
|
|
11
|
-
deviceDataModelId,
|
|
12
|
-
|
|
11
|
+
owners: string[], // user ids
|
|
12
|
+
deviceDataModelId: string,
|
|
13
|
+
currentUserId: string
|
|
13
14
|
}
|
|
15
|
+
```
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
### Dependencies
|
|
18
|
+
|
|
19
|
+
`alimetry-shared` library as a peer dependency
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Component, Input } from '@angular/core';
|
|
2
2
|
import { FormControl, FormGroup, Validators } from '@angular/forms';
|
|
3
3
|
import { forkJoin, tap } from 'rxjs';
|
|
4
|
-
import { getAge, globaliseDateTime, localiseDateTime, shallowCompare } from './utils';
|
|
4
|
+
import { getAge, globaliseDateTime, localiseDateTime, shallowCompare, shallowDiff } from './utils';
|
|
5
5
|
import { dateComparison, withinNYears, withinNHours, translateError } from './validators';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "shared";
|
|
7
|
+
import * as i1 from "alimetry-shared";
|
|
8
8
|
import * as i2 from "@angular/forms";
|
|
9
9
|
import * as i3 from "@angular/common";
|
|
10
10
|
import * as i4 from "./entries.pipe";
|
|
@@ -65,7 +65,7 @@ export class DetailEditComponent {
|
|
|
65
65
|
patient.age = getAge(mods.dob);
|
|
66
66
|
recordingSession.mealStart = globaliseDateTime(mods.mealStart);
|
|
67
67
|
recordingSession.mealEnd = globaliseDateTime(mods.mealEnd);
|
|
68
|
-
this.
|
|
68
|
+
this.logChange(mods);
|
|
69
69
|
return {
|
|
70
70
|
'Age': patient.age,
|
|
71
71
|
'RecordingSession': JSON.stringify(recordingSession),
|
|
@@ -73,46 +73,37 @@ export class DetailEditComponent {
|
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
postDeviceData(devicePropertySetId, data) {
|
|
76
|
-
return this.shared.saveDeviceData(this.config.deviceDataModelId, this.deviceDataId, devicePropertySetId, this.config.owners[0]
|
|
76
|
+
return this.shared.saveDeviceData(this.config.deviceDataModelId, this.deviceDataId, devicePropertySetId, this.config.owners[0], data);
|
|
77
77
|
}
|
|
78
78
|
// patch the device data record with the modifications
|
|
79
79
|
saveModifications() {
|
|
80
80
|
const mods = this.formGroup.getRawValue();
|
|
81
81
|
const patchedDeviceData = this.integrateFields(mods, this.recordingSession);
|
|
82
|
-
const patchedUserData = Object.assign(this.
|
|
82
|
+
const patchedUserData = Object.assign(this.owner, { dateOfBirth: mods.dob });
|
|
83
83
|
this.status = 'sending';
|
|
84
84
|
forkJoin([
|
|
85
85
|
this.postDeviceData(appDataPropertySetId, patchedDeviceData),
|
|
86
|
-
this.shared.updateUser(this.config.owners[0]
|
|
86
|
+
this.shared.updateUser(this.config.owners[0], patchedUserData)
|
|
87
87
|
]).pipe(tap(() => this.regenReport())).subscribe();
|
|
88
88
|
}
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
const newChangeLog = {};
|
|
92
|
-
// Only include fields that have changed
|
|
93
|
-
for (const key in mods) {
|
|
94
|
-
if (this.initialFormState[key] !== mods[key]) {
|
|
95
|
-
prevChangeLog[key] = this.initialFormState[key];
|
|
96
|
-
newChangeLog[key] = mods[key];
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
const changeLog = {
|
|
89
|
+
logChange(mods) {
|
|
90
|
+
const entry = {
|
|
100
91
|
author: this.currentUser.emailAddress,
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
timestamp: new Date().toISOString()
|
|
92
|
+
timestamp: new Date().toISOString(),
|
|
93
|
+
...shallowDiff(this.initialFormState, mods)
|
|
104
94
|
};
|
|
105
|
-
this.detailChangeLog.push(
|
|
95
|
+
this.detailChangeLog.push(entry);
|
|
96
|
+
console.log(this.detailChangeLog);
|
|
106
97
|
}
|
|
107
98
|
// get the device data record and initialise the form
|
|
108
99
|
loadDeviceData() {
|
|
109
|
-
this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0]
|
|
100
|
+
this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0], propertyCodes).subscribe({
|
|
110
101
|
next: (res) => {
|
|
111
102
|
this.deviceDataId = res.deviceDataId;
|
|
112
103
|
this.recordingSession = JSON.parse(res.data['RecordingSession'].value);
|
|
113
104
|
this.initialiseForm(this.extractFields(this.recordingSession));
|
|
114
|
-
//
|
|
115
|
-
this.detailChangeLog = res.data['UserDetailChangeLog']
|
|
105
|
+
// data field uninitialised for unmodified record
|
|
106
|
+
this.detailChangeLog = res.data['UserDetailChangeLog']?.value ?? [];
|
|
116
107
|
this.status = res.data['Status']?.value === 'Generating Report' ?
|
|
117
108
|
'generating' :
|
|
118
109
|
'success';
|
|
@@ -132,16 +123,17 @@ export class DetailEditComponent {
|
|
|
132
123
|
this.formGroup.patchValue(this.initialFormState);
|
|
133
124
|
}
|
|
134
125
|
ngOnInit() {
|
|
135
|
-
if (!this.config?.owners?.[0]
|
|
126
|
+
if (!this.config?.owners?.[0]) {
|
|
136
127
|
this.status = 'nouser';
|
|
137
128
|
return;
|
|
138
129
|
}
|
|
139
|
-
|
|
140
|
-
this.
|
|
141
|
-
|
|
142
|
-
|
|
130
|
+
forkJoin([
|
|
131
|
+
this.shared.getUser(this.config.currentUserId),
|
|
132
|
+
this.shared.getUser(this.config.owners[0])
|
|
133
|
+
]).pipe(tap(([current, owner]) => {
|
|
134
|
+
this.currentUser = current;
|
|
143
135
|
this.owner = owner;
|
|
144
|
-
});
|
|
136
|
+
})).subscribe();
|
|
145
137
|
this.loadDeviceData();
|
|
146
138
|
}
|
|
147
139
|
}
|
|
@@ -153,4 +145,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
153
145
|
}], ctorParameters: function () { return [{ type: i1.SharedService }]; }, propDecorators: { config: [{
|
|
154
146
|
type: Input
|
|
155
147
|
}] } });
|
|
156
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGV0YWlsLWVkaXQvc3JjL2xpYi9kZXRhaWwtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL2RldGFpbC1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7QUFFMUYsTUFBTSxvQkFBb0IsR0FBRyxzQ0FBc0MsQ0FBQztBQUNwRSxNQUFNLHVCQUF1QixHQUFHLHNDQUFzQyxDQUFDO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFNNUUsTUFBTSxPQUFPLG1CQUFtQjtJQXlCOUIsWUFBb0IsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQXRCekMsV0FBTSxHQUEwRSxTQUFTLENBQUM7UUFXMUYsY0FBUyxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ3hCLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUs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QixxRkNmaEMsMHdFQW9EQTs0RkRyQ2EsbUJBQW1CO2tCQUovQixTQUFTOytCQUNFLGlCQUFpQjtvR0FJbEIsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29uZmlnLCBTaGFyZWRTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnc2hhcmVkJztcbmltcG9ydCB7IGdldEFnZSwgZ2xvYmFsaXNlRGF0ZVRpbWUsIGxvY2FsaXNlRGF0ZVRpbWUsIHNoYWxsb3dDb21wYXJlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBkYXRlQ29tcGFyaXNvbiwgd2l0aGluTlllYXJzLCB3aXRoaW5OSG91cnMsIHRyYW5zbGF0ZUVycm9yIH0gZnJvbSAnLi92YWxpZGF0b3JzJztcblxuY29uc3QgYXBwRGF0YVByb3BlcnR5U2V0SWQgPSAnMzRkNDY0NzctYWQ0Yi00N2I0LWI1NTUtMDYzNThiOTJmNjBjJztcbmNvbnN0IGRldmljZURhdGFQcm9wZXJ0eVNldElkID0gJzdhMzJkODUxLTVlODktNDZhNi1hNGI2LWNjYTE2MmRhY2UyOSc7XG5jb25zdCBwcm9wZXJ0eUNvZGVzID0gWydSZWNvcmRpbmdTZXNzaW9uJywgJ1N0YXR1cycsICdVc2VyRGV0YWlsQ2hhbmdlTG9nJ107XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtZWRpdCcsIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RldGFpbC1lZGl0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZXRhaWxFZGl0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgY29uZmlnITogQ29uZmlnO1xuXG4gIHN0YXR1czogJ2Vycm9yJyB8ICdsb2FkaW5nJyB8ICdzdWNjZXNzJyB8ICdnZW5lcmF0aW5nJyB8ICdzZW5kaW5nJyB8ICdub3VzZXInID0gJ2xvYWRpbmcnO1xuXG4gIC8vIHBvcHVsYXRlZCBieSBsb2FkIHJlcXVlc3RcbiAgcHJpdmF0ZSBkZXZpY2VEYXRhSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWNvcmRpbmdTZXNzaW9uOiBvYmplY3Q7XG4gIHByaXZhdGUgcmVjb3JkaW5nU3RhcnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpbml0aWFsRm9ybVN0YXRlOiBvYmplY3Q7XG4gIHByaXZhdGUgZGV0YWlsQ2hhbmdlTG9nOiBvYmplY3RbXTtcbiAgcHJpdmF0ZSBjdXJyZW50VXNlcjogVXNlcjtcbiAgcHJpdmF0ZSBvd25lcjogVXNlcjtcblxuICBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBkb2I6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgd2l0aGluTlllYXJzKDEyMCwgJ2JlZm9yZScpXSksXG4gICAgaGVpZ2h0OiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPigwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMzApLCBWYWxpZGF0b3JzLm1heCgyNzIpXSksXG4gICAgd2VpZ2h0OiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPigwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSksIFZhbGlkYXRvcnMubWF4KDYzNSldKSxcbiAgICBtZWFsU3RhcnQ6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgIG1lYWxFbmQ6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXG4gIH0sIFtcbiAgICBkYXRlQ29tcGFyaXNvbignbWVhbEVuZCcsICdtZWFsU3RhcnQnLCAnYWZ0ZXInKSxcbiAgICBkYXRlQ29tcGFyaXNvbignbWVhbFN0YXJ0JywgJ2RvYicsICdhZnRlcicpLFxuICBdKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNoYXJlZDogU2hhcmVkU2VydmljZSkgeyB9XG5cbiAgcGFyc2VJbnB1dEVycm9ycyhuYW1lOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkge1xuICAgIHJldHVybiB0cmFuc2xhdGVFcnJvcihuYW1lLCBjb250cm9sKTtcbiAgfVxuXG4gIC8vIG1ha2Ugc3VyZSB0aGFuIG1vZGlmaWNhdGlvbnMgdGhhdCBkb24ndCBhY3R1YWxseSBkaWZmZXIgZnJvbSB0aGUgY3VycmVudCBhcmUgbWFya2VkIGFzIHN1Y2hcbiAgcHJpdmF0ZSBtb25pdG9yRm9ybUNoYW5nZXMoKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShjdXJyZW50ID0+IHtcbiAgICAgIGlmIChzaGFsbG93Q29tcGFyZShjdXJyZW50LCB0aGlzLmluaXRpYWxGb3JtU3RhdGUpKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vIGhhbmRsZSB0aGUgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSByZXNwb25zZSBib2R5XG4gIHByaXZhdGUgZXh0cmFjdEZpZWxkcyhyZWNvcmRpbmdTZXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgeyBwYXRpZW50LCBtZWFsU3RhcnQsIG1lYWxFbmQsIHJlY29yZGluZ1N0YXJ0IH0gPSByZWNvcmRpbmdTZXNzaW9uO1xuICAgIHRoaXMucmVjb3JkaW5nU3RhcnQgPSByZWNvcmRpbmdTdGFydDtcblxuICAgIHJldHVybiB7XG4gICAgICBkb2I6IHRoaXMub3duZXIuZGF0ZU9mQmlydGgsXG4gICAgICBoZWlnaHQ6IHBhdGllbnQuaGVpZ2h0LFxuICAgICAgd2VpZ2h0OiBwYXRpZW50LndlaWdodCxcbiAgICAgIG1lYWxTdGFydDogbG9jYWxpc2VEYXRlVGltZShtZWFsU3RhcnQpLFxuICAgICAgbWVhbEVuZDogbG9jYWxpc2VEYXRlVGltZShtZWFsRW5kKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGlzZUZvcm0oc3RhdGU6IG9iamVjdCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoc3RhdGUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc1ByaXN0aW5lKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ21lYWxTdGFydCcpLmFkZFZhbGlkYXRvcnMod2l0aGluTkhvdXJzKDI0LCAnYWZ0ZXInLCBuZXcgRGF0ZSh0aGlzLnJlY29yZGluZ1N0YXJ0KSkpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmdldCgnbWVhbEVuZCcpLmFkZFZhbGlkYXRvcnMod2l0aGluTkhvdXJzKDI0LCAnYWZ0ZXInLCBuZXcgRGF0ZSh0aGlzLnJlY29yZGluZ1N0YXJ0KSkpO1xuXG4gICAgdGhpcy5pbml0aWFsRm9ybVN0YXRlID0gc3RhdGU7IC8vIHNhdmUgdGhpcyBmb3IgdXNlIGluIHJlc2V0c1xuICAgIHRoaXMubW9uaXRvckZvcm1DaGFuZ2VzKCk7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgYSBwYXRjaCBvYmplY3QgZm9yIHRoZSBzYXZlIHJlcXVlc3RcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVGaWVsZHMobW9kczogdHlwZW9mIHRoaXMuZm9ybUdyb3VwLnZhbHVlLCByZWNvcmRpbmdTZXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgeyBwYXRpZW50IH0gPSByZWNvcmRpbmdTZXNzaW9uO1xuICAgIHBhdGllbnQuaGVpZ2h0ID0gbW9kcy5oZWlnaHQ7XG4gICAgcGF0aWVudC53ZWlnaHQgPSBtb2RzLndlaWdodDtcbiAgICBwYXRpZW50LmFnZSA9IGdldEFnZShtb2RzLmRvYik7XG5cbiAgICByZWNvcmRpbmdTZXNzaW9uLm1lYWxTdGFydCA9IGdsb2JhbGlzZURhdGVUaW1lKG1vZHMubWVhbFN0YXJ0KTtcbiAgICByZWNvcmRpbmdTZXNzaW9uLm1lYWxFbmQgPSBnbG9iYWxpc2VEYXRlVGltZShtb2RzLm1lYWxFbmQpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGFuZ2VMb2cobW9kcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0FnZSc6IHBhdGllbnQuYWdlLFxuICAgICAgJ1JlY29yZGluZ1Nlc3Npb24nOiBKU09OLnN0cmluZ2lmeShyZWNvcmRpbmdTZXNzaW9uKSxcbiAgICAgICdVc2VyRGV0YWlsQ2hhbmdlTG9nJzogdGhpcy5kZXRhaWxDaGFuZ2VMb2dcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc3REZXZpY2VEYXRhKGRldmljZVByb3BlcnR5U2V0SWQ6IHN0cmluZywgZGF0YTogb2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkLnNhdmVEZXZpY2VEYXRhKFxuICAgICAgdGhpcy5jb25maWcuZGV2aWNlRGF0YU1vZGVsSWQsXG4gICAgICB0aGlzLmRldmljZURhdGFJZCxcbiAgICAgIGRldmljZVByb3BlcnR5U2V0SWQsXG4gICAgICB0aGlzLmNvbmZpZy5vd25lcnNbMF0udXNlcklkLFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvLyBwYXRjaCB0aGUgZGV2aWNlIGRhdGEgcmVjb3JkIHdpdGggdGhlIG1vZGlmaWNhdGlvbnNcbiAgc2F2ZU1vZGlmaWNhdGlvbnMoKSB7XG4gICAgY29uc3QgbW9kcyA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG4gICAgY29uc3QgcGF0Y2hlZERldmljZURhdGEgPSB0aGlzLmludGVncmF0ZUZpZWxkcyhtb2RzLCB0aGlzLnJlY29yZGluZ1Nlc3Npb24pO1xuICAgIGNvbnN0IHBhdGNoZWRVc2VyRGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcub3duZXJzWzBdLCB7IGRhdGVPZkJpcnRoOiBtb2RzLmRvYiB9KTtcblxuICAgIHRoaXMuc3RhdHVzID0gJ3NlbmRpbmcnO1xuICAgIGZvcmtKb2luKFtcbiAgICAgIHRoaXMucG9zdERldmljZURhdGEoYXBwRGF0YVByb3BlcnR5U2V0SWQsIHBhdGNoZWREZXZpY2VEYXRhKSxcbiAgICAgIHRoaXMuc2hhcmVkLnVwZGF0ZVVzZXIodGhpcy5jb25maWcub3duZXJzWzBdLnVzZXJJZCwgcGF0Y2hlZFVzZXJEYXRhKVxuICAgIF0pLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5yZWdlblJlcG9ydCgpKVxuICAgICkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZENoYW5nZUxvZyhtb2RzOiB0eXBlb2YgdGhpcy5mb3JtR3JvdXAudmFsdWUpIHtcbiAgICBjb25zdCBwcmV2Q2hhbmdlTG9nOiBQYXJ0aWFsPHR5cGVvZiB0aGlzLmZvcm1Hcm91cC52YWx1ZT4gPSB7fTtcbiAgICBjb25zdCBuZXdDaGFuZ2VMb2c6IFBhcnRpYWw8dHlwZW9mIHRoaXMuZm9ybUdyb3VwLnZhbHVlPiA9IHt9O1xuXG4gICAgLy8gT25seSBpbmNsdWRlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgIGZvciAoY29uc3Qga2V5IGluIG1vZHMpIHtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxGb3JtU3RhdGVba2V5XSAhPT0gbW9kc1trZXldKSB7XG4gICAgICAgIHByZXZDaGFuZ2VMb2dba2V5XSA9IHRoaXMuaW5pdGlhbEZvcm1TdGF0ZVtrZXldO1xuICAgICAgICBuZXdDaGFuZ2VMb2dba2V5XSA9IG1vZHNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VMb2cgPSB7XG4gICAgICBhdXRob3I6IHRoaXMuY3VycmVudFVzZXIuZW1haWxBZGRyZXNzLFxuICAgICAgcHJldkNoYW5nZUxvZzogcHJldkNoYW5nZUxvZyxcbiAgICAgIG5ld0NoYW5nZUxvZzogbmV3Q2hhbmdlTG9nLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICB9XG5cbiAgICB0aGlzLmRldGFpbENoYW5nZUxvZy5wdXNoKGNoYW5nZUxvZyk7XG4gIH1cblxuICAvLyBnZXQgdGhlIGRldmljZSBkYXRhIHJlY29yZCBhbmQgaW5pdGlhbGlzZSB0aGUgZm9ybVxuICBwcml2YXRlIGxvYWREZXZpY2VEYXRhKCkge1xuICAgIHRoaXMuc2hhcmVkLmdldERldmljZURhdGEoXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2VEYXRhTW9kZWxJZCxcbiAgICAgIHRoaXMuY29uZmlnLm93bmVyc1swXS51c2VySWQsXG4gICAgICBwcm9wZXJ0eUNvZGVzXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmRldmljZURhdGFJZCA9IHJlcy5kZXZpY2VEYXRhSWQ7XG4gICAgICAgIHRoaXMucmVjb3JkaW5nU2Vzc2lvbiA9IEpTT04ucGFyc2UocmVzLmRhdGFbJ1JlY29yZGluZ1Nlc3Npb24nXS52YWx1ZSk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGlzZUZvcm0odGhpcy5leHRyYWN0RmllbGRzKHRoaXMucmVjb3JkaW5nU2Vzc2lvbikpO1xuICAgICAgICAvLyBjaGVja2luZyBmb3IgdW5kZWZpbmVkIGluIGNhc2Ugbm8gY2hhbmdlcyBoYXZlIGJlZW4gbG9nZ2VkIHlldFxuICAgICAgICB0aGlzLmRldGFpbENoYW5nZUxvZyA9IHJlcy5kYXRhWydVc2VyRGV0YWlsQ2hhbmdlTG9nJ10gPT09IHVuZGVmaW5lZCA/IFtdIDogcmVzLmRhdGFbJ1VzZXJEZXRhaWxDaGFuZ2VMb2cnXS52YWx1ZTtcblxuICAgICAgICB0aGlzLnN0YXR1cyA9IHJlcy5kYXRhWydTdGF0dXMnXT8udmFsdWUgPT09ICdHZW5lcmF0aW5nIFJlcG9ydCcgP1xuICAgICAgICAgICdnZW5lcmF0aW5nJyA6XG4gICAgICAgICAgJ3N1Y2Nlc3MnO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBcImVycm9yXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZWdlblJlcG9ydCgpIHtcbiAgICB0aGlzLnBvc3REZXZpY2VEYXRhKFxuICAgICAgZGV2aWNlRGF0YVByb3BlcnR5U2V0SWQsXG4gICAgICB7ICdBbGdvcml0aG1oYXNydW4nOiBmYWxzZSwgJ0FsZ29yaXRobVJ1bic6IHRydWUgfVxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuc3RhdHVzID0gJ2dlbmVyYXRpbmcnOyAvLyBhc3N1bWUgcmVwb3J0IHN0YXJ0cyBnZW5lcmF0aW5nIGltbWVkaWF0ZWx5XG4gICAgfSlcbiAgfVxuXG4gIHJlc2V0TW9kaWZpY2F0aW9ucygpIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHRoaXMuaW5pdGlhbEZvcm1TdGF0ZSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5vd25lcnM/LlswXT8udXNlcklkKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9ICdub3VzZXInO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNoYXJlZC5nZXRVc2VyKHRoaXMuY29uZmlnLmN1cnJlbnRVc2VyLnVzZXJJZCkuc3Vic2NyaWJlKHVzZXIgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHVzZXI7XG4gICAgfSk7XG5cbiAgICB0aGlzLnNoYXJlZC5nZXRVc2VyKHRoaXMuY29uZmlnLm93bmVyc1swXS51c2VySWQpLnN1YnNjcmliZShvd25lciA9PiB7XG4gICAgICB0aGlzLm93bmVyID0gb3duZXI7XG4gICAgfSk7XG5cbiAgICB0aGlzLmxvYWREZXZpY2VEYXRhKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ2Vycm9yJ1wiPlxuICAgIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGdldCB0aGUgZGV0YWlscy5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ25vdXNlcidcIj5cbiAgICBUaGVyZSBpcyBubyB1c2VyIHNwZWNpZmllZCBhcyB0aGUgZGF0YSBvd25lci5cbiAgPC9kaXY+XG4gIDxmb3JtICpuZ0lmPVwic3RhdHVzICE9PSAnZXJyb3InICYmIHN0YXR1cyAhPT0gJ25vdXNlcidcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJzYXZlTW9kaWZpY2F0aW9ucygpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0c1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJkb2JcIj5EYXRlIG9mIEJpcnRoOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImRvYlwiIHR5cGU9XCJkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZG9iXCI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ3ZWlnaHRcIj5QYXRpZW50IFdlaWdodCAoa2cpOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cIndlaWdodFwiIHR5cGU9XCJudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJ3ZWlnaHRcIj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImhlaWdodFwiPlBhdGllbnQgSGVpZ2h0IChjbSk6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiaGVpZ2h0XCIgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWVhbFN0YXJ0XCI+TWVhbCBTdGFydCBUaW1lOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cIm1lYWxTdGFydFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGZvcm1Db250cm9sTmFtZT1cIm1lYWxTdGFydFwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWVhbEVuZFwiPk1lYWwgRW5kIFRpbWU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibWVhbEVuZFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGZvcm1Db250cm9sTmFtZT1cIm1lYWxFbmRcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFmb3JtR3JvdXAudmFsaWQgJiYgZm9ybUdyb3VwLmRpcnR5XCIgY2xhc3M9XCJlcnJvcnNcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgZm9ybUdyb3VwLmNvbnRyb2xzIHwgZW50cmllc1wiPlxuICAgICAgICB7eyBwYXJzZUlucHV0RXJyb3JzKGNvbnRyb2xbMF0sIGNvbnRyb2xbMV0pIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzdGF0dXMgPT09ICdnZW5lcmF0aW5nJ1wiIGNsYXNzPVwiaW5mb1wiPlxuICAgICAgPGRpdj5UaGUgcmVwb3J0IGlzIGdlbmVyYXRpbmcgYXQgdGhlIG1vbWVudCwgY2hlY2sgYmFjayBsYXRlciBpZiB5b3UgbmVlZCB0byBtb2RpZnkgdGhpcyBlbnRyeS48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVnZW5SZXBvcnQoKVwiIFtkaXNhYmxlZF09XCJzdGF0dXMgPT09ICdzZW5kaW5nJyB8fCBzdGF0dXMgPT09ICdnZW5lcmF0aW5nJyB8fCBzdGF0dXMgPT09ICdsb2FkaW5nJ1wiPlJlZ2VuZXJhdGUgUmVwb3J0PC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXRNb2RpZmljYXRpb25zKClcIiBbZGlzYWJsZWRdPVwic3RhdHVzID09PSAnc2VuZGluZycgfHwgc3RhdHVzID09PSAnZ2VuZXJhdGluZycgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCI+Q2FuY2VsIE1vZGlmaWNhdGlvbjwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cInN0YXR1cyA9PT0gJ3NlbmRpbmcnIHx8IHN0YXR1cyA9PT0gJ2dlbmVyYXRpbmcnIHx8ICFmb3JtR3JvdXAudmFsaWQgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCI+U2F2ZSBEZXRhaWxzPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGV0YWlsLWVkaXQvc3JjL2xpYi9kZXRhaWwtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL2RldGFpbC1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkcsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7O0FBRTFGLE1BQU0sb0JBQW9CLEdBQUcsc0NBQXNDLENBQUM7QUFDcEUsTUFBTSx1QkFBdUIsR0FBRyxzQ0FBc0MsQ0FBQztBQUN2RSxNQUFNLGFBQWEsR0FBRyxDQUFDLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0FBcUI1RSxNQUFNLE9BQU8sbUJBQW1CO0lBNEI5QixZQUFvQixNQUFxQjtRQUFyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBekJ6QyxXQUFNLEdBQTBFLFNBQVMsQ0FBQztRQWMxRixjQUFTLEdBQUcsSUFBSSxTQUFTLENBQUM7WUFDeEIsR0FBRyxFQUFFLElBQUksV0FBVyxDQUFTLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFD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SSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDdkIsT0FBTztTQUNSO1FBRUQsUUFBUSxDQUFDO1lBQ1AsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFaEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7O2lIQWxMVSxtQkFBbUI7cUdBQW5CLG1CQUFtQixxRkM5QmhDLDB3RUFvREE7NEZEdEJhLG1CQUFtQjtrQkFKL0IsU0FBUzsrQkFDRSxpQkFBaUI7b0dBSWxCLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZvcmtKb2luLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbmZpZywgU2hhcmVkU2VydmljZSwgVXNlciB9IGZyb20gJ2FsaW1ldHJ5LXNoYXJlZCc7XG5pbXBvcnQgeyBnZXRBZ2UsIGdsb2JhbGlzZURhdGVUaW1lLCBsb2NhbGlzZURhdGVUaW1lLCBzaGFsbG93Q29tcGFyZSwgc2hhbGxvd0RpZmYgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGRhdGVDb21wYXJpc29uLCB3aXRoaW5OWWVhcnMsIHdpdGhpbk5Ib3VycywgdHJhbnNsYXRlRXJyb3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuXG5jb25zdCBhcHBEYXRhUHJvcGVydHlTZXRJZCA9ICczNGQ0NjQ3Ny1hZDRiLTQ3YjQtYjU1NS0wNjM1OGI5MmY2MGMnO1xuY29uc3QgZGV2aWNlRGF0YVByb3BlcnR5U2V0SWQgPSAnN2EzMmQ4NTEtNWU4OS00NmE2LWE0YjYtY2NhMTYyZGFjZTI5JztcbmNvbnN0IHByb3BlcnR5Q29kZXMgPSBbJ1JlY29yZGluZ1Nlc3Npb24nLCAnU3RhdHVzJywgJ1VzZXJEZXRhaWxDaGFuZ2VMb2cnXTtcblxuaW50ZXJmYWNlIEZvcm1WYWx1ZSB7XG4gIGRvYjogc3RyaW5nLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgd2VpZ2h0OiBudW1iZXIsXG4gIG1lYWxTdGFydDogc3RyaW5nLFxuICBtZWFsRW5kOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIENoYW5nZSB7XG4gIHRpbWVzdGFtcDogc3RyaW5nLFxuICBhdXRob3I6IHN0cmluZyxcbiAgZnJvbTogUGFydGlhbDxGb3JtVmFsdWU+LFxuICB0bzogUGFydGlhbDxGb3JtVmFsdWU+XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtZWRpdCcsIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RldGFpbC1lZGl0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZXRhaWxFZGl0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgY29uZmlnITogQ29uZmlnO1xuXG4gIHN0YXR1czogJ2Vycm9yJyB8ICdsb2FkaW5nJyB8ICdzdWNjZXNzJyB8ICdnZW5lcmF0aW5nJyB8ICdzZW5kaW5nJyB8ICdub3VzZXInID0gJ2xvYWRpbmcnO1xuXG4gIC8vIGRldmljZSBkYXRhIHBvcHVsYXRlZCBieSBsb2FkIHJlcXVlc3RcbiAgcHJpdmF0ZSBkZXZpY2VEYXRhSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWNvcmRpbmdTZXNzaW9uOiBvYmplY3Q7XG4gIHByaXZhdGUgcmVjb3JkaW5nU3RhcnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpbml0aWFsRm9ybVN0YXRlOiBvYmplY3Q7XG5cbiAgLy8gdXNlciBkYXRhIGV4cGFuZGVkIGZyb20gaWRzIHBhc3NlZCBpbiBjb25maWdcbiAgcHJpdmF0ZSBjdXJyZW50VXNlcjogVXNlcjtcbiAgcHJpdmF0ZSBvd25lcjogVXNlcjtcblxuICBwcml2YXRlIGRldGFpbENoYW5nZUxvZzogQ2hhbmdlW107XG5cbiAgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgZG9iOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHdpdGhpbk5ZZWFycygxMjAsICdiZWZvcmUnKV0pLFxuICAgIGhlaWdodDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDMwKSwgVmFsaWRhdG9ycy5tYXgoMjcyKV0pLFxuICAgIHdlaWdodDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpLCBWYWxpZGF0b3JzLm1heCg2MzUpXSksXG4gICAgbWVhbFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICBtZWFsRW5kOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICB9LCBbXG4gICAgZGF0ZUNvbXBhcmlzb24oJ21lYWxFbmQnLCAnbWVhbFN0YXJ0JywgJ2FmdGVyJyksXG4gICAgZGF0ZUNvbXBhcmlzb24oJ21lYWxTdGFydCcsICdkb2InLCAnYWZ0ZXInKSxcbiAgXSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzaGFyZWQ6IFNoYXJlZFNlcnZpY2UpIHsgfVxuXG4gIHBhcnNlSW5wdXRFcnJvcnMobmFtZTogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3IobmFtZSwgY29udHJvbCk7XG4gIH1cblxuICAvLyBtYWtlIHN1cmUgdGhhbiBtb2RpZmljYXRpb25zIHRoYXQgZG9uJ3QgYWN0dWFsbHkgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgYXJlIG1hcmtlZCBhcyBzdWNoXG4gIHByaXZhdGUgbW9uaXRvckZvcm1DaGFuZ2VzKCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoY3VycmVudCA9PiB7XG4gICAgICBpZiAoc2hhbGxvd0NvbXBhcmUoY3VycmVudCwgdGhpcy5pbml0aWFsRm9ybVN0YXRlKSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyBoYW5kbGUgdGhlIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgcmVzcG9uc2UgYm9keVxuICBwcml2YXRlIGV4dHJhY3RGaWVsZHMocmVjb3JkaW5nU2Vzc2lvbjogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IHsgcGF0aWVudCwgbWVhbFN0YXJ0LCBtZWFsRW5kLCByZWNvcmRpbmdTdGFydCB9ID0gcmVjb3JkaW5nU2Vzc2lvbjtcbiAgICB0aGlzLnJlY29yZGluZ1N0YXJ0ID0gcmVjb3JkaW5nU3RhcnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9iOiB0aGlzLm93bmVyLmRhdGVPZkJpcnRoLFxuICAgICAgaGVpZ2h0OiBwYXRpZW50LmhlaWdodCxcbiAgICAgIHdlaWdodDogcGF0aWVudC53ZWlnaHQsXG4gICAgICBtZWFsU3RhcnQ6IGxvY2FsaXNlRGF0ZVRpbWUobWVhbFN0YXJ0KSxcbiAgICAgIG1lYWxFbmQ6IGxvY2FsaXNlRGF0ZVRpbWUobWVhbEVuZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpc2VGb3JtKHN0YXRlOiBvYmplY3QpIHtcbiAgICB0aGlzLmZvcm1Hcm91cC5wYXRjaFZhbHVlKHN0YXRlKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNQcmlzdGluZSgpO1xuXG4gICAgdGhpcy5mb3JtR3JvdXAuZ2V0KCdtZWFsU3RhcnQnKS5hZGRWYWxpZGF0b3JzKHdpdGhpbk5Ib3VycygyNCwgJ2FmdGVyJywgbmV3IERhdGUodGhpcy5yZWNvcmRpbmdTdGFydCkpKTtcbiAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ21lYWxFbmQnKS5hZGRWYWxpZGF0b3JzKHdpdGhpbk5Ib3VycygyNCwgJ2FmdGVyJywgbmV3IERhdGUodGhpcy5yZWNvcmRpbmdTdGFydCkpKTtcblxuICAgIHRoaXMuaW5pdGlhbEZvcm1TdGF0ZSA9IHN0YXRlOyAvLyBzYXZlIHRoaXMgZm9yIHVzZSBpbiByZXNldHNcbiAgICB0aGlzLm1vbml0b3JGb3JtQ2hhbmdlcygpO1xuICB9XG5cbiAgLy8gY29uc3RydWN0IGEgcGF0Y2ggb2JqZWN0IGZvciB0aGUgc2F2ZSByZXF1ZXN0XG4gIHByaXZhdGUgaW50ZWdyYXRlRmllbGRzKG1vZHM6IEZvcm1WYWx1ZSwgcmVjb3JkaW5nU2Vzc2lvbjogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IHsgcGF0aWVudCB9ID0gcmVjb3JkaW5nU2Vzc2lvbjtcbiAgICBwYXRpZW50LmhlaWdodCA9IG1vZHMuaGVpZ2h0O1xuICAgIHBhdGllbnQud2VpZ2h0ID0gbW9kcy53ZWlnaHQ7XG4gICAgcGF0aWVudC5hZ2UgPSBnZXRBZ2UobW9kcy5kb2IpO1xuXG4gICAgcmVjb3JkaW5nU2Vzc2lvbi5tZWFsU3RhcnQgPSBnbG9iYWxpc2VEYXRlVGltZShtb2RzLm1lYWxTdGFydCk7XG4gICAgcmVjb3JkaW5nU2Vzc2lvbi5tZWFsRW5kID0gZ2xvYmFsaXNlRGF0ZVRpbWUobW9kcy5tZWFsRW5kKTtcblxuICAgIHRoaXMubG9nQ2hhbmdlKG1vZHMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICdBZ2UnOiBwYXRpZW50LmFnZSxcbiAgICAgICdSZWNvcmRpbmdTZXNzaW9uJzogSlNPTi5zdHJpbmdpZnkocmVjb3JkaW5nU2Vzc2lvbiksXG4gICAgICAnVXNlckRldGFpbENoYW5nZUxvZyc6IHRoaXMuZGV0YWlsQ2hhbmdlTG9nXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3N0RGV2aWNlRGF0YShkZXZpY2VQcm9wZXJ0eVNldElkOiBzdHJpbmcsIGRhdGE6IG9iamVjdCkge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZC5zYXZlRGV2aWNlRGF0YShcbiAgICAgIHRoaXMuY29uZmlnLmRldmljZURhdGFNb2RlbElkLFxuICAgICAgdGhpcy5kZXZpY2VEYXRhSWQsXG4gICAgICBkZXZpY2VQcm9wZXJ0eVNldElkLFxuICAgICAgdGhpcy5jb25maWcub3duZXJzWzBdLFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvLyBwYXRjaCB0aGUgZGV2aWNlIGRhdGEgcmVjb3JkIHdpdGggdGhlIG1vZGlmaWNhdGlvbnNcbiAgc2F2ZU1vZGlmaWNhdGlvbnMoKSB7XG4gICAgY29uc3QgbW9kcyA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG4gICAgY29uc3QgcGF0Y2hlZERldmljZURhdGEgPSB0aGlzLmludGVncmF0ZUZpZWxkcyhtb2RzLCB0aGlzLnJlY29yZGluZ1Nlc3Npb24pO1xuICAgIGNvbnN0IHBhdGNoZWRVc2VyRGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5vd25lciwgeyBkYXRlT2ZCaXJ0aDogbW9kcy5kb2IgfSk7XG5cbiAgICB0aGlzLnN0YXR1cyA9ICdzZW5kaW5nJztcbiAgICBmb3JrSm9pbihbXG4gICAgICB0aGlzLnBvc3REZXZpY2VEYXRhKGFwcERhdGFQcm9wZXJ0eVNldElkLCBwYXRjaGVkRGV2aWNlRGF0YSksXG4gICAgICB0aGlzLnNoYXJlZC51cGRhdGVVc2VyKHRoaXMuY29uZmlnLm93bmVyc1swXSwgcGF0Y2hlZFVzZXJEYXRhKVxuICAgIF0pLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5yZWdlblJlcG9ydCgpKVxuICAgICkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGxvZ0NoYW5nZShtb2RzOiBGb3JtVmFsdWUpIHtcbiAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgIGF1dGhvcjogdGhpcy5jdXJyZW50VXNlci5lbWFpbEFkZHJlc3MsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIC4uLnNoYWxsb3dEaWZmKHRoaXMuaW5pdGlhbEZvcm1TdGF0ZSwgbW9kcylcbiAgICB9XG5cbiAgICB0aGlzLmRldGFpbENoYW5nZUxvZy5wdXNoKGVudHJ5KTtcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuZGV0YWlsQ2hhbmdlTG9nKTtcbiAgfVxuXG4gIC8vIGdldCB0aGUgZGV2aWNlIGRhdGEgcmVjb3JkIGFuZCBpbml0aWFsaXNlIHRoZSBmb3JtXG4gIHByaXZhdGUgbG9hZERldmljZURhdGEoKSB7XG4gICAgdGhpcy5zaGFyZWQuZ2V0RGV2aWNlRGF0YShcbiAgICAgIHRoaXMuY29uZmlnLmRldmljZURhdGFNb2RlbElkLFxuICAgICAgdGhpcy5jb25maWcub3duZXJzWzBdLFxuICAgICAgcHJvcGVydHlDb2Rlc1xuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5kZXZpY2VEYXRhSWQgPSByZXMuZGV2aWNlRGF0YUlkO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1Nlc3Npb24gPSBKU09OLnBhcnNlKHJlcy5kYXRhWydSZWNvcmRpbmdTZXNzaW9uJ10udmFsdWUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpc2VGb3JtKHRoaXMuZXh0cmFjdEZpZWxkcyh0aGlzLnJlY29yZGluZ1Nlc3Npb24pKTtcblxuICAgICAgICAvLyBkYXRhIGZpZWxkIHVuaW5pdGlhbGlzZWQgZm9yIHVubW9kaWZpZWQgcmVjb3JkXG4gICAgICAgIHRoaXMuZGV0YWlsQ2hhbmdlTG9nID0gcmVzLmRhdGFbJ1VzZXJEZXRhaWxDaGFuZ2VMb2cnXT8udmFsdWUgPz8gW107XG5cbiAgICAgICAgdGhpcy5zdGF0dXMgPSByZXMuZGF0YVsnU3RhdHVzJ10/LnZhbHVlID09PSAnR2VuZXJhdGluZyBSZXBvcnQnID9cbiAgICAgICAgICAnZ2VuZXJhdGluZycgOlxuICAgICAgICAgICdzdWNjZXNzJztcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gXCJlcnJvclwiO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVnZW5SZXBvcnQoKSB7XG4gICAgdGhpcy5wb3N0RGV2aWNlRGF0YShcbiAgICAgIGRldmljZURhdGFQcm9wZXJ0eVNldElkLFxuICAgICAgeyAnQWxnb3JpdGhtaGFzcnVuJzogZmFsc2UsICdBbGdvcml0aG1SdW4nOiB0cnVlIH1cbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXR1cyA9ICdnZW5lcmF0aW5nJzsgLy8gYXNzdW1lIHJlcG9ydCBzdGFydHMgZ2VuZXJhdGluZyBpbW1lZGlhdGVseVxuICAgIH0pXG4gIH1cblxuICByZXNldE1vZGlmaWNhdGlvbnMoKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmluaXRpYWxGb3JtU3RhdGUpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8ub3duZXJzPy5bMF0pIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gJ25vdXNlcic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9ya0pvaW4oW1xuICAgICAgdGhpcy5zaGFyZWQuZ2V0VXNlcih0aGlzLmNvbmZpZy5jdXJyZW50VXNlcklkKSxcbiAgICAgIHRoaXMuc2hhcmVkLmdldFVzZXIodGhpcy5jb25maWcub3duZXJzWzBdKVxuICAgIF0pLnBpcGUodGFwKChbY3VycmVudCwgb3duZXJdKSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudDtcbiAgICAgIHRoaXMub3duZXIgPSBvd25lcjtcbiAgICB9KSkuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLmxvYWREZXZpY2VEYXRhKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ2Vycm9yJ1wiPlxuICAgIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGdldCB0aGUgZGV0YWlscy5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ25vdXNlcidcIj5cbiAgICBUaGVyZSBpcyBubyB1c2VyIHNwZWNpZmllZCBhcyB0aGUgZGF0YSBvd25lci5cbiAgPC9kaXY+XG4gIDxmb3JtICpuZ0lmPVwic3RhdHVzICE9PSAnZXJyb3InICYmIHN0YXR1cyAhPT0gJ25vdXNlcidcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJzYXZlTW9kaWZpY2F0aW9ucygpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0c1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJkb2JcIj5EYXRlIG9mIEJpcnRoOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImRvYlwiIHR5cGU9XCJkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZG9iXCI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ3ZWlnaHRcIj5QYXRpZW50IFdlaWdodCAoa2cpOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cIndlaWdodFwiIHR5cGU9XCJudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJ3ZWlnaHRcIj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImhlaWdodFwiPlBhdGllbnQgSGVpZ2h0IChjbSk6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiaGVpZ2h0XCIgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWVhbFN0YXJ0XCI+TWVhbCBTdGFydCBUaW1lOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cIm1lYWxTdGFydFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGZvcm1Db250cm9sTmFtZT1cIm1lYWxTdGFydFwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWVhbEVuZFwiPk1lYWwgRW5kIFRpbWU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibWVhbEVuZFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGZvcm1Db250cm9sTmFtZT1cIm1lYWxFbmRcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFmb3JtR3JvdXAudmFsaWQgJiYgZm9ybUdyb3VwLmRpcnR5XCIgY2xhc3M9XCJlcnJvcnNcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgZm9ybUdyb3VwLmNvbnRyb2xzIHwgZW50cmllc1wiPlxuICAgICAgICB7eyBwYXJzZUlucHV0RXJyb3JzKGNvbnRyb2xbMF0sIGNvbnRyb2xbMV0pIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzdGF0dXMgPT09ICdnZW5lcmF0aW5nJ1wiIGNsYXNzPVwiaW5mb1wiPlxuICAgICAgPGRpdj5UaGUgcmVwb3J0IGlzIGdlbmVyYXRpbmcgYXQgdGhlIG1vbWVudCwgY2hlY2sgYmFjayBsYXRlciBpZiB5b3UgbmVlZCB0byBtb2RpZnkgdGhpcyBlbnRyeS48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVnZW5SZXBvcnQoKVwiIFtkaXNhYmxlZF09XCJzdGF0dXMgPT09ICdzZW5kaW5nJyB8fCBzdGF0dXMgPT09ICdnZW5lcmF0aW5nJyB8fCBzdGF0dXMgPT09ICdsb2FkaW5nJ1wiPlJlZ2VuZXJhdGUgUmVwb3J0PC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXRNb2RpZmljYXRpb25zKClcIiBbZGlzYWJsZWRdPVwic3RhdHVzID09PSAnc2VuZGluZycgfHwgc3RhdHVzID09PSAnZ2VuZXJhdGluZycgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCI+Q2FuY2VsIE1vZGlmaWNhdGlvbjwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cInN0YXR1cyA9PT0gJ3NlbmRpbmcnIHx8IHN0YXR1cyA9PT0gJ2dlbmVyYXRpbmcnIHx8ICFmb3JtR3JvdXAudmFsaWQgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCI+U2F2ZSBEZXRhaWxzPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
|
package/esm2020/lib/utils.mjs
CHANGED
|
@@ -45,4 +45,9 @@ export function titleise(camel) {
|
|
|
45
45
|
export function shallowCompare(a, b) {
|
|
46
46
|
return Object.entries(a).every(([k, v]) => b[k] === v);
|
|
47
47
|
}
|
|
48
|
-
|
|
48
|
+
export function shallowDiff(a, b) {
|
|
49
|
+
const from = Object.fromEntries(Object.entries(a).filter(([k, v]) => b[k] !== v));
|
|
50
|
+
const to = Object.fromEntries(Object.entries(b).filter(([k, _]) => from[k]));
|
|
51
|
+
return { from, to };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsUUFBZ0I7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUU3RCxPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxpQkFB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LENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDakQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gc3RyaXAgdGhlIHRpbWV6b25lIG9mZnNldCB0byBjcmVhdGUgZm9ybWF0IHVzYWJsZSBieSA8aW5wdXQ+XG5leHBvcnQgZnVuY3Rpb24gbG9jYWxpc2VEYXRlVGltZShkYXRldGltZTogc3RyaW5nKSB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRldGltZSk7XG5cbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsgY29uc3QgbW9udGggPSAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBkYXkgPSBkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IGhvdXIgPSBkYXRlLmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBtaW51dGUgPSBkYXRlLmdldE1pbnV0ZXMoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IHNlY29uZCA9IGRhdGUuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcblxuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9VCR7aG91cn06JHttaW51dGV9OiR7c2Vjb25kfWA7XG59XG5cbi8vIHJlY29uc3RydWN0IG9yaWdpbmFsIElTTyBmb3JtYXRcbmV4cG9ydCBmdW5jdGlvbiBnbG9iYWxpc2VEYXRlVGltZShkYXRldGltZTogc3RyaW5nKSB7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShkYXRldGltZSk7XG5cbiAgY29uc3Qgb2Zmc2V0ID0gLWRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgY29uc3Qgb2Zmc2V0QWJzID0gTWF0aC5hYnMob2Zmc2V0KTtcblxuICBjb25zdCBzaWduID0gb2Zmc2V0ID49IDAgPyAnKycgOiAnLSc7XG4gIGNvbnN0IGhvdXJzID0gU3RyaW5nKE1hdGguZmxvb3Iob2Zmc2V0QWJzIC8gNjApKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBtaW51dGVzID0gU3RyaW5nKG9mZnNldEFicyAlIDYwKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBvZmZzZXRTdHJpbmcgPSBgJHtzaWdufSR7aG91cnN9OiR7bWludXRlc31gO1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IGhvdXIgPSBTdHJpbmcoZGF0ZS5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBtaW51dGUgPSBTdHJpbmcoZGF0ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gIGNvbnN0IHNlY29uZCA9IFN0cmluZyhkYXRlLmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKTtcblxuICBjb25zdCBkYXRlUGFydCA9IGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fWA7XG4gIGNvbnN0IHRpbWVQYXJ0ID0gYCR7aG91cn06JHttaW51dGV9OiR7c2Vjb25kfS4wMDBgO1xuXG4gIHJldHVybiBgJHtkYXRlUGFydH1UJHt0aW1lUGFydH0ke29mZnNldFN0cmluZ31gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWdlKGRvYjogc3RyaW5nKSB7XG4gIGNvbnN0IHRoZW4gPSBuZXcgRGF0ZShkb2IpO1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuXG4gIGxldCBhZ2UgPSBub3cuZ2V0RnVsbFllYXIoKSAtIHRoZW4uZ2V0RnVsbFllYXIoKTtcblxuICBpZiAobm93LmdldE1vbnRoKCkgPCB0aGVuLmdldE1vbnRoKCkgfHxcbiAgICAobm93LmdldE1vbnRoKCkgPT09IHRoZW4uZ2V0TW9udGgoKSAmJiBub3cuZ2V0RGF0ZSgpIDwgdGhlbi5nZXREYXRlKCkpKSB7XG4gICAgYWdlLS07XG4gIH1cblxuICByZXR1cm4gYWdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGl0bGVpc2UoY2FtZWw6IHN0cmluZykge1xuICBsZXQgc3BhY2VkID0gY2FtZWwucmVwbGFjZSgvKD89W0EtWl0pL2csICcgJyk7XG4gIHJldHVybiBzcGFjZWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXGJcXHcvZywgY2ggPT4gY2gudG9VcHBlckNhc2UoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q29tcGFyZShhOiBvYmplY3QsIGI6IG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYSkuZXZlcnkoKFtrLCB2XSkgPT4gYltrXSA9PT0gdik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93RGlmZihhOiBvYmplY3QsIGI6IG9iamVjdCkge1xuICBjb25zdCBmcm9tID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGEpLmZpbHRlcigoW2ssIHZdKSA9PiBiW2tdICE9PSB2KSk7XG4gIGNvbnN0IHRvID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGIpLmZpbHRlcigoW2ssIF9dKSA9PiBmcm9tW2tdKSk7XG4gIHJldHVybiB7IGZyb20sIHRvIH07XG59XG4iXX0=
|
|
@@ -3,7 +3,7 @@ import { Injectable, Pipe, Component, Input, NgModule } from '@angular/core';
|
|
|
3
3
|
import * as i2 from '@angular/forms';
|
|
4
4
|
import { FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
5
5
|
import { forkJoin, tap } from 'rxjs';
|
|
6
|
-
import * as i1 from 'shared';
|
|
6
|
+
import * as i1 from 'alimetry-shared';
|
|
7
7
|
import * as i3 from '@angular/common';
|
|
8
8
|
import { JsonPipe, CommonModule } from '@angular/common';
|
|
9
9
|
|
|
@@ -66,6 +66,11 @@ function titleise(camel) {
|
|
|
66
66
|
function shallowCompare(a, b) {
|
|
67
67
|
return Object.entries(a).every(([k, v]) => b[k] === v);
|
|
68
68
|
}
|
|
69
|
+
function shallowDiff(a, b) {
|
|
70
|
+
const from = Object.fromEntries(Object.entries(a).filter(([k, v]) => b[k] !== v));
|
|
71
|
+
const to = Object.fromEntries(Object.entries(b).filter(([k, _]) => from[k]));
|
|
72
|
+
return { from, to };
|
|
73
|
+
}
|
|
69
74
|
|
|
70
75
|
function setControlError(control, errorKey, errorValue) {
|
|
71
76
|
const currentErrors = control.errors || {};
|
|
@@ -235,7 +240,7 @@ class DetailEditComponent {
|
|
|
235
240
|
patient.age = getAge(mods.dob);
|
|
236
241
|
recordingSession.mealStart = globaliseDateTime(mods.mealStart);
|
|
237
242
|
recordingSession.mealEnd = globaliseDateTime(mods.mealEnd);
|
|
238
|
-
this.
|
|
243
|
+
this.logChange(mods);
|
|
239
244
|
return {
|
|
240
245
|
'Age': patient.age,
|
|
241
246
|
'RecordingSession': JSON.stringify(recordingSession),
|
|
@@ -243,48 +248,35 @@ class DetailEditComponent {
|
|
|
243
248
|
};
|
|
244
249
|
}
|
|
245
250
|
postDeviceData(devicePropertySetId, data) {
|
|
246
|
-
return this.shared.saveDeviceData(this.config.deviceDataModelId, this.deviceDataId, devicePropertySetId, this.config.owners[0]
|
|
251
|
+
return this.shared.saveDeviceData(this.config.deviceDataModelId, this.deviceDataId, devicePropertySetId, this.config.owners[0], data);
|
|
247
252
|
}
|
|
248
253
|
// patch the device data record with the modifications
|
|
249
254
|
saveModifications() {
|
|
250
255
|
const mods = this.formGroup.getRawValue();
|
|
251
256
|
const patchedDeviceData = this.integrateFields(mods, this.recordingSession);
|
|
252
|
-
const patchedUserData = Object.assign(this.
|
|
257
|
+
const patchedUserData = Object.assign(this.owner, { dateOfBirth: mods.dob });
|
|
253
258
|
this.status = 'sending';
|
|
254
259
|
forkJoin([
|
|
255
260
|
this.postDeviceData(appDataPropertySetId, patchedDeviceData),
|
|
256
|
-
this.shared.updateUser(this.config.owners[0]
|
|
261
|
+
this.shared.updateUser(this.config.owners[0], patchedUserData)
|
|
257
262
|
]).pipe(tap(() => this.regenReport())).subscribe();
|
|
258
263
|
}
|
|
259
|
-
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
for (const key in mods) {
|
|
264
|
-
if (this.initialFormState[key] !== mods[key]) {
|
|
265
|
-
prevChangeLog[key] = this.initialFormState[key];
|
|
266
|
-
newChangeLog[key] = mods[key];
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
const changeLog = {
|
|
270
|
-
author: this.currentUser.emailAddress,
|
|
271
|
-
prevChangeLog: prevChangeLog,
|
|
272
|
-
newChangeLog: newChangeLog,
|
|
273
|
-
timestamp: new Date().toISOString()
|
|
274
|
-
};
|
|
275
|
-
this.detailChangeLog.push(changeLog);
|
|
264
|
+
logChange(mods) {
|
|
265
|
+
const entry = Object.assign({ author: this.currentUser.emailAddress, timestamp: new Date().toISOString() }, shallowDiff(this.initialFormState, mods));
|
|
266
|
+
this.detailChangeLog.push(entry);
|
|
267
|
+
console.log(this.detailChangeLog);
|
|
276
268
|
}
|
|
277
269
|
// get the device data record and initialise the form
|
|
278
270
|
loadDeviceData() {
|
|
279
|
-
this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0]
|
|
271
|
+
this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0], propertyCodes).subscribe({
|
|
280
272
|
next: (res) => {
|
|
281
|
-
var _a;
|
|
273
|
+
var _a, _b, _c;
|
|
282
274
|
this.deviceDataId = res.deviceDataId;
|
|
283
275
|
this.recordingSession = JSON.parse(res.data['RecordingSession'].value);
|
|
284
276
|
this.initialiseForm(this.extractFields(this.recordingSession));
|
|
285
|
-
//
|
|
286
|
-
this.detailChangeLog = res.data['UserDetailChangeLog'] ===
|
|
287
|
-
this.status = ((
|
|
277
|
+
// data field uninitialised for unmodified record
|
|
278
|
+
this.detailChangeLog = (_b = (_a = res.data['UserDetailChangeLog']) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : [];
|
|
279
|
+
this.status = ((_c = res.data['Status']) === null || _c === void 0 ? void 0 : _c.value) === 'Generating Report' ?
|
|
288
280
|
'generating' :
|
|
289
281
|
'success';
|
|
290
282
|
},
|
|
@@ -303,17 +295,18 @@ class DetailEditComponent {
|
|
|
303
295
|
this.formGroup.patchValue(this.initialFormState);
|
|
304
296
|
}
|
|
305
297
|
ngOnInit() {
|
|
306
|
-
var _a, _b
|
|
307
|
-
if (!((
|
|
298
|
+
var _a, _b;
|
|
299
|
+
if (!((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.owners) === null || _b === void 0 ? void 0 : _b[0])) {
|
|
308
300
|
this.status = 'nouser';
|
|
309
301
|
return;
|
|
310
302
|
}
|
|
311
|
-
|
|
312
|
-
this.
|
|
313
|
-
|
|
314
|
-
|
|
303
|
+
forkJoin([
|
|
304
|
+
this.shared.getUser(this.config.currentUserId),
|
|
305
|
+
this.shared.getUser(this.config.owners[0])
|
|
306
|
+
]).pipe(tap(([current, owner]) => {
|
|
307
|
+
this.currentUser = current;
|
|
315
308
|
this.owner = owner;
|
|
316
|
-
});
|
|
309
|
+
})).subscribe();
|
|
317
310
|
this.loadDeviceData();
|
|
318
311
|
}
|
|
319
312
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alimetry-detail-edit.mjs","sources":["../../../projects/detail-edit/src/lib/detail-edit.service.ts","../../../projects/detail-edit/src/lib/utils.ts","../../../projects/detail-edit/src/lib/validators.ts","../../../projects/detail-edit/src/lib/entries.pipe.ts","../../../projects/detail-edit/src/lib/detail-edit.component.ts","../../../projects/detail-edit/src/lib/detail-edit.component.html","../../../projects/detail-edit/src/lib/detail-edit.module.ts","../../../projects/detail-edit/src/public-api.ts","../../../projects/detail-edit/src/alimetry-detail-edit.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DetailEditService {\n\n constructor() { }\n}\n","// strip the timezone offset to create format usable by <input>\nexport function localiseDateTime(datetime: string) {\n const date = new Date(datetime);\n\n const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n const hour = date.getHours().toString().padStart(2, '0');\n const minute = date.getMinutes().toString().padStart(2, '0');\n const second = date.getSeconds().toString().padStart(2, '0');\n\n return `${year}-${month}-${day}T${hour}:${minute}:${second}`;\n}\n\n// reconstruct original ISO format\nexport function globaliseDateTime(datetime: string) {\n const date = new Date(datetime);\n\n const offset = -date.getTimezoneOffset();\n const offsetAbs = Math.abs(offset);\n\n const sign = offset >= 0 ? '+' : '-';\n const hours = String(Math.floor(offsetAbs / 60)).padStart(2, '0');\n const minutes = String(offsetAbs % 60).padStart(2, '0');\n const offsetString = `${sign}${hours}:${minutes}`;\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hour = String(date.getHours()).padStart(2, '0');\n const minute = String(date.getMinutes()).padStart(2, '0');\n const second = String(date.getSeconds()).padStart(2, '0');\n\n const datePart = `${year}-${month}-${day}`;\n const timePart = `${hour}:${minute}:${second}.000`;\n\n return `${datePart}T${timePart}${offsetString}`;\n}\n\nexport function getAge(dob: string) {\n const then = new Date(dob);\n const now = new Date();\n\n let age = now.getFullYear() - then.getFullYear();\n\n if (now.getMonth() < then.getMonth() ||\n (now.getMonth() === then.getMonth() && now.getDate() < then.getDate())) {\n age--;\n }\n\n return age;\n}\n\nexport function titleise(camel: string) {\n let spaced = camel.replace(/(?=[A-Z])/g, ' ');\n return spaced.toLowerCase().replace(/\\b\\w/g, ch => ch.toUpperCase());\n}\n\nexport function shallowCompare(a: object, b: object) {\n return Object.entries(a).every(([k, v]) => b[k] === v);\n}\n","import { AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn } from \"@angular/forms\";\nimport { titleise } from \"./utils\";\n\nfunction setControlError(control: AbstractControl, errorKey: string, errorValue: any) {\n const currentErrors = control.errors || {};\n if (currentErrors[errorKey]) return;\n control.setErrors({ ...currentErrors, [errorKey]: errorValue });\n}\n\nfunction clearControlError(control: AbstractControl, errorKey: string) {\n const currentErrors = control.errors || {};\n if (!currentErrors[errorKey]) return;\n control.setErrors({ ...currentErrors, [errorKey]: null });\n}\n\nexport function dateComparison(a: string, b: string, comparator: 'before' | 'after') {\n return function(control: AbstractControl<any, any>): ValidationErrors | null {\n if (!(control instanceof FormGroup)) return null;\n\n const formGroup = control as FormGroup;\n\n const aControl = formGroup.get(a);\n const bControl = formGroup.get(b);\n\n if (!aControl?.value || !bControl?.value) {\n clearControlError(aControl, 'dateRange');\n return null;\n }\n\n const aDate = new Date(aControl.value);\n const bDate = new Date(bControl.value);\n\n const hasError = (\n comparator === 'after' && aDate <= bDate ||\n comparator === 'before' && aDate >= bDate\n );\n\n if (hasError) {\n setControlError(aControl, 'dateRange', { against: b, comparator });\n return { dateRange: true };\n }\n\n clearControlError(aControl, 'dateRange');\n return null;\n }\n}\n\nexport function withinNYears(n: number, dir: 'both' | 'before' | 'after' = 'both', of?: Date): ValidatorFn {\n return function(control: AbstractControl): ValidationErrors | null {\n const timestamp = control?.value;\n if (!timestamp || isNaN(new Date(timestamp).getTime())) return null;\n\n const date = new Date(timestamp);\n const against = of ?? new Date();\n\n const min = new Date(against)\n min.setFullYear(against.getFullYear() - n);\n const max = new Date(against)\n max.setFullYear(against.getFullYear() + n);\n\n let isValid = false;\n if (dir === 'after') isValid = date < max && date > against;\n else if (dir === 'before') isValid = date > min && date < against;\n else isValid = date > min && date < max;\n\n return isValid ? null : { notWithinYears: { n, against, dir } };\n }\n}\n\nexport function withinNHours(n: number, dir: 'both' | 'before' | 'after' = 'both', of?: Date): ValidatorFn {\n return function(control: AbstractControl): ValidationErrors | null {\n const timestamp = control?.value;\n if (!timestamp || isNaN(new Date(timestamp).getTime())) return null;\n\n const date = new Date(timestamp);\n const against = of ?? new Date();\n\n const min = new Date(against)\n min.setHours(against.getHours() - n);\n const max = new Date(against)\n max.setHours(against.getHours() + n);\n\n let isValid = false;\n if (dir === 'after') isValid = date < max && date > against;\n else if (dir === 'before') isValid = date > min && date < against;\n else isValid = date > min && date < max;\n\n return isValid ? null : { notWithinHours: { n, against, dir } };\n }\n}\n\n// translate validation errors into human readable strings\nexport function translateError(name: string, control: AbstractControl) {\n const { errors } = control;\n\n if (control.hasError('required'))\n return `${titleise(name)} is a required value.`;\n else if (control.hasError('min'))\n return `${titleise(name)} needs to be a minimum of ${errors.min.min}.`;\n else if (control.hasError('max'))\n return `${titleise(name)} needs to be a maximum of ${errors.max.max}.`;\n else if (control.hasError('future'))\n return `${titleise(name)} needs to be in the past.`;\n else if (control.hasError('dateRange'))\n return `${titleise(name)} needs to be ${errors.dateRange.comparator} ${titleise(errors.dateRange.against)}.`;\n else if (control.hasError('notWithinYears'))\n return `${titleise(name)} needs to be within ${errors.notWithinYears.n} years of ${errors.notWithinYears.against}`;\n else if (control.hasError('notWithinHours'))\n return `${titleise(name)} needs to be within ${errors.notWithinHours.n} hours of ${errors.notWithinHours.against}`;\n\n return null;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'entries'\n})\nexport class EntriesPipe implements PipeTransform {\n transform(value: object): [string, any][] {\n return Object.entries(value);\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { AbstractControl, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { forkJoin, tap } from 'rxjs';\nimport { Config, SharedService, User } from 'shared';\nimport { getAge, globaliseDateTime, localiseDateTime, shallowCompare } from './utils';\nimport { dateComparison, withinNYears, withinNHours, translateError } from './validators';\n\nconst appDataPropertySetId = '34d46477-ad4b-47b4-b555-06358b92f60c';\nconst deviceDataPropertySetId = '7a32d851-5e89-46a6-a4b6-cca162dace29';\nconst propertyCodes = ['RecordingSession', 'Status', 'UserDetailChangeLog'];\n\n@Component({\n selector: 'lib-detail-edit', templateUrl: './detail-edit.component.html',\n styleUrls: ['./detail-edit.component.css']\n})\nexport class DetailEditComponent {\n @Input() config!: Config;\n\n status: 'error' | 'loading' | 'success' | 'generating' | 'sending' | 'nouser' = 'loading';\n\n // populated by load request\n private deviceDataId: string;\n private recordingSession: object;\n private recordingStart: string;\n private initialFormState: object;\n private detailChangeLog: object[];\n private currentUser: User;\n private owner: User;\n\n formGroup = new FormGroup({\n dob: new FormControl<string>('', [Validators.required, withinNYears(120, 'before')]),\n height: new FormControl<number>(0, [Validators.required, Validators.min(30), Validators.max(272)]),\n weight: new FormControl<number>(0, [Validators.required, Validators.min(1), Validators.max(635)]),\n mealStart: new FormControl<string>('', [Validators.required]),\n mealEnd: new FormControl<string>('', [Validators.required])\n }, [\n dateComparison('mealEnd', 'mealStart', 'after'),\n dateComparison('mealStart', 'dob', 'after'),\n ]);\n\n constructor(private shared: SharedService) { }\n\n parseInputErrors(name: string, control: AbstractControl) {\n return translateError(name, control);\n }\n\n // make sure than modifications that don't actually differ from the current are marked as such\n private monitorFormChanges() {\n this.formGroup.valueChanges.subscribe(current => {\n if (shallowCompare(current, this.initialFormState)) {\n this.formGroup.markAsPristine();\n }\n })\n }\n\n // handle the relevant data from the response body\n private extractFields(recordingSession: Record<string, any>) {\n const { patient, mealStart, mealEnd, recordingStart } = recordingSession;\n this.recordingStart = recordingStart;\n\n return {\n dob: this.owner.dateOfBirth,\n height: patient.height,\n weight: patient.weight,\n mealStart: localiseDateTime(mealStart),\n mealEnd: localiseDateTime(mealEnd)\n }\n }\n\n private initialiseForm(state: object) {\n this.formGroup.patchValue(state);\n this.formGroup.markAsPristine();\n\n this.formGroup.get('mealStart').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));\n this.formGroup.get('mealEnd').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));\n\n this.initialFormState = state; // save this for use in resets\n this.monitorFormChanges();\n }\n\n // construct a patch object for the save request\n private integrateFields(mods: typeof this.formGroup.value, recordingSession: Record<string, any>) {\n const { patient } = recordingSession;\n patient.height = mods.height;\n patient.weight = mods.weight;\n patient.age = getAge(mods.dob);\n\n recordingSession.mealStart = globaliseDateTime(mods.mealStart);\n recordingSession.mealEnd = globaliseDateTime(mods.mealEnd);\n\n this.appendChangeLog(mods);\n\n return {\n 'Age': patient.age,\n 'RecordingSession': JSON.stringify(recordingSession),\n 'UserDetailChangeLog': this.detailChangeLog\n }\n }\n\n private postDeviceData(devicePropertySetId: string, data: object) {\n return this.shared.saveDeviceData(\n this.config.deviceDataModelId,\n this.deviceDataId,\n devicePropertySetId,\n this.config.owners[0].userId,\n data\n );\n }\n\n // patch the device data record with the modifications\n saveModifications() {\n const mods = this.formGroup.getRawValue();\n const patchedDeviceData = this.integrateFields(mods, this.recordingSession);\n const patchedUserData = Object.assign(this.config.owners[0], { dateOfBirth: mods.dob });\n\n this.status = 'sending';\n forkJoin([\n this.postDeviceData(appDataPropertySetId, patchedDeviceData),\n this.shared.updateUser(this.config.owners[0].userId, patchedUserData)\n ]).pipe(\n tap(() => this.regenReport())\n ).subscribe();\n }\n\n private appendChangeLog(mods: typeof this.formGroup.value) {\n const prevChangeLog: Partial<typeof this.formGroup.value> = {};\n const newChangeLog: Partial<typeof this.formGroup.value> = {};\n\n // Only include fields that have changed\n for (const key in mods) {\n if (this.initialFormState[key] !== mods[key]) {\n prevChangeLog[key] = this.initialFormState[key];\n newChangeLog[key] = mods[key];\n }\n }\n\n const changeLog = {\n author: this.currentUser.emailAddress,\n prevChangeLog: prevChangeLog,\n newChangeLog: newChangeLog,\n timestamp: new Date().toISOString()\n }\n\n this.detailChangeLog.push(changeLog);\n }\n\n // get the device data record and initialise the form\n private loadDeviceData() {\n this.shared.getDeviceData(\n this.config.deviceDataModelId,\n this.config.owners[0].userId,\n propertyCodes\n ).subscribe({\n next: (res) => {\n this.deviceDataId = res.deviceDataId;\n this.recordingSession = JSON.parse(res.data['RecordingSession'].value);\n this.initialiseForm(this.extractFields(this.recordingSession));\n // checking for undefined in case no changes have been logged yet\n this.detailChangeLog = res.data['UserDetailChangeLog'] === undefined ? [] : res.data['UserDetailChangeLog'].value;\n\n this.status = res.data['Status']?.value === 'Generating Report' ?\n 'generating' :\n 'success';\n },\n error: (err) => {\n console.error(err);\n this.status = \"error\";\n }\n });\n }\n\n regenReport() {\n this.postDeviceData(\n deviceDataPropertySetId,\n { 'Algorithmhasrun': false, 'AlgorithmRun': true }\n ).subscribe(() => {\n this.status = 'generating'; // assume report starts generating immediately\n })\n }\n\n resetModifications() {\n this.formGroup.patchValue(this.initialFormState);\n }\n\n ngOnInit() {\n if (!this.config?.owners?.[0]?.userId) {\n this.status = 'nouser';\n return;\n }\n this.shared.getUser(this.config.currentUser.userId).subscribe(user => {\n this.currentUser = user;\n });\n\n this.shared.getUser(this.config.owners[0].userId).subscribe(owner => {\n this.owner = owner;\n });\n\n this.loadDeviceData();\n }\n}\n","<div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the details.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <form *ngIf=\"status !== 'error' && status !== 'nouser'\" [formGroup]=\"formGroup\" (ngSubmit)=\"saveModifications()\">\n <div class=\"inputs\">\n <div class=\"form-row\">\n <label for=\"dob\">Date of Birth:</label>\n <input id=\"dob\" type=\"date\" formControlName=\"dob\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"weight\">Patient Weight (kg):</label>\n <input id=\"weight\" type=\"number\" formControlName=\"weight\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"height\">Patient Height (cm):</label>\n <input id=\"height\" type=\"number\" formControlName=\"height\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealStart\">Meal Start Time:</label>\n <input id=\"mealStart\" type=\"datetime-local\" formControlName=\"mealStart\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealEnd\">Meal End Time:</label>\n <input id=\"mealEnd\" type=\"datetime-local\" formControlName=\"mealEnd\">\n </div>\n </div>\n\n <div *ngIf=\"!formGroup.valid && formGroup.dirty\" class=\"errors\">\n <div *ngFor=\"let control of formGroup.controls | entries\">\n {{ parseInputErrors(control[0], control[1]) }}\n </div>\n </div>\n\n <div *ngIf=\"status === 'generating'\" class=\"info\">\n <div>The report is generating at the moment, check back later if you need to modify this entry.</div>\n </div>\n\n <div class=\"buttons\">\n <button type=\"button\" (click)=\"regenReport()\" [disabled]=\"status === 'sending' || status === 'generating' || status === 'loading'\">Regenerate Report</button>\n <button type=\"button\" (click)=\"resetModifications()\" [disabled]=\"status === 'sending' || status === 'generating' || formGroup.pristine\">Cancel Modification</button>\n <button type=\"submit\" [disabled]=\"status === 'sending' || status === 'generating' || !formGroup.valid || formGroup.pristine\">Save Details</button>\n </div>\n </form>\n</div>\n","import { CommonModule, JsonPipe } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { DetailEditComponent } from './detail-edit.component';\nimport { EntriesPipe } from './entries.pipe';\n\n\n\n@NgModule({\n declarations: [\n DetailEditComponent,\n EntriesPipe\n ],\n imports: [\n JsonPipe,\n ReactiveFormsModule,\n CommonModule\n ],\n exports: [\n DetailEditComponent\n ]\n})\nexport class DetailEditModule { }\n","/*\n * Public API Surface of detail-edit\n */\n\nexport * from './lib/detail-edit.service';\nexport * from './lib/detail-edit.component';\nexport * from './lib/detail-edit.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4.EntriesPipe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"alimetry-detail-edit.mjs","sources":["../../../projects/detail-edit/src/lib/detail-edit.service.ts","../../../projects/detail-edit/src/lib/utils.ts","../../../projects/detail-edit/src/lib/validators.ts","../../../projects/detail-edit/src/lib/entries.pipe.ts","../../../projects/detail-edit/src/lib/detail-edit.component.ts","../../../projects/detail-edit/src/lib/detail-edit.component.html","../../../projects/detail-edit/src/lib/detail-edit.module.ts","../../../projects/detail-edit/src/public-api.ts","../../../projects/detail-edit/src/alimetry-detail-edit.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DetailEditService {\n\n constructor() { }\n}\n","// strip the timezone offset to create format usable by <input>\nexport function localiseDateTime(datetime: string) {\n const date = new Date(datetime);\n\n const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n const hour = date.getHours().toString().padStart(2, '0');\n const minute = date.getMinutes().toString().padStart(2, '0');\n const second = date.getSeconds().toString().padStart(2, '0');\n\n return `${year}-${month}-${day}T${hour}:${minute}:${second}`;\n}\n\n// reconstruct original ISO format\nexport function globaliseDateTime(datetime: string) {\n const date = new Date(datetime);\n\n const offset = -date.getTimezoneOffset();\n const offsetAbs = Math.abs(offset);\n\n const sign = offset >= 0 ? '+' : '-';\n const hours = String(Math.floor(offsetAbs / 60)).padStart(2, '0');\n const minutes = String(offsetAbs % 60).padStart(2, '0');\n const offsetString = `${sign}${hours}:${minutes}`;\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hour = String(date.getHours()).padStart(2, '0');\n const minute = String(date.getMinutes()).padStart(2, '0');\n const second = String(date.getSeconds()).padStart(2, '0');\n\n const datePart = `${year}-${month}-${day}`;\n const timePart = `${hour}:${minute}:${second}.000`;\n\n return `${datePart}T${timePart}${offsetString}`;\n}\n\nexport function getAge(dob: string) {\n const then = new Date(dob);\n const now = new Date();\n\n let age = now.getFullYear() - then.getFullYear();\n\n if (now.getMonth() < then.getMonth() ||\n (now.getMonth() === then.getMonth() && now.getDate() < then.getDate())) {\n age--;\n }\n\n return age;\n}\n\nexport function titleise(camel: string) {\n let spaced = camel.replace(/(?=[A-Z])/g, ' ');\n return spaced.toLowerCase().replace(/\\b\\w/g, ch => ch.toUpperCase());\n}\n\nexport function shallowCompare(a: object, b: object) {\n return Object.entries(a).every(([k, v]) => b[k] === v);\n}\n\nexport function shallowDiff(a: object, b: object) {\n const from = Object.fromEntries(Object.entries(a).filter(([k, v]) => b[k] !== v));\n const to = Object.fromEntries(Object.entries(b).filter(([k, _]) => from[k]));\n return { from, to };\n}\n","import { AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn } from \"@angular/forms\";\nimport { titleise } from \"./utils\";\n\nfunction setControlError(control: AbstractControl, errorKey: string, errorValue: any) {\n const currentErrors = control.errors || {};\n if (currentErrors[errorKey]) return;\n control.setErrors({ ...currentErrors, [errorKey]: errorValue });\n}\n\nfunction clearControlError(control: AbstractControl, errorKey: string) {\n const currentErrors = control.errors || {};\n if (!currentErrors[errorKey]) return;\n control.setErrors({ ...currentErrors, [errorKey]: null });\n}\n\nexport function dateComparison(a: string, b: string, comparator: 'before' | 'after') {\n return function(control: AbstractControl<any, any>): ValidationErrors | null {\n if (!(control instanceof FormGroup)) return null;\n\n const formGroup = control as FormGroup;\n\n const aControl = formGroup.get(a);\n const bControl = formGroup.get(b);\n\n if (!aControl?.value || !bControl?.value) {\n clearControlError(aControl, 'dateRange');\n return null;\n }\n\n const aDate = new Date(aControl.value);\n const bDate = new Date(bControl.value);\n\n const hasError = (\n comparator === 'after' && aDate <= bDate ||\n comparator === 'before' && aDate >= bDate\n );\n\n if (hasError) {\n setControlError(aControl, 'dateRange', { against: b, comparator });\n return { dateRange: true };\n }\n\n clearControlError(aControl, 'dateRange');\n return null;\n }\n}\n\nexport function withinNYears(n: number, dir: 'both' | 'before' | 'after' = 'both', of?: Date): ValidatorFn {\n return function(control: AbstractControl): ValidationErrors | null {\n const timestamp = control?.value;\n if (!timestamp || isNaN(new Date(timestamp).getTime())) return null;\n\n const date = new Date(timestamp);\n const against = of ?? new Date();\n\n const min = new Date(against)\n min.setFullYear(against.getFullYear() - n);\n const max = new Date(against)\n max.setFullYear(against.getFullYear() + n);\n\n let isValid = false;\n if (dir === 'after') isValid = date < max && date > against;\n else if (dir === 'before') isValid = date > min && date < against;\n else isValid = date > min && date < max;\n\n return isValid ? null : { notWithinYears: { n, against, dir } };\n }\n}\n\nexport function withinNHours(n: number, dir: 'both' | 'before' | 'after' = 'both', of?: Date): ValidatorFn {\n return function(control: AbstractControl): ValidationErrors | null {\n const timestamp = control?.value;\n if (!timestamp || isNaN(new Date(timestamp).getTime())) return null;\n\n const date = new Date(timestamp);\n const against = of ?? new Date();\n\n const min = new Date(against)\n min.setHours(against.getHours() - n);\n const max = new Date(against)\n max.setHours(against.getHours() + n);\n\n let isValid = false;\n if (dir === 'after') isValid = date < max && date > against;\n else if (dir === 'before') isValid = date > min && date < against;\n else isValid = date > min && date < max;\n\n return isValid ? null : { notWithinHours: { n, against, dir } };\n }\n}\n\n// translate validation errors into human readable strings\nexport function translateError(name: string, control: AbstractControl) {\n const { errors } = control;\n\n if (control.hasError('required'))\n return `${titleise(name)} is a required value.`;\n else if (control.hasError('min'))\n return `${titleise(name)} needs to be a minimum of ${errors.min.min}.`;\n else if (control.hasError('max'))\n return `${titleise(name)} needs to be a maximum of ${errors.max.max}.`;\n else if (control.hasError('future'))\n return `${titleise(name)} needs to be in the past.`;\n else if (control.hasError('dateRange'))\n return `${titleise(name)} needs to be ${errors.dateRange.comparator} ${titleise(errors.dateRange.against)}.`;\n else if (control.hasError('notWithinYears'))\n return `${titleise(name)} needs to be within ${errors.notWithinYears.n} years of ${errors.notWithinYears.against}`;\n else if (control.hasError('notWithinHours'))\n return `${titleise(name)} needs to be within ${errors.notWithinHours.n} hours of ${errors.notWithinHours.against}`;\n\n return null;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'entries'\n})\nexport class EntriesPipe implements PipeTransform {\n transform(value: object): [string, any][] {\n return Object.entries(value);\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { AbstractControl, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { forkJoin, tap } from 'rxjs';\nimport { Config, SharedService, User } from 'alimetry-shared';\nimport { getAge, globaliseDateTime, localiseDateTime, shallowCompare, shallowDiff } from './utils';\nimport { dateComparison, withinNYears, withinNHours, translateError } from './validators';\n\nconst appDataPropertySetId = '34d46477-ad4b-47b4-b555-06358b92f60c';\nconst deviceDataPropertySetId = '7a32d851-5e89-46a6-a4b6-cca162dace29';\nconst propertyCodes = ['RecordingSession', 'Status', 'UserDetailChangeLog'];\n\ninterface FormValue {\n dob: string,\n height: number,\n weight: number,\n mealStart: string,\n mealEnd: string\n}\n\ninterface Change {\n timestamp: string,\n author: string,\n from: Partial<FormValue>,\n to: Partial<FormValue>\n}\n\n@Component({\n selector: 'lib-detail-edit', templateUrl: './detail-edit.component.html',\n styleUrls: ['./detail-edit.component.css']\n})\nexport class DetailEditComponent {\n @Input() config!: Config;\n\n status: 'error' | 'loading' | 'success' | 'generating' | 'sending' | 'nouser' = 'loading';\n\n // device data populated by load request\n private deviceDataId: string;\n private recordingSession: object;\n private recordingStart: string;\n private initialFormState: object;\n\n // user data expanded from ids passed in config\n private currentUser: User;\n private owner: User;\n\n private detailChangeLog: Change[];\n\n formGroup = new FormGroup({\n dob: new FormControl<string>('', [Validators.required, withinNYears(120, 'before')]),\n height: new FormControl<number>(0, [Validators.required, Validators.min(30), Validators.max(272)]),\n weight: new FormControl<number>(0, [Validators.required, Validators.min(1), Validators.max(635)]),\n mealStart: new FormControl<string>('', [Validators.required]),\n mealEnd: new FormControl<string>('', [Validators.required])\n }, [\n dateComparison('mealEnd', 'mealStart', 'after'),\n dateComparison('mealStart', 'dob', 'after'),\n ]);\n\n constructor(private shared: SharedService) { }\n\n parseInputErrors(name: string, control: AbstractControl) {\n return translateError(name, control);\n }\n\n // make sure than modifications that don't actually differ from the current are marked as such\n private monitorFormChanges() {\n this.formGroup.valueChanges.subscribe(current => {\n if (shallowCompare(current, this.initialFormState)) {\n this.formGroup.markAsPristine();\n }\n })\n }\n\n // handle the relevant data from the response body\n private extractFields(recordingSession: Record<string, any>) {\n const { patient, mealStart, mealEnd, recordingStart } = recordingSession;\n this.recordingStart = recordingStart;\n\n return {\n dob: this.owner.dateOfBirth,\n height: patient.height,\n weight: patient.weight,\n mealStart: localiseDateTime(mealStart),\n mealEnd: localiseDateTime(mealEnd)\n }\n }\n\n private initialiseForm(state: object) {\n this.formGroup.patchValue(state);\n this.formGroup.markAsPristine();\n\n this.formGroup.get('mealStart').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));\n this.formGroup.get('mealEnd').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));\n\n this.initialFormState = state; // save this for use in resets\n this.monitorFormChanges();\n }\n\n // construct a patch object for the save request\n private integrateFields(mods: FormValue, recordingSession: Record<string, any>) {\n const { patient } = recordingSession;\n patient.height = mods.height;\n patient.weight = mods.weight;\n patient.age = getAge(mods.dob);\n\n recordingSession.mealStart = globaliseDateTime(mods.mealStart);\n recordingSession.mealEnd = globaliseDateTime(mods.mealEnd);\n\n this.logChange(mods);\n\n return {\n 'Age': patient.age,\n 'RecordingSession': JSON.stringify(recordingSession),\n 'UserDetailChangeLog': this.detailChangeLog\n }\n }\n\n private postDeviceData(devicePropertySetId: string, data: object) {\n return this.shared.saveDeviceData(\n this.config.deviceDataModelId,\n this.deviceDataId,\n devicePropertySetId,\n this.config.owners[0],\n data\n );\n }\n\n // patch the device data record with the modifications\n saveModifications() {\n const mods = this.formGroup.getRawValue();\n const patchedDeviceData = this.integrateFields(mods, this.recordingSession);\n const patchedUserData = Object.assign(this.owner, { dateOfBirth: mods.dob });\n\n this.status = 'sending';\n forkJoin([\n this.postDeviceData(appDataPropertySetId, patchedDeviceData),\n this.shared.updateUser(this.config.owners[0], patchedUserData)\n ]).pipe(\n tap(() => this.regenReport())\n ).subscribe();\n }\n\n private logChange(mods: FormValue) {\n const entry = {\n author: this.currentUser.emailAddress,\n timestamp: new Date().toISOString(),\n ...shallowDiff(this.initialFormState, mods)\n }\n\n this.detailChangeLog.push(entry);\n\n console.log(this.detailChangeLog);\n }\n\n // get the device data record and initialise the form\n private loadDeviceData() {\n this.shared.getDeviceData(\n this.config.deviceDataModelId,\n this.config.owners[0],\n propertyCodes\n ).subscribe({\n next: (res) => {\n this.deviceDataId = res.deviceDataId;\n this.recordingSession = JSON.parse(res.data['RecordingSession'].value);\n this.initialiseForm(this.extractFields(this.recordingSession));\n\n // data field uninitialised for unmodified record\n this.detailChangeLog = res.data['UserDetailChangeLog']?.value ?? [];\n\n this.status = res.data['Status']?.value === 'Generating Report' ?\n 'generating' :\n 'success';\n },\n error: (err) => {\n console.error(err);\n this.status = \"error\";\n }\n });\n }\n\n regenReport() {\n this.postDeviceData(\n deviceDataPropertySetId,\n { 'Algorithmhasrun': false, 'AlgorithmRun': true }\n ).subscribe(() => {\n this.status = 'generating'; // assume report starts generating immediately\n })\n }\n\n resetModifications() {\n this.formGroup.patchValue(this.initialFormState);\n }\n\n ngOnInit() {\n if (!this.config?.owners?.[0]) {\n this.status = 'nouser';\n return;\n }\n\n forkJoin([\n this.shared.getUser(this.config.currentUserId),\n this.shared.getUser(this.config.owners[0])\n ]).pipe(tap(([current, owner]) => {\n this.currentUser = current;\n this.owner = owner;\n })).subscribe();\n\n this.loadDeviceData();\n }\n}\n","<div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the details.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <form *ngIf=\"status !== 'error' && status !== 'nouser'\" [formGroup]=\"formGroup\" (ngSubmit)=\"saveModifications()\">\n <div class=\"inputs\">\n <div class=\"form-row\">\n <label for=\"dob\">Date of Birth:</label>\n <input id=\"dob\" type=\"date\" formControlName=\"dob\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"weight\">Patient Weight (kg):</label>\n <input id=\"weight\" type=\"number\" formControlName=\"weight\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"height\">Patient Height (cm):</label>\n <input id=\"height\" type=\"number\" formControlName=\"height\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealStart\">Meal Start Time:</label>\n <input id=\"mealStart\" type=\"datetime-local\" formControlName=\"mealStart\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealEnd\">Meal End Time:</label>\n <input id=\"mealEnd\" type=\"datetime-local\" formControlName=\"mealEnd\">\n </div>\n </div>\n\n <div *ngIf=\"!formGroup.valid && formGroup.dirty\" class=\"errors\">\n <div *ngFor=\"let control of formGroup.controls | entries\">\n {{ parseInputErrors(control[0], control[1]) }}\n </div>\n </div>\n\n <div *ngIf=\"status === 'generating'\" class=\"info\">\n <div>The report is generating at the moment, check back later if you need to modify this entry.</div>\n </div>\n\n <div class=\"buttons\">\n <button type=\"button\" (click)=\"regenReport()\" [disabled]=\"status === 'sending' || status === 'generating' || status === 'loading'\">Regenerate Report</button>\n <button type=\"button\" (click)=\"resetModifications()\" [disabled]=\"status === 'sending' || status === 'generating' || formGroup.pristine\">Cancel Modification</button>\n <button type=\"submit\" [disabled]=\"status === 'sending' || status === 'generating' || !formGroup.valid || formGroup.pristine\">Save Details</button>\n </div>\n </form>\n</div>\n","import { CommonModule, JsonPipe } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { DetailEditComponent } from './detail-edit.component';\nimport { EntriesPipe } from './entries.pipe';\n\n\n\n@NgModule({\n declarations: [\n DetailEditComponent,\n EntriesPipe\n ],\n imports: [\n JsonPipe,\n ReactiveFormsModule,\n CommonModule\n ],\n exports: [\n DetailEditComponent\n ]\n})\nexport class DetailEditModule { }\n","/*\n * Public API Surface of detail-edit\n */\n\nexport * from './lib/detail-edit.service';\nexport * from './lib/detail-edit.component';\nexport * from './lib/detail-edit.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4.EntriesPipe"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { Injectable, Pipe, Component, Input, NgModule } from '@angular/core';
|
|
|
3
3
|
import * as i2 from '@angular/forms';
|
|
4
4
|
import { FormGroup, FormControl, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
5
5
|
import { forkJoin, tap } from 'rxjs';
|
|
6
|
-
import * as i1 from 'shared';
|
|
6
|
+
import * as i1 from 'alimetry-shared';
|
|
7
7
|
import * as i3 from '@angular/common';
|
|
8
8
|
import { JsonPipe, CommonModule } from '@angular/common';
|
|
9
9
|
|
|
@@ -66,6 +66,11 @@ function titleise(camel) {
|
|
|
66
66
|
function shallowCompare(a, b) {
|
|
67
67
|
return Object.entries(a).every(([k, v]) => b[k] === v);
|
|
68
68
|
}
|
|
69
|
+
function shallowDiff(a, b) {
|
|
70
|
+
const from = Object.fromEntries(Object.entries(a).filter(([k, v]) => b[k] !== v));
|
|
71
|
+
const to = Object.fromEntries(Object.entries(b).filter(([k, _]) => from[k]));
|
|
72
|
+
return { from, to };
|
|
73
|
+
}
|
|
69
74
|
|
|
70
75
|
function setControlError(control, errorKey, errorValue) {
|
|
71
76
|
const currentErrors = control.errors || {};
|
|
@@ -235,7 +240,7 @@ class DetailEditComponent {
|
|
|
235
240
|
patient.age = getAge(mods.dob);
|
|
236
241
|
recordingSession.mealStart = globaliseDateTime(mods.mealStart);
|
|
237
242
|
recordingSession.mealEnd = globaliseDateTime(mods.mealEnd);
|
|
238
|
-
this.
|
|
243
|
+
this.logChange(mods);
|
|
239
244
|
return {
|
|
240
245
|
'Age': patient.age,
|
|
241
246
|
'RecordingSession': JSON.stringify(recordingSession),
|
|
@@ -243,46 +248,37 @@ class DetailEditComponent {
|
|
|
243
248
|
};
|
|
244
249
|
}
|
|
245
250
|
postDeviceData(devicePropertySetId, data) {
|
|
246
|
-
return this.shared.saveDeviceData(this.config.deviceDataModelId, this.deviceDataId, devicePropertySetId, this.config.owners[0]
|
|
251
|
+
return this.shared.saveDeviceData(this.config.deviceDataModelId, this.deviceDataId, devicePropertySetId, this.config.owners[0], data);
|
|
247
252
|
}
|
|
248
253
|
// patch the device data record with the modifications
|
|
249
254
|
saveModifications() {
|
|
250
255
|
const mods = this.formGroup.getRawValue();
|
|
251
256
|
const patchedDeviceData = this.integrateFields(mods, this.recordingSession);
|
|
252
|
-
const patchedUserData = Object.assign(this.
|
|
257
|
+
const patchedUserData = Object.assign(this.owner, { dateOfBirth: mods.dob });
|
|
253
258
|
this.status = 'sending';
|
|
254
259
|
forkJoin([
|
|
255
260
|
this.postDeviceData(appDataPropertySetId, patchedDeviceData),
|
|
256
|
-
this.shared.updateUser(this.config.owners[0]
|
|
261
|
+
this.shared.updateUser(this.config.owners[0], patchedUserData)
|
|
257
262
|
]).pipe(tap(() => this.regenReport())).subscribe();
|
|
258
263
|
}
|
|
259
|
-
|
|
260
|
-
const
|
|
261
|
-
const newChangeLog = {};
|
|
262
|
-
// Only include fields that have changed
|
|
263
|
-
for (const key in mods) {
|
|
264
|
-
if (this.initialFormState[key] !== mods[key]) {
|
|
265
|
-
prevChangeLog[key] = this.initialFormState[key];
|
|
266
|
-
newChangeLog[key] = mods[key];
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
const changeLog = {
|
|
264
|
+
logChange(mods) {
|
|
265
|
+
const entry = {
|
|
270
266
|
author: this.currentUser.emailAddress,
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
timestamp: new Date().toISOString()
|
|
267
|
+
timestamp: new Date().toISOString(),
|
|
268
|
+
...shallowDiff(this.initialFormState, mods)
|
|
274
269
|
};
|
|
275
|
-
this.detailChangeLog.push(
|
|
270
|
+
this.detailChangeLog.push(entry);
|
|
271
|
+
console.log(this.detailChangeLog);
|
|
276
272
|
}
|
|
277
273
|
// get the device data record and initialise the form
|
|
278
274
|
loadDeviceData() {
|
|
279
|
-
this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0]
|
|
275
|
+
this.shared.getDeviceData(this.config.deviceDataModelId, this.config.owners[0], propertyCodes).subscribe({
|
|
280
276
|
next: (res) => {
|
|
281
277
|
this.deviceDataId = res.deviceDataId;
|
|
282
278
|
this.recordingSession = JSON.parse(res.data['RecordingSession'].value);
|
|
283
279
|
this.initialiseForm(this.extractFields(this.recordingSession));
|
|
284
|
-
//
|
|
285
|
-
this.detailChangeLog = res.data['UserDetailChangeLog']
|
|
280
|
+
// data field uninitialised for unmodified record
|
|
281
|
+
this.detailChangeLog = res.data['UserDetailChangeLog']?.value ?? [];
|
|
286
282
|
this.status = res.data['Status']?.value === 'Generating Report' ?
|
|
287
283
|
'generating' :
|
|
288
284
|
'success';
|
|
@@ -302,16 +298,17 @@ class DetailEditComponent {
|
|
|
302
298
|
this.formGroup.patchValue(this.initialFormState);
|
|
303
299
|
}
|
|
304
300
|
ngOnInit() {
|
|
305
|
-
if (!this.config?.owners?.[0]
|
|
301
|
+
if (!this.config?.owners?.[0]) {
|
|
306
302
|
this.status = 'nouser';
|
|
307
303
|
return;
|
|
308
304
|
}
|
|
309
|
-
|
|
310
|
-
this.
|
|
311
|
-
|
|
312
|
-
|
|
305
|
+
forkJoin([
|
|
306
|
+
this.shared.getUser(this.config.currentUserId),
|
|
307
|
+
this.shared.getUser(this.config.owners[0])
|
|
308
|
+
]).pipe(tap(([current, owner]) => {
|
|
309
|
+
this.currentUser = current;
|
|
313
310
|
this.owner = owner;
|
|
314
|
-
});
|
|
311
|
+
})).subscribe();
|
|
315
312
|
this.loadDeviceData();
|
|
316
313
|
}
|
|
317
314
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alimetry-detail-edit.mjs","sources":["../../../projects/detail-edit/src/lib/detail-edit.service.ts","../../../projects/detail-edit/src/lib/utils.ts","../../../projects/detail-edit/src/lib/validators.ts","../../../projects/detail-edit/src/lib/entries.pipe.ts","../../../projects/detail-edit/src/lib/detail-edit.component.ts","../../../projects/detail-edit/src/lib/detail-edit.component.html","../../../projects/detail-edit/src/lib/detail-edit.module.ts","../../../projects/detail-edit/src/public-api.ts","../../../projects/detail-edit/src/alimetry-detail-edit.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DetailEditService {\n\n constructor() { }\n}\n","// strip the timezone offset to create format usable by <input>\nexport function localiseDateTime(datetime: string) {\n const date = new Date(datetime);\n\n const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n const hour = date.getHours().toString().padStart(2, '0');\n const minute = date.getMinutes().toString().padStart(2, '0');\n const second = date.getSeconds().toString().padStart(2, '0');\n\n return `${year}-${month}-${day}T${hour}:${minute}:${second}`;\n}\n\n// reconstruct original ISO format\nexport function globaliseDateTime(datetime: string) {\n const date = new Date(datetime);\n\n const offset = -date.getTimezoneOffset();\n const offsetAbs = Math.abs(offset);\n\n const sign = offset >= 0 ? '+' : '-';\n const hours = String(Math.floor(offsetAbs / 60)).padStart(2, '0');\n const minutes = String(offsetAbs % 60).padStart(2, '0');\n const offsetString = `${sign}${hours}:${minutes}`;\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hour = String(date.getHours()).padStart(2, '0');\n const minute = String(date.getMinutes()).padStart(2, '0');\n const second = String(date.getSeconds()).padStart(2, '0');\n\n const datePart = `${year}-${month}-${day}`;\n const timePart = `${hour}:${minute}:${second}.000`;\n\n return `${datePart}T${timePart}${offsetString}`;\n}\n\nexport function getAge(dob: string) {\n const then = new Date(dob);\n const now = new Date();\n\n let age = now.getFullYear() - then.getFullYear();\n\n if (now.getMonth() < then.getMonth() ||\n (now.getMonth() === then.getMonth() && now.getDate() < then.getDate())) {\n age--;\n }\n\n return age;\n}\n\nexport function titleise(camel: string) {\n let spaced = camel.replace(/(?=[A-Z])/g, ' ');\n return spaced.toLowerCase().replace(/\\b\\w/g, ch => ch.toUpperCase());\n}\n\nexport function shallowCompare(a: object, b: object) {\n return Object.entries(a).every(([k, v]) => b[k] === v);\n}\n","import { AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn } from \"@angular/forms\";\nimport { titleise } from \"./utils\";\n\nfunction setControlError(control: AbstractControl, errorKey: string, errorValue: any) {\n const currentErrors = control.errors || {};\n if (currentErrors[errorKey]) return;\n control.setErrors({ ...currentErrors, [errorKey]: errorValue });\n}\n\nfunction clearControlError(control: AbstractControl, errorKey: string) {\n const currentErrors = control.errors || {};\n if (!currentErrors[errorKey]) return;\n control.setErrors({ ...currentErrors, [errorKey]: null });\n}\n\nexport function dateComparison(a: string, b: string, comparator: 'before' | 'after') {\n return function(control: AbstractControl<any, any>): ValidationErrors | null {\n if (!(control instanceof FormGroup)) return null;\n\n const formGroup = control as FormGroup;\n\n const aControl = formGroup.get(a);\n const bControl = formGroup.get(b);\n\n if (!aControl?.value || !bControl?.value) {\n clearControlError(aControl, 'dateRange');\n return null;\n }\n\n const aDate = new Date(aControl.value);\n const bDate = new Date(bControl.value);\n\n const hasError = (\n comparator === 'after' && aDate <= bDate ||\n comparator === 'before' && aDate >= bDate\n );\n\n if (hasError) {\n setControlError(aControl, 'dateRange', { against: b, comparator });\n return { dateRange: true };\n }\n\n clearControlError(aControl, 'dateRange');\n return null;\n }\n}\n\nexport function withinNYears(n: number, dir: 'both' | 'before' | 'after' = 'both', of?: Date): ValidatorFn {\n return function(control: AbstractControl): ValidationErrors | null {\n const timestamp = control?.value;\n if (!timestamp || isNaN(new Date(timestamp).getTime())) return null;\n\n const date = new Date(timestamp);\n const against = of ?? new Date();\n\n const min = new Date(against)\n min.setFullYear(against.getFullYear() - n);\n const max = new Date(against)\n max.setFullYear(against.getFullYear() + n);\n\n let isValid = false;\n if (dir === 'after') isValid = date < max && date > against;\n else if (dir === 'before') isValid = date > min && date < against;\n else isValid = date > min && date < max;\n\n return isValid ? null : { notWithinYears: { n, against, dir } };\n }\n}\n\nexport function withinNHours(n: number, dir: 'both' | 'before' | 'after' = 'both', of?: Date): ValidatorFn {\n return function(control: AbstractControl): ValidationErrors | null {\n const timestamp = control?.value;\n if (!timestamp || isNaN(new Date(timestamp).getTime())) return null;\n\n const date = new Date(timestamp);\n const against = of ?? new Date();\n\n const min = new Date(against)\n min.setHours(against.getHours() - n);\n const max = new Date(against)\n max.setHours(against.getHours() + n);\n\n let isValid = false;\n if (dir === 'after') isValid = date < max && date > against;\n else if (dir === 'before') isValid = date > min && date < against;\n else isValid = date > min && date < max;\n\n return isValid ? null : { notWithinHours: { n, against, dir } };\n }\n}\n\n// translate validation errors into human readable strings\nexport function translateError(name: string, control: AbstractControl) {\n const { errors } = control;\n\n if (control.hasError('required'))\n return `${titleise(name)} is a required value.`;\n else if (control.hasError('min'))\n return `${titleise(name)} needs to be a minimum of ${errors.min.min}.`;\n else if (control.hasError('max'))\n return `${titleise(name)} needs to be a maximum of ${errors.max.max}.`;\n else if (control.hasError('future'))\n return `${titleise(name)} needs to be in the past.`;\n else if (control.hasError('dateRange'))\n return `${titleise(name)} needs to be ${errors.dateRange.comparator} ${titleise(errors.dateRange.against)}.`;\n else if (control.hasError('notWithinYears'))\n return `${titleise(name)} needs to be within ${errors.notWithinYears.n} years of ${errors.notWithinYears.against}`;\n else if (control.hasError('notWithinHours'))\n return `${titleise(name)} needs to be within ${errors.notWithinHours.n} hours of ${errors.notWithinHours.against}`;\n\n return null;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'entries'\n})\nexport class EntriesPipe implements PipeTransform {\n transform(value: object): [string, any][] {\n return Object.entries(value);\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { AbstractControl, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { forkJoin, tap } from 'rxjs';\nimport { Config, SharedService, User } from 'shared';\nimport { getAge, globaliseDateTime, localiseDateTime, shallowCompare } from './utils';\nimport { dateComparison, withinNYears, withinNHours, translateError } from './validators';\n\nconst appDataPropertySetId = '34d46477-ad4b-47b4-b555-06358b92f60c';\nconst deviceDataPropertySetId = '7a32d851-5e89-46a6-a4b6-cca162dace29';\nconst propertyCodes = ['RecordingSession', 'Status', 'UserDetailChangeLog'];\n\n@Component({\n selector: 'lib-detail-edit', templateUrl: './detail-edit.component.html',\n styleUrls: ['./detail-edit.component.css']\n})\nexport class DetailEditComponent {\n @Input() config!: Config;\n\n status: 'error' | 'loading' | 'success' | 'generating' | 'sending' | 'nouser' = 'loading';\n\n // populated by load request\n private deviceDataId: string;\n private recordingSession: object;\n private recordingStart: string;\n private initialFormState: object;\n private detailChangeLog: object[];\n private currentUser: User;\n private owner: User;\n\n formGroup = new FormGroup({\n dob: new FormControl<string>('', [Validators.required, withinNYears(120, 'before')]),\n height: new FormControl<number>(0, [Validators.required, Validators.min(30), Validators.max(272)]),\n weight: new FormControl<number>(0, [Validators.required, Validators.min(1), Validators.max(635)]),\n mealStart: new FormControl<string>('', [Validators.required]),\n mealEnd: new FormControl<string>('', [Validators.required])\n }, [\n dateComparison('mealEnd', 'mealStart', 'after'),\n dateComparison('mealStart', 'dob', 'after'),\n ]);\n\n constructor(private shared: SharedService) { }\n\n parseInputErrors(name: string, control: AbstractControl) {\n return translateError(name, control);\n }\n\n // make sure than modifications that don't actually differ from the current are marked as such\n private monitorFormChanges() {\n this.formGroup.valueChanges.subscribe(current => {\n if (shallowCompare(current, this.initialFormState)) {\n this.formGroup.markAsPristine();\n }\n })\n }\n\n // handle the relevant data from the response body\n private extractFields(recordingSession: Record<string, any>) {\n const { patient, mealStart, mealEnd, recordingStart } = recordingSession;\n this.recordingStart = recordingStart;\n\n return {\n dob: this.owner.dateOfBirth,\n height: patient.height,\n weight: patient.weight,\n mealStart: localiseDateTime(mealStart),\n mealEnd: localiseDateTime(mealEnd)\n }\n }\n\n private initialiseForm(state: object) {\n this.formGroup.patchValue(state);\n this.formGroup.markAsPristine();\n\n this.formGroup.get('mealStart').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));\n this.formGroup.get('mealEnd').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));\n\n this.initialFormState = state; // save this for use in resets\n this.monitorFormChanges();\n }\n\n // construct a patch object for the save request\n private integrateFields(mods: typeof this.formGroup.value, recordingSession: Record<string, any>) {\n const { patient } = recordingSession;\n patient.height = mods.height;\n patient.weight = mods.weight;\n patient.age = getAge(mods.dob);\n\n recordingSession.mealStart = globaliseDateTime(mods.mealStart);\n recordingSession.mealEnd = globaliseDateTime(mods.mealEnd);\n\n this.appendChangeLog(mods);\n\n return {\n 'Age': patient.age,\n 'RecordingSession': JSON.stringify(recordingSession),\n 'UserDetailChangeLog': this.detailChangeLog\n }\n }\n\n private postDeviceData(devicePropertySetId: string, data: object) {\n return this.shared.saveDeviceData(\n this.config.deviceDataModelId,\n this.deviceDataId,\n devicePropertySetId,\n this.config.owners[0].userId,\n data\n );\n }\n\n // patch the device data record with the modifications\n saveModifications() {\n const mods = this.formGroup.getRawValue();\n const patchedDeviceData = this.integrateFields(mods, this.recordingSession);\n const patchedUserData = Object.assign(this.config.owners[0], { dateOfBirth: mods.dob });\n\n this.status = 'sending';\n forkJoin([\n this.postDeviceData(appDataPropertySetId, patchedDeviceData),\n this.shared.updateUser(this.config.owners[0].userId, patchedUserData)\n ]).pipe(\n tap(() => this.regenReport())\n ).subscribe();\n }\n\n private appendChangeLog(mods: typeof this.formGroup.value) {\n const prevChangeLog: Partial<typeof this.formGroup.value> = {};\n const newChangeLog: Partial<typeof this.formGroup.value> = {};\n\n // Only include fields that have changed\n for (const key in mods) {\n if (this.initialFormState[key] !== mods[key]) {\n prevChangeLog[key] = this.initialFormState[key];\n newChangeLog[key] = mods[key];\n }\n }\n\n const changeLog = {\n author: this.currentUser.emailAddress,\n prevChangeLog: prevChangeLog,\n newChangeLog: newChangeLog,\n timestamp: new Date().toISOString()\n }\n\n this.detailChangeLog.push(changeLog);\n }\n\n // get the device data record and initialise the form\n private loadDeviceData() {\n this.shared.getDeviceData(\n this.config.deviceDataModelId,\n this.config.owners[0].userId,\n propertyCodes\n ).subscribe({\n next: (res) => {\n this.deviceDataId = res.deviceDataId;\n this.recordingSession = JSON.parse(res.data['RecordingSession'].value);\n this.initialiseForm(this.extractFields(this.recordingSession));\n // checking for undefined in case no changes have been logged yet\n this.detailChangeLog = res.data['UserDetailChangeLog'] === undefined ? [] : res.data['UserDetailChangeLog'].value;\n\n this.status = res.data['Status']?.value === 'Generating Report' ?\n 'generating' :\n 'success';\n },\n error: (err) => {\n console.error(err);\n this.status = \"error\";\n }\n });\n }\n\n regenReport() {\n this.postDeviceData(\n deviceDataPropertySetId,\n { 'Algorithmhasrun': false, 'AlgorithmRun': true }\n ).subscribe(() => {\n this.status = 'generating'; // assume report starts generating immediately\n })\n }\n\n resetModifications() {\n this.formGroup.patchValue(this.initialFormState);\n }\n\n ngOnInit() {\n if (!this.config?.owners?.[0]?.userId) {\n this.status = 'nouser';\n return;\n }\n this.shared.getUser(this.config.currentUser.userId).subscribe(user => {\n this.currentUser = user;\n });\n\n this.shared.getUser(this.config.owners[0].userId).subscribe(owner => {\n this.owner = owner;\n });\n\n this.loadDeviceData();\n }\n}\n","<div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the details.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <form *ngIf=\"status !== 'error' && status !== 'nouser'\" [formGroup]=\"formGroup\" (ngSubmit)=\"saveModifications()\">\n <div class=\"inputs\">\n <div class=\"form-row\">\n <label for=\"dob\">Date of Birth:</label>\n <input id=\"dob\" type=\"date\" formControlName=\"dob\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"weight\">Patient Weight (kg):</label>\n <input id=\"weight\" type=\"number\" formControlName=\"weight\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"height\">Patient Height (cm):</label>\n <input id=\"height\" type=\"number\" formControlName=\"height\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealStart\">Meal Start Time:</label>\n <input id=\"mealStart\" type=\"datetime-local\" formControlName=\"mealStart\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealEnd\">Meal End Time:</label>\n <input id=\"mealEnd\" type=\"datetime-local\" formControlName=\"mealEnd\">\n </div>\n </div>\n\n <div *ngIf=\"!formGroup.valid && formGroup.dirty\" class=\"errors\">\n <div *ngFor=\"let control of formGroup.controls | entries\">\n {{ parseInputErrors(control[0], control[1]) }}\n </div>\n </div>\n\n <div *ngIf=\"status === 'generating'\" class=\"info\">\n <div>The report is generating at the moment, check back later if you need to modify this entry.</div>\n </div>\n\n <div class=\"buttons\">\n <button type=\"button\" (click)=\"regenReport()\" [disabled]=\"status === 'sending' || status === 'generating' || status === 'loading'\">Regenerate Report</button>\n <button type=\"button\" (click)=\"resetModifications()\" [disabled]=\"status === 'sending' || status === 'generating' || formGroup.pristine\">Cancel Modification</button>\n <button type=\"submit\" [disabled]=\"status === 'sending' || status === 'generating' || !formGroup.valid || formGroup.pristine\">Save Details</button>\n </div>\n </form>\n</div>\n","import { CommonModule, JsonPipe } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { DetailEditComponent } from './detail-edit.component';\nimport { EntriesPipe } from './entries.pipe';\n\n\n\n@NgModule({\n declarations: [\n DetailEditComponent,\n EntriesPipe\n ],\n imports: [\n JsonPipe,\n ReactiveFormsModule,\n CommonModule\n ],\n exports: [\n DetailEditComponent\n ]\n})\nexport class DetailEditModule { }\n","/*\n * Public API Surface of detail-edit\n */\n\nexport * from './lib/detail-edit.service';\nexport * from './lib/detail-edit.component';\nexport * from './lib/detail-edit.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4.EntriesPipe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"alimetry-detail-edit.mjs","sources":["../../../projects/detail-edit/src/lib/detail-edit.service.ts","../../../projects/detail-edit/src/lib/utils.ts","../../../projects/detail-edit/src/lib/validators.ts","../../../projects/detail-edit/src/lib/entries.pipe.ts","../../../projects/detail-edit/src/lib/detail-edit.component.ts","../../../projects/detail-edit/src/lib/detail-edit.component.html","../../../projects/detail-edit/src/lib/detail-edit.module.ts","../../../projects/detail-edit/src/public-api.ts","../../../projects/detail-edit/src/alimetry-detail-edit.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DetailEditService {\n\n constructor() { }\n}\n","// strip the timezone offset to create format usable by <input>\nexport function localiseDateTime(datetime: string) {\n const date = new Date(datetime);\n\n const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n const hour = date.getHours().toString().padStart(2, '0');\n const minute = date.getMinutes().toString().padStart(2, '0');\n const second = date.getSeconds().toString().padStart(2, '0');\n\n return `${year}-${month}-${day}T${hour}:${minute}:${second}`;\n}\n\n// reconstruct original ISO format\nexport function globaliseDateTime(datetime: string) {\n const date = new Date(datetime);\n\n const offset = -date.getTimezoneOffset();\n const offsetAbs = Math.abs(offset);\n\n const sign = offset >= 0 ? '+' : '-';\n const hours = String(Math.floor(offsetAbs / 60)).padStart(2, '0');\n const minutes = String(offsetAbs % 60).padStart(2, '0');\n const offsetString = `${sign}${hours}:${minutes}`;\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hour = String(date.getHours()).padStart(2, '0');\n const minute = String(date.getMinutes()).padStart(2, '0');\n const second = String(date.getSeconds()).padStart(2, '0');\n\n const datePart = `${year}-${month}-${day}`;\n const timePart = `${hour}:${minute}:${second}.000`;\n\n return `${datePart}T${timePart}${offsetString}`;\n}\n\nexport function getAge(dob: string) {\n const then = new Date(dob);\n const now = new Date();\n\n let age = now.getFullYear() - then.getFullYear();\n\n if (now.getMonth() < then.getMonth() ||\n (now.getMonth() === then.getMonth() && now.getDate() < then.getDate())) {\n age--;\n }\n\n return age;\n}\n\nexport function titleise(camel: string) {\n let spaced = camel.replace(/(?=[A-Z])/g, ' ');\n return spaced.toLowerCase().replace(/\\b\\w/g, ch => ch.toUpperCase());\n}\n\nexport function shallowCompare(a: object, b: object) {\n return Object.entries(a).every(([k, v]) => b[k] === v);\n}\n\nexport function shallowDiff(a: object, b: object) {\n const from = Object.fromEntries(Object.entries(a).filter(([k, v]) => b[k] !== v));\n const to = Object.fromEntries(Object.entries(b).filter(([k, _]) => from[k]));\n return { from, to };\n}\n","import { AbstractControl, FormControl, FormGroup, ValidationErrors, ValidatorFn } from \"@angular/forms\";\nimport { titleise } from \"./utils\";\n\nfunction setControlError(control: AbstractControl, errorKey: string, errorValue: any) {\n const currentErrors = control.errors || {};\n if (currentErrors[errorKey]) return;\n control.setErrors({ ...currentErrors, [errorKey]: errorValue });\n}\n\nfunction clearControlError(control: AbstractControl, errorKey: string) {\n const currentErrors = control.errors || {};\n if (!currentErrors[errorKey]) return;\n control.setErrors({ ...currentErrors, [errorKey]: null });\n}\n\nexport function dateComparison(a: string, b: string, comparator: 'before' | 'after') {\n return function(control: AbstractControl<any, any>): ValidationErrors | null {\n if (!(control instanceof FormGroup)) return null;\n\n const formGroup = control as FormGroup;\n\n const aControl = formGroup.get(a);\n const bControl = formGroup.get(b);\n\n if (!aControl?.value || !bControl?.value) {\n clearControlError(aControl, 'dateRange');\n return null;\n }\n\n const aDate = new Date(aControl.value);\n const bDate = new Date(bControl.value);\n\n const hasError = (\n comparator === 'after' && aDate <= bDate ||\n comparator === 'before' && aDate >= bDate\n );\n\n if (hasError) {\n setControlError(aControl, 'dateRange', { against: b, comparator });\n return { dateRange: true };\n }\n\n clearControlError(aControl, 'dateRange');\n return null;\n }\n}\n\nexport function withinNYears(n: number, dir: 'both' | 'before' | 'after' = 'both', of?: Date): ValidatorFn {\n return function(control: AbstractControl): ValidationErrors | null {\n const timestamp = control?.value;\n if (!timestamp || isNaN(new Date(timestamp).getTime())) return null;\n\n const date = new Date(timestamp);\n const against = of ?? new Date();\n\n const min = new Date(against)\n min.setFullYear(against.getFullYear() - n);\n const max = new Date(against)\n max.setFullYear(against.getFullYear() + n);\n\n let isValid = false;\n if (dir === 'after') isValid = date < max && date > against;\n else if (dir === 'before') isValid = date > min && date < against;\n else isValid = date > min && date < max;\n\n return isValid ? null : { notWithinYears: { n, against, dir } };\n }\n}\n\nexport function withinNHours(n: number, dir: 'both' | 'before' | 'after' = 'both', of?: Date): ValidatorFn {\n return function(control: AbstractControl): ValidationErrors | null {\n const timestamp = control?.value;\n if (!timestamp || isNaN(new Date(timestamp).getTime())) return null;\n\n const date = new Date(timestamp);\n const against = of ?? new Date();\n\n const min = new Date(against)\n min.setHours(against.getHours() - n);\n const max = new Date(against)\n max.setHours(against.getHours() + n);\n\n let isValid = false;\n if (dir === 'after') isValid = date < max && date > against;\n else if (dir === 'before') isValid = date > min && date < against;\n else isValid = date > min && date < max;\n\n return isValid ? null : { notWithinHours: { n, against, dir } };\n }\n}\n\n// translate validation errors into human readable strings\nexport function translateError(name: string, control: AbstractControl) {\n const { errors } = control;\n\n if (control.hasError('required'))\n return `${titleise(name)} is a required value.`;\n else if (control.hasError('min'))\n return `${titleise(name)} needs to be a minimum of ${errors.min.min}.`;\n else if (control.hasError('max'))\n return `${titleise(name)} needs to be a maximum of ${errors.max.max}.`;\n else if (control.hasError('future'))\n return `${titleise(name)} needs to be in the past.`;\n else if (control.hasError('dateRange'))\n return `${titleise(name)} needs to be ${errors.dateRange.comparator} ${titleise(errors.dateRange.against)}.`;\n else if (control.hasError('notWithinYears'))\n return `${titleise(name)} needs to be within ${errors.notWithinYears.n} years of ${errors.notWithinYears.against}`;\n else if (control.hasError('notWithinHours'))\n return `${titleise(name)} needs to be within ${errors.notWithinHours.n} hours of ${errors.notWithinHours.against}`;\n\n return null;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'entries'\n})\nexport class EntriesPipe implements PipeTransform {\n transform(value: object): [string, any][] {\n return Object.entries(value);\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { AbstractControl, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { forkJoin, tap } from 'rxjs';\nimport { Config, SharedService, User } from 'alimetry-shared';\nimport { getAge, globaliseDateTime, localiseDateTime, shallowCompare, shallowDiff } from './utils';\nimport { dateComparison, withinNYears, withinNHours, translateError } from './validators';\n\nconst appDataPropertySetId = '34d46477-ad4b-47b4-b555-06358b92f60c';\nconst deviceDataPropertySetId = '7a32d851-5e89-46a6-a4b6-cca162dace29';\nconst propertyCodes = ['RecordingSession', 'Status', 'UserDetailChangeLog'];\n\ninterface FormValue {\n dob: string,\n height: number,\n weight: number,\n mealStart: string,\n mealEnd: string\n}\n\ninterface Change {\n timestamp: string,\n author: string,\n from: Partial<FormValue>,\n to: Partial<FormValue>\n}\n\n@Component({\n selector: 'lib-detail-edit', templateUrl: './detail-edit.component.html',\n styleUrls: ['./detail-edit.component.css']\n})\nexport class DetailEditComponent {\n @Input() config!: Config;\n\n status: 'error' | 'loading' | 'success' | 'generating' | 'sending' | 'nouser' = 'loading';\n\n // device data populated by load request\n private deviceDataId: string;\n private recordingSession: object;\n private recordingStart: string;\n private initialFormState: object;\n\n // user data expanded from ids passed in config\n private currentUser: User;\n private owner: User;\n\n private detailChangeLog: Change[];\n\n formGroup = new FormGroup({\n dob: new FormControl<string>('', [Validators.required, withinNYears(120, 'before')]),\n height: new FormControl<number>(0, [Validators.required, Validators.min(30), Validators.max(272)]),\n weight: new FormControl<number>(0, [Validators.required, Validators.min(1), Validators.max(635)]),\n mealStart: new FormControl<string>('', [Validators.required]),\n mealEnd: new FormControl<string>('', [Validators.required])\n }, [\n dateComparison('mealEnd', 'mealStart', 'after'),\n dateComparison('mealStart', 'dob', 'after'),\n ]);\n\n constructor(private shared: SharedService) { }\n\n parseInputErrors(name: string, control: AbstractControl) {\n return translateError(name, control);\n }\n\n // make sure than modifications that don't actually differ from the current are marked as such\n private monitorFormChanges() {\n this.formGroup.valueChanges.subscribe(current => {\n if (shallowCompare(current, this.initialFormState)) {\n this.formGroup.markAsPristine();\n }\n })\n }\n\n // handle the relevant data from the response body\n private extractFields(recordingSession: Record<string, any>) {\n const { patient, mealStart, mealEnd, recordingStart } = recordingSession;\n this.recordingStart = recordingStart;\n\n return {\n dob: this.owner.dateOfBirth,\n height: patient.height,\n weight: patient.weight,\n mealStart: localiseDateTime(mealStart),\n mealEnd: localiseDateTime(mealEnd)\n }\n }\n\n private initialiseForm(state: object) {\n this.formGroup.patchValue(state);\n this.formGroup.markAsPristine();\n\n this.formGroup.get('mealStart').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));\n this.formGroup.get('mealEnd').addValidators(withinNHours(24, 'after', new Date(this.recordingStart)));\n\n this.initialFormState = state; // save this for use in resets\n this.monitorFormChanges();\n }\n\n // construct a patch object for the save request\n private integrateFields(mods: FormValue, recordingSession: Record<string, any>) {\n const { patient } = recordingSession;\n patient.height = mods.height;\n patient.weight = mods.weight;\n patient.age = getAge(mods.dob);\n\n recordingSession.mealStart = globaliseDateTime(mods.mealStart);\n recordingSession.mealEnd = globaliseDateTime(mods.mealEnd);\n\n this.logChange(mods);\n\n return {\n 'Age': patient.age,\n 'RecordingSession': JSON.stringify(recordingSession),\n 'UserDetailChangeLog': this.detailChangeLog\n }\n }\n\n private postDeviceData(devicePropertySetId: string, data: object) {\n return this.shared.saveDeviceData(\n this.config.deviceDataModelId,\n this.deviceDataId,\n devicePropertySetId,\n this.config.owners[0],\n data\n );\n }\n\n // patch the device data record with the modifications\n saveModifications() {\n const mods = this.formGroup.getRawValue();\n const patchedDeviceData = this.integrateFields(mods, this.recordingSession);\n const patchedUserData = Object.assign(this.owner, { dateOfBirth: mods.dob });\n\n this.status = 'sending';\n forkJoin([\n this.postDeviceData(appDataPropertySetId, patchedDeviceData),\n this.shared.updateUser(this.config.owners[0], patchedUserData)\n ]).pipe(\n tap(() => this.regenReport())\n ).subscribe();\n }\n\n private logChange(mods: FormValue) {\n const entry = {\n author: this.currentUser.emailAddress,\n timestamp: new Date().toISOString(),\n ...shallowDiff(this.initialFormState, mods)\n }\n\n this.detailChangeLog.push(entry);\n\n console.log(this.detailChangeLog);\n }\n\n // get the device data record and initialise the form\n private loadDeviceData() {\n this.shared.getDeviceData(\n this.config.deviceDataModelId,\n this.config.owners[0],\n propertyCodes\n ).subscribe({\n next: (res) => {\n this.deviceDataId = res.deviceDataId;\n this.recordingSession = JSON.parse(res.data['RecordingSession'].value);\n this.initialiseForm(this.extractFields(this.recordingSession));\n\n // data field uninitialised for unmodified record\n this.detailChangeLog = res.data['UserDetailChangeLog']?.value ?? [];\n\n this.status = res.data['Status']?.value === 'Generating Report' ?\n 'generating' :\n 'success';\n },\n error: (err) => {\n console.error(err);\n this.status = \"error\";\n }\n });\n }\n\n regenReport() {\n this.postDeviceData(\n deviceDataPropertySetId,\n { 'Algorithmhasrun': false, 'AlgorithmRun': true }\n ).subscribe(() => {\n this.status = 'generating'; // assume report starts generating immediately\n })\n }\n\n resetModifications() {\n this.formGroup.patchValue(this.initialFormState);\n }\n\n ngOnInit() {\n if (!this.config?.owners?.[0]) {\n this.status = 'nouser';\n return;\n }\n\n forkJoin([\n this.shared.getUser(this.config.currentUserId),\n this.shared.getUser(this.config.owners[0])\n ]).pipe(tap(([current, owner]) => {\n this.currentUser = current;\n this.owner = owner;\n })).subscribe();\n\n this.loadDeviceData();\n }\n}\n","<div class=\"wrapper\">\n <div class=\"status\" *ngIf=\"status === 'error'\">\n An error occured while trying to get the details.\n </div>\n <div class=\"status\" *ngIf=\"status === 'nouser'\">\n There is no user specified as the data owner.\n </div>\n <form *ngIf=\"status !== 'error' && status !== 'nouser'\" [formGroup]=\"formGroup\" (ngSubmit)=\"saveModifications()\">\n <div class=\"inputs\">\n <div class=\"form-row\">\n <label for=\"dob\">Date of Birth:</label>\n <input id=\"dob\" type=\"date\" formControlName=\"dob\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"weight\">Patient Weight (kg):</label>\n <input id=\"weight\" type=\"number\" formControlName=\"weight\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"height\">Patient Height (cm):</label>\n <input id=\"height\" type=\"number\" formControlName=\"height\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealStart\">Meal Start Time:</label>\n <input id=\"mealStart\" type=\"datetime-local\" formControlName=\"mealStart\">\n </div>\n\n <div class=\"form-row\">\n <label for=\"mealEnd\">Meal End Time:</label>\n <input id=\"mealEnd\" type=\"datetime-local\" formControlName=\"mealEnd\">\n </div>\n </div>\n\n <div *ngIf=\"!formGroup.valid && formGroup.dirty\" class=\"errors\">\n <div *ngFor=\"let control of formGroup.controls | entries\">\n {{ parseInputErrors(control[0], control[1]) }}\n </div>\n </div>\n\n <div *ngIf=\"status === 'generating'\" class=\"info\">\n <div>The report is generating at the moment, check back later if you need to modify this entry.</div>\n </div>\n\n <div class=\"buttons\">\n <button type=\"button\" (click)=\"regenReport()\" [disabled]=\"status === 'sending' || status === 'generating' || status === 'loading'\">Regenerate Report</button>\n <button type=\"button\" (click)=\"resetModifications()\" [disabled]=\"status === 'sending' || status === 'generating' || formGroup.pristine\">Cancel Modification</button>\n <button type=\"submit\" [disabled]=\"status === 'sending' || status === 'generating' || !formGroup.valid || formGroup.pristine\">Save Details</button>\n </div>\n </form>\n</div>\n","import { CommonModule, JsonPipe } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { DetailEditComponent } from './detail-edit.component';\nimport { EntriesPipe } from './entries.pipe';\n\n\n\n@NgModule({\n declarations: [\n DetailEditComponent,\n EntriesPipe\n ],\n imports: [\n JsonPipe,\n ReactiveFormsModule,\n CommonModule\n ],\n exports: [\n DetailEditComponent\n ]\n})\nexport class DetailEditModule { }\n","/*\n * Public API Surface of detail-edit\n */\n\nexport * from './lib/detail-edit.service';\nexport * from './lib/detail-edit.component';\nexport * from './lib/detail-edit.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i4.EntriesPipe"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AbstractControl, FormControl, FormGroup } from '@angular/forms';
|
|
2
|
-
import { Config, SharedService } from 'shared';
|
|
2
|
+
import { Config, SharedService } from 'alimetry-shared';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class DetailEditComponent {
|
|
5
5
|
private shared;
|
|
@@ -9,9 +9,9 @@ export declare class DetailEditComponent {
|
|
|
9
9
|
private recordingSession;
|
|
10
10
|
private recordingStart;
|
|
11
11
|
private initialFormState;
|
|
12
|
-
private detailChangeLog;
|
|
13
12
|
private currentUser;
|
|
14
13
|
private owner;
|
|
14
|
+
private detailChangeLog;
|
|
15
15
|
formGroup: FormGroup<{
|
|
16
16
|
dob: FormControl<string>;
|
|
17
17
|
height: FormControl<number>;
|
|
@@ -27,7 +27,7 @@ export declare class DetailEditComponent {
|
|
|
27
27
|
private integrateFields;
|
|
28
28
|
private postDeviceData;
|
|
29
29
|
saveModifications(): void;
|
|
30
|
-
private
|
|
30
|
+
private logChange;
|
|
31
31
|
private loadDeviceData;
|
|
32
32
|
regenReport(): void;
|
|
33
33
|
resetModifications(): void;
|
package/lib/utils.d.ts
CHANGED
|
@@ -3,3 +3,11 @@ export declare function globaliseDateTime(datetime: string): string;
|
|
|
3
3
|
export declare function getAge(dob: string): number;
|
|
4
4
|
export declare function titleise(camel: string): string;
|
|
5
5
|
export declare function shallowCompare(a: object, b: object): boolean;
|
|
6
|
+
export declare function shallowDiff(a: object, b: object): {
|
|
7
|
+
from: {
|
|
8
|
+
[k: string]: any;
|
|
9
|
+
};
|
|
10
|
+
to: {
|
|
11
|
+
[k: string]: any;
|
|
12
|
+
};
|
|
13
|
+
};
|