alimetry-detail-edit 0.0.1 → 1.0.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.
@@ -42,7 +42,7 @@ export class DetailEditComponent {
42
42
  const { patient, mealStart, mealEnd, recordingStart } = recordingSession;
43
43
  this.recordingStart = recordingStart;
44
44
  return {
45
- dob: this.config.owners[0].dateOfBirth,
45
+ dob: this.owner.dateOfBirth,
46
46
  height: patient.height,
47
47
  weight: patient.weight,
48
48
  mealStart: localiseDateTime(mealStart),
@@ -97,7 +97,7 @@ export class DetailEditComponent {
97
97
  }
98
98
  }
99
99
  const changeLog = {
100
- author: this.config.currentUser.emailAddress,
100
+ author: this.currentUser.emailAddress,
101
101
  prevChangeLog: prevChangeLog,
102
102
  newChangeLog: newChangeLog,
103
103
  timestamp: new Date().toISOString()
@@ -136,6 +136,12 @@ export class DetailEditComponent {
136
136
  this.status = 'nouser';
137
137
  return;
138
138
  }
139
+ this.shared.getUser(this.config.currentUser.userId).subscribe(user => {
140
+ this.currentUser = user;
141
+ });
142
+ this.shared.getUser(this.config.owners[0].userId).subscribe(owner => {
143
+ this.owner = owner;
144
+ });
139
145
  this.loadDeviceData();
140
146
  }
141
147
  }
@@ -147,4 +153,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
147
153
  }], ctorParameters: function () { return [{ type: i1.SharedService }]; }, propDecorators: { config: [{
148
154
  type: Input
149
155
  }] } });
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGV0YWlsLWVkaXQvc3JjL2xpYi9kZXRhaWwtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL2RldGFpbC1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFhLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7QUFFMUYsTUFBTSxvQkFBb0IsR0FBRyxzQ0FBc0MsQ0FBQztBQUNwRSxNQUFNLHVCQUF1QixHQUFHLHNDQUFzQyxDQUFDO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFNNUUsTUFBTSxPQUFPLG1CQUFtQjtJQXVCOUIsWUFBb0IsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQXBCekMsV0FBTSxHQUEwRSxTQUFTLENBQUM7UUFTMUYsY0FBUyxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ3hCLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUs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QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO1lBQ3hCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxjQUFjLENBQ2pCLHVCQUF1QixFQUN2QixFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQ25ELENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLENBQUMsOENBQThDO1FBQzVFLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRTtZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN2QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7aUhBOUtVLG1CQUFtQjtxR0FBbkIsbUJBQW1CLHFGQ2ZoQywwd0VBb0RBOzRGRHJDYSxtQkFBbUI7a0JBSi9CLFNBQVM7K0JBQ0UsaUJBQWlCO29HQUlsQixNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbmZpZywgU2hhcmVkU2VydmljZSB9IGZyb20gJ3NoYXJlZCc7XG5pbXBvcnQgeyBnZXRBZ2UsIGdsb2JhbGlzZURhdGVUaW1lLCBsb2NhbGlzZURhdGVUaW1lLCBzaGFsbG93Q29tcGFyZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgZGF0ZUNvbXBhcmlzb24sIHdpdGhpbk5ZZWFycywgd2l0aGluTkhvdXJzLCB0cmFuc2xhdGVFcnJvciB9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5cbmNvbnN0IGFwcERhdGFQcm9wZXJ0eVNldElkID0gJzM0ZDQ2NDc3LWFkNGItNDdiNC1iNTU1LTA2MzU4YjkyZjYwYyc7XG5jb25zdCBkZXZpY2VEYXRhUHJvcGVydHlTZXRJZCA9ICc3YTMyZDg1MS01ZTg5LTQ2YTYtYTRiNi1jY2ExNjJkYWNlMjknO1xuY29uc3QgcHJvcGVydHlDb2RlcyA9IFsnUmVjb3JkaW5nU2Vzc2lvbicsICdTdGF0dXMnLCAnVXNlckRldGFpbENoYW5nZUxvZyddO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGV0YWlsLWVkaXQnLCB0ZW1wbGF0ZVVybDogJy4vZGV0YWlsLWVkaXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZXRhaWwtZWRpdC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGV0YWlsRWRpdENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IENvbmZpZztcblxuICBzdGF0dXM6ICdlcnJvcicgfCAnbG9hZGluZycgfCAnc3VjY2VzcycgfCAnZ2VuZXJhdGluZycgfCAnc2VuZGluZycgfCAnbm91c2VyJyA9ICdsb2FkaW5nJztcblxuICAvLyBwb3B1bGF0ZWQgYnkgbG9hZCByZXF1ZXN0XG4gIHByaXZhdGUgZGV2aWNlRGF0YUlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVjb3JkaW5nU2Vzc2lvbjogb2JqZWN0O1xuICBwcml2YXRlIHJlY29yZGluZ1N0YXJ0OiBzdHJpbmc7XG4gIHByaXZhdGUgaW5pdGlhbEZvcm1TdGF0ZTogb2JqZWN0O1xuICBwcml2YXRlIGRldGFpbENoYW5nZUxvZzogb2JqZWN0W107XG5cbiAgZm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgZG9iOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHdpdGhpbk5ZZWFycygxMjAsICdiZWZvcmUnKV0pLFxuICAgIGhlaWdodDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDMwKSwgVmFsaWRhdG9ycy5tYXgoMjcyKV0pLFxuICAgIHdlaWdodDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oMCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpLCBWYWxpZGF0b3JzLm1heCg2MzUpXSksXG4gICAgbWVhbFN0YXJ0OiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICBtZWFsRW5kOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuICB9LCBbXG4gICAgZGF0ZUNvbXBhcmlzb24oJ21lYWxFbmQnLCAnbWVhbFN0YXJ0JywgJ2FmdGVyJyksXG4gICAgZGF0ZUNvbXBhcmlzb24oJ21lYWxTdGFydCcsICdkb2InLCAnYWZ0ZXInKSxcbiAgXSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzaGFyZWQ6IFNoYXJlZFNlcnZpY2UpIHsgfVxuXG4gIHBhcnNlSW5wdXRFcnJvcnMobmFtZTogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3IobmFtZSwgY29udHJvbCk7XG4gIH1cblxuICAvLyBtYWtlIHN1cmUgdGhhbiBtb2RpZmljYXRpb25zIHRoYXQgZG9uJ3QgYWN0dWFsbHkgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgYXJlIG1hcmtlZCBhcyBzdWNoXG4gIHByaXZhdGUgbW9uaXRvckZvcm1DaGFuZ2VzKCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoY3VycmVudCA9PiB7XG4gICAgICBpZiAoc2hhbGxvd0NvbXBhcmUoY3VycmVudCwgdGhpcy5pbml0aWFsRm9ybVN0YXRlKSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyBoYW5kbGUgdGhlIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgcmVzcG9uc2UgYm9keVxuICBwcml2YXRlIGV4dHJhY3RGaWVsZHMocmVjb3JkaW5nU2Vzc2lvbjogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IHsgcGF0aWVudCwgbWVhbFN0YXJ0LCBtZWFsRW5kLCByZWNvcmRpbmdTdGFydCB9ID0gcmVjb3JkaW5nU2Vzc2lvbjtcbiAgICB0aGlzLnJlY29yZGluZ1N0YXJ0ID0gcmVjb3JkaW5nU3RhcnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZG9iOiB0aGlzLmNvbmZpZy5vd25lcnNbMF0uZGF0ZU9mQmlydGgsXG4gICAgICBoZWlnaHQ6IHBhdGllbnQuaGVpZ2h0LFxuICAgICAgd2VpZ2h0OiBwYXRpZW50LndlaWdodCxcbiAgICAgIG1lYWxTdGFydDogbG9jYWxpc2VEYXRlVGltZShtZWFsU3RhcnQpLFxuICAgICAgbWVhbEVuZDogbG9jYWxpc2VEYXRlVGltZShtZWFsRW5kKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGlzZUZvcm0oc3RhdGU6IG9iamVjdCkge1xuICAgIHRoaXMuZm9ybUdyb3VwLnBhdGNoVmFsdWUoc3RhdGUpO1xuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc1ByaXN0aW5lKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5nZXQoJ21lYWxTdGFydCcpLmFkZFZhbGlkYXRvcnMod2l0aGluTkhvdXJzKDI0LCAnYWZ0ZXInLCBuZXcgRGF0ZSh0aGlzLnJlY29yZGluZ1N0YXJ0KSkpO1xuICAgIHRoaXMuZm9ybUdyb3VwLmdldCgnbWVhbEVuZCcpLmFkZFZhbGlkYXRvcnMod2l0aGluTkhvdXJzKDI0LCAnYWZ0ZXInLCBuZXcgRGF0ZSh0aGlzLnJlY29yZGluZ1N0YXJ0KSkpO1xuXG4gICAgdGhpcy5pbml0aWFsRm9ybVN0YXRlID0gc3RhdGU7IC8vIHNhdmUgdGhpcyBmb3IgdXNlIGluIHJlc2V0c1xuICAgIHRoaXMubW9uaXRvckZvcm1DaGFuZ2VzKCk7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3QgYSBwYXRjaCBvYmplY3QgZm9yIHRoZSBzYXZlIHJlcXVlc3RcbiAgcHJpdmF0ZSBpbnRlZ3JhdGVGaWVsZHMobW9kczogdHlwZW9mIHRoaXMuZm9ybUdyb3VwLnZhbHVlLCByZWNvcmRpbmdTZXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgeyBwYXRpZW50IH0gPSByZWNvcmRpbmdTZXNzaW9uO1xuICAgIHBhdGllbnQuaGVpZ2h0ID0gbW9kcy5oZWlnaHQ7XG4gICAgcGF0aWVudC53ZWlnaHQgPSBtb2RzLndlaWdodDtcbiAgICBwYXRpZW50LmFnZSA9IGdldEFnZShtb2RzLmRvYik7XG5cbiAgICByZWNvcmRpbmdTZXNzaW9uLm1lYWxTdGFydCA9IGdsb2JhbGlzZURhdGVUaW1lKG1vZHMubWVhbFN0YXJ0KTtcbiAgICByZWNvcmRpbmdTZXNzaW9uLm1lYWxFbmQgPSBnbG9iYWxpc2VEYXRlVGltZShtb2RzLm1lYWxFbmQpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGFuZ2VMb2cobW9kcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0FnZSc6IHBhdGllbnQuYWdlLFxuICAgICAgJ1JlY29yZGluZ1Nlc3Npb24nOiBKU09OLnN0cmluZ2lmeShyZWNvcmRpbmdTZXNzaW9uKSxcbiAgICAgICdVc2VyRGV0YWlsQ2hhbmdlTG9nJzogdGhpcy5kZXRhaWxDaGFuZ2VMb2dcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc3REZXZpY2VEYXRhKGRldmljZVByb3BlcnR5U2V0SWQ6IHN0cmluZywgZGF0YTogb2JqZWN0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkLnNhdmVEZXZpY2VEYXRhKFxuICAgICAgdGhpcy5jb25maWcuZGV2aWNlRGF0YU1vZGVsSWQsXG4gICAgICB0aGlzLmRldmljZURhdGFJZCxcbiAgICAgIGRldmljZVByb3BlcnR5U2V0SWQsXG4gICAgICB0aGlzLmNvbmZpZy5vd25lcnNbMF0udXNlcklkLFxuICAgICAgZGF0YVxuICAgICk7XG4gIH1cblxuICAvLyBwYXRjaCB0aGUgZGV2aWNlIGRhdGEgcmVjb3JkIHdpdGggdGhlIG1vZGlmaWNhdGlvbnNcbiAgc2F2ZU1vZGlmaWNhdGlvbnMoKSB7XG4gICAgY29uc3QgbW9kcyA9IHRoaXMuZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCk7XG4gICAgY29uc3QgcGF0Y2hlZERldmljZURhdGEgPSB0aGlzLmludGVncmF0ZUZpZWxkcyhtb2RzLCB0aGlzLnJlY29yZGluZ1Nlc3Npb24pO1xuICAgIGNvbnN0IHBhdGNoZWRVc2VyRGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcub3duZXJzWzBdLCB7IGRhdGVPZkJpcnRoOiBtb2RzLmRvYiB9KTtcblxuICAgIHRoaXMuc3RhdHVzID0gJ3NlbmRpbmcnO1xuICAgIGZvcmtKb2luKFtcbiAgICAgIHRoaXMucG9zdERldmljZURhdGEoYXBwRGF0YVByb3BlcnR5U2V0SWQsIHBhdGNoZWREZXZpY2VEYXRhKSxcbiAgICAgIHRoaXMuc2hhcmVkLnVwZGF0ZVVzZXIodGhpcy5jb25maWcub3duZXJzWzBdLnVzZXJJZCwgcGF0Y2hlZFVzZXJEYXRhKVxuICAgIF0pLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gdGhpcy5yZWdlblJlcG9ydCgpKVxuICAgICkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZENoYW5nZUxvZyhtb2RzOiB0eXBlb2YgdGhpcy5mb3JtR3JvdXAudmFsdWUpIHtcbiAgICBjb25zdCBwcmV2Q2hhbmdlTG9nOiBQYXJ0aWFsPHR5cGVvZiB0aGlzLmZvcm1Hcm91cC52YWx1ZT4gPSB7fTtcbiAgICBjb25zdCBuZXdDaGFuZ2VMb2c6IFBhcnRpYWw8dHlwZW9mIHRoaXMuZm9ybUdyb3VwLnZhbHVlPiA9IHt9O1xuXG4gICAgLy8gT25seSBpbmNsdWRlIGZpZWxkcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgIGZvciAoY29uc3Qga2V5IGluIG1vZHMpIHtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxGb3JtU3RhdGVba2V5XSAhPT0gbW9kc1trZXldKSB7XG4gICAgICAgIHByZXZDaGFuZ2VMb2dba2V5XSA9IHRoaXMuaW5pdGlhbEZvcm1TdGF0ZVtrZXldO1xuICAgICAgICBuZXdDaGFuZ2VMb2dba2V5XSA9IG1vZHNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VMb2cgPSB7XG4gICAgICBhdXRob3I6IHRoaXMuY29uZmlnLmN1cnJlbnRVc2VyLmVtYWlsQWRkcmVzcyxcbiAgICAgIHByZXZDaGFuZ2VMb2c6IHByZXZDaGFuZ2VMb2csXG4gICAgICBuZXdDaGFuZ2VMb2c6IG5ld0NoYW5nZUxvZyxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgfVxuXG4gICAgdGhpcy5kZXRhaWxDaGFuZ2VMb2cucHVzaChjaGFuZ2VMb2cpO1xuICB9XG5cbiAgLy8gZ2V0IHRoZSBkZXZpY2UgZGF0YSByZWNvcmQgYW5kIGluaXRpYWxpc2UgdGhlIGZvcm1cbiAgcHJpdmF0ZSBsb2FkRGV2aWNlRGF0YSgpIHtcbiAgICB0aGlzLnNoYXJlZC5nZXREZXZpY2VEYXRhKFxuICAgICAgdGhpcy5jb25maWcuZGV2aWNlRGF0YU1vZGVsSWQsXG4gICAgICB0aGlzLmNvbmZpZy5vd25lcnNbMF0udXNlcklkLFxuICAgICAgcHJvcGVydHlDb2Rlc1xuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5kZXZpY2VEYXRhSWQgPSByZXMuZGV2aWNlRGF0YUlkO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1Nlc3Npb24gPSBKU09OLnBhcnNlKHJlcy5kYXRhWydSZWNvcmRpbmdTZXNzaW9uJ10udmFsdWUpO1xuICAgICAgICB0aGlzLmluaXRpYWxpc2VGb3JtKHRoaXMuZXh0cmFjdEZpZWxkcyh0aGlzLnJlY29yZGluZ1Nlc3Npb24pKTtcbiAgICAgICAgLy8gY2hlY2tpbmcgZm9yIHVuZGVmaW5lZCBpbiBjYXNlIG5vIGNoYW5nZXMgaGF2ZSBiZWVuIGxvZ2dlZCB5ZXRcbiAgICAgICAgdGhpcy5kZXRhaWxDaGFuZ2VMb2cgPSByZXMuZGF0YVsnVXNlckRldGFpbENoYW5nZUxvZyddID09PSB1bmRlZmluZWQgPyBbXSA6IHJlcy5kYXRhWydVc2VyRGV0YWlsQ2hhbmdlTG9nJ10udmFsdWU7XG5cbiAgICAgICAgdGhpcy5zdGF0dXMgPSByZXMuZGF0YVsnU3RhdHVzJ10/LnZhbHVlID09PSAnR2VuZXJhdGluZyBSZXBvcnQnID9cbiAgICAgICAgICAnZ2VuZXJhdGluZycgOlxuICAgICAgICAgICdzdWNjZXNzJztcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gXCJlcnJvclwiO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVnZW5SZXBvcnQoKSB7XG4gICAgdGhpcy5wb3N0RGV2aWNlRGF0YShcbiAgICAgIGRldmljZURhdGFQcm9wZXJ0eVNldElkLFxuICAgICAgeyAnQWxnb3JpdGhtaGFzcnVuJzogZmFsc2UsICdBbGdvcml0aG1SdW4nOiB0cnVlIH1cbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXR1cyA9ICdnZW5lcmF0aW5nJzsgLy8gYXNzdW1lIHJlcG9ydCBzdGFydHMgZ2VuZXJhdGluZyBpbW1lZGlhdGVseVxuICAgIH0pXG4gIH1cblxuICByZXNldE1vZGlmaWNhdGlvbnMoKSB7XG4gICAgdGhpcy5mb3JtR3JvdXAucGF0Y2hWYWx1ZSh0aGlzLmluaXRpYWxGb3JtU3RhdGUpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZz8ub3duZXJzPy5bMF0/LnVzZXJJZCkge1xuICAgICAgdGhpcy5zdGF0dXMgPSAnbm91c2VyJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWREZXZpY2VEYXRhKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ2Vycm9yJ1wiPlxuICAgIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGdldCB0aGUgZGV0YWlscy5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJzdGF0dXNcIiAqbmdJZj1cInN0YXR1cyA9PT0gJ25vdXNlcidcIj5cbiAgICBUaGVyZSBpcyBubyB1c2VyIHNwZWNpZmllZCBhcyB0aGUgZGF0YSBvd25lci5cbiAgPC9kaXY+XG4gIDxmb3JtICpuZ0lmPVwic3RhdHVzICE9PSAnZXJyb3InICYmIHN0YXR1cyAhPT0gJ25vdXNlcidcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChuZ1N1Ym1pdCk9XCJzYXZlTW9kaWZpY2F0aW9ucygpXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0c1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJkb2JcIj5EYXRlIG9mIEJpcnRoOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cImRvYlwiIHR5cGU9XCJkYXRlXCIgZm9ybUNvbnRyb2xOYW1lPVwiZG9iXCI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJ3ZWlnaHRcIj5QYXRpZW50IFdlaWdodCAoa2cpOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cIndlaWdodFwiIHR5cGU9XCJudW1iZXJcIiBmb3JtQ29udHJvbE5hbWU9XCJ3ZWlnaHRcIj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGZvcj1cImhlaWdodFwiPlBhdGllbnQgSGVpZ2h0IChjbSk6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiaGVpZ2h0XCIgdHlwZT1cIm51bWJlclwiIGZvcm1Db250cm9sTmFtZT1cImhlaWdodFwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWVhbFN0YXJ0XCI+TWVhbCBTdGFydCBUaW1lOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCBpZD1cIm1lYWxTdGFydFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGZvcm1Db250cm9sTmFtZT1cIm1lYWxTdGFydFwiPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICA8bGFiZWwgZm9yPVwibWVhbEVuZFwiPk1lYWwgRW5kIFRpbWU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwibWVhbEVuZFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIGZvcm1Db250cm9sTmFtZT1cIm1lYWxFbmRcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIiFmb3JtR3JvdXAudmFsaWQgJiYgZm9ybUdyb3VwLmRpcnR5XCIgY2xhc3M9XCJlcnJvcnNcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2YgZm9ybUdyb3VwLmNvbnRyb2xzIHwgZW50cmllc1wiPlxuICAgICAgICB7eyBwYXJzZUlucHV0RXJyb3JzKGNvbnRyb2xbMF0sIGNvbnRyb2xbMV0pIH19XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCJzdGF0dXMgPT09ICdnZW5lcmF0aW5nJ1wiIGNsYXNzPVwiaW5mb1wiPlxuICAgICAgPGRpdj5UaGUgcmVwb3J0IGlzIGdlbmVyYXRpbmcgYXQgdGhlIG1vbWVudCwgY2hlY2sgYmFjayBsYXRlciBpZiB5b3UgbmVlZCB0byBtb2RpZnkgdGhpcyBlbnRyeS48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVnZW5SZXBvcnQoKVwiIFtkaXNhYmxlZF09XCJzdGF0dXMgPT09ICdzZW5kaW5nJyB8fCBzdGF0dXMgPT09ICdnZW5lcmF0aW5nJyB8fCBzdGF0dXMgPT09ICdsb2FkaW5nJ1wiPlJlZ2VuZXJhdGUgUmVwb3J0PC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicmVzZXRNb2RpZmljYXRpb25zKClcIiBbZGlzYWJsZWRdPVwic3RhdHVzID09PSAnc2VuZGluZycgfHwgc3RhdHVzID09PSAnZ2VuZXJhdGluZycgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCI+Q2FuY2VsIE1vZGlmaWNhdGlvbjwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cInN0YXR1cyA9PT0gJ3NlbmRpbmcnIHx8IHN0YXR1cyA9PT0gJ2dlbmVyYXRpbmcnIHx8ICFmb3JtR3JvdXAudmFsaWQgfHwgZm9ybUdyb3VwLnByaXN0aW5lXCI+U2F2ZSBEZXRhaWxzPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbjwvZGl2PlxuIl19
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLWVkaXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZGV0YWlsLWVkaXQvc3JjL2xpYi9kZXRhaWwtZWRpdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXRhaWwtZWRpdC9zcmMvbGliL2RldGFpbC1lZGl0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7Ozs7QUFFMUYsTUFBTSxvQkFBb0IsR0FBRyxzQ0FBc0MsQ0FBQztBQUNwRSxNQUFNLHVCQUF1QixHQUFHLHNDQUFzQyxDQUFDO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixDQUFDLENBQUM7QUFNNUUsTUFBTSxPQUFPLG1CQUFtQjtJQXlCOUIsWUFBb0IsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQXRCekMsV0FBTSxHQUEwRSxTQUFTLENBQUM7UUFXMUYsY0FBUyxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ3hCLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNwRixNQUFNLEVBQUUsSUFBSSxXQUFXLENBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNsRyxNQUFNLEVBQUUsSUFBSSxXQUFXLENBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQVMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdELE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDNUQsRUFBRTtZQUNELGNBQWMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQztZQUMvQyxjQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUM7U0FDNUMsQ0FBQyxDQUFDO0lBRTBDLENBQUM7SUFFOUMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLE9BQXdCO1FBQ3JELE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsOEZBQThGO0lBQ3RGLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ2pDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsa0RBQWtEO0lBQzFDLGFBQWEsQ0FBQyxnQkFBcUM7UUFDekQsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUFHLGdCQUFnQixDQUFDO1FBQ3pFLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXJDLE9BQU87WUFDTCxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXO1lBQzNCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsU0FBUyxFQUFFLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztZQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDO1NBQ25DLENBQUE7SUFDSCxDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQWE7UUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUVoQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLENBQUMsOEJBQThCO1FBQzdELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnREFBZ0Q7SUFDeEMsZUFBZSxDQUFDLElBQWlDLEVBQUUsZ0JBQXFDO1FBQzlGLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztRQUNyQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDN0IsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUvQixnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELGdCQUFnQixDQUFDLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQixPQUFPO1lBQ0wsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2xCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7WUFDcEQscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGVBQWU7U0FDNUMsQ0FBQTtJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsbUJBQTJCLEVBQUUsSUFBWTtRQUM5RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUM3QixJQUFJLENBQUMsWUFBWSxFQUNqQixtQkFBbUIsRUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUM1QixJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsaUJBQWlCO1FBQ2YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFeEYsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDeEIsUUFBUSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxpQkFBaUIsQ0FBQztZQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDO1NBQ3RFLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUM5QixDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBaUM7UUFDdkQsTUFBTSxhQUFhLEdBQXlDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBeUMsRUFBRSxDQUFDO1FBRTlELHdDQUF3QztRQUN4QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUN0QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzVDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hELFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDL0I7U0FDRjtRQUVELE1BQU0sU0FBUyxHQUFHO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7WUFDckMsYUFBYSxFQUFFLGFBQWE7WUFDNUIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUE7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQscURBQXFEO0lBQzdDLGNBQWM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFDNUIsYUFBYSxDQUNkLENBQUMsU0FBUyxDQUFDO1lBQ1YsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxpRUFBaUU7Z0JBQ2pFLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUVsSCxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxLQUFLLG1CQUFtQixDQUFDLENBQUM7b0JBQy9ELFlBQVksQ0FBQyxDQUFDO29CQUNkLFNBQVMsQ0FBQztZQUNkLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDYixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUN4QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsY0FBYyxDQUNqQix1QkFBdUIsRUFDdkIsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUNuRCxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxDQUFDLDhDQUE4QztRQUM1RSxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUU7WUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDdkIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25FLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7O2lIQXZMVSxtQkFBbUI7cUdBQW5CLG1CQUFtQixxRkNmaEMsMHdFQW9EQTs0RkRyQ2EsbUJBQW1CO2tCQUovQixTQUFTOytCQUNFLGlCQUFpQjtvR0FJbEIsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29uZmlnLCBTaGFyZWRTZXJ2aWNlLCBVc2VyIH0gZnJvbSAnc2hhcmVkJztcbmltcG9ydCB7IGdldEFnZSwgZ2xvYmFsaXNlRGF0ZVRpbWUsIGxvY2FsaXNlRGF0ZVRpbWUsIHNoYWxsb3dDb21wYXJlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBkYXRlQ29tcGFyaXNvbiwgd2l0aGluTlllYXJzLCB3aXRoaW5OSG91cnMsIHRyYW5zbGF0ZUVycm9yIH0gZnJvbSAnLi92YWxpZGF0b3JzJztcblxuY29uc3QgYXBwRGF0YVByb3BlcnR5U2V0SWQgPSAnMzRkNDY0NzctYWQ0Yi00N2I0LWI1NTUtMDYzNThiOTJmNjBjJztcbmNvbnN0IGRldmljZURhdGFQcm9wZXJ0eVNldElkID0gJzdhMzJkODUxLTVlODktNDZhNi1hNGI2LWNjYTE2MmRhY2UyOSc7XG5jb25zdCBwcm9wZXJ0eUNvZGVzID0gWydSZWNvcmRpbmdTZXNzaW9uJywgJ1N0YXR1cycsICdVc2VyRGV0YWlsQ2hhbmdlTG9nJ107XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1kZXRhaWwtZWRpdCcsIHRlbXBsYXRlVXJsOiAnLi9kZXRhaWwtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RldGFpbC1lZGl0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZXRhaWxFZGl0Q29tcG9uZW50IHtcbiAgQElucHV0KCkgY29uZmlnITogQ29uZmlnO1xuXG4gIHN0YXR1czogJ2Vycm9yJyB8ICdsb2FkaW5nJyB8ICdzdWNjZXNzJyB8ICdnZW5lcmF0aW5nJyB8ICdzZW5kaW5nJyB8ICdub3VzZXInID0gJ2xvYWRpbmcnO1xuXG4gIC8vIHBvcHVsYXRlZCBieSBsb2FkIHJlcXVlc3RcbiAgcHJpdmF0ZSBkZXZpY2VEYXRhSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWNvcmRpbmdTZXNzaW9uOiBvYmplY3Q7XG4gIHByaXZhdGUgcmVjb3JkaW5nU3RhcnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBpbml0aWFsRm9ybVN0YXRlOiBvYmplY3Q7XG4gIHByaXZhdGUgZGV0YWlsQ2hhbmdlTG9nOiBvYmplY3RbXTtcbiAgcHJpdmF0ZSBjdXJyZW50VXNlcjogVXNlcjtcbiAgcHJpdmF0ZSBvd25lcjogVXNlcjtcblxuICBmb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBkb2I6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+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
@@ -212,7 +212,7 @@ class DetailEditComponent {
212
212
  const { patient, mealStart, mealEnd, recordingStart } = recordingSession;
213
213
  this.recordingStart = recordingStart;
214
214
  return {
215
- dob: this.config.owners[0].dateOfBirth,
215
+ dob: this.owner.dateOfBirth,
216
216
  height: patient.height,
217
217
  weight: patient.weight,
218
218
  mealStart: localiseDateTime(mealStart),
@@ -267,7 +267,7 @@ class DetailEditComponent {
267
267
  }
268
268
  }
269
269
  const changeLog = {
270
- author: this.config.currentUser.emailAddress,
270
+ author: this.currentUser.emailAddress,
271
271
  prevChangeLog: prevChangeLog,
272
272
  newChangeLog: newChangeLog,
273
273
  timestamp: new Date().toISOString()
@@ -308,6 +308,12 @@ class DetailEditComponent {
308
308
  this.status = 'nouser';
309
309
  return;
310
310
  }
311
+ this.shared.getUser(this.config.currentUser.userId).subscribe(user => {
312
+ this.currentUser = user;
313
+ });
314
+ this.shared.getUser(this.config.owners[0].userId).subscribe(owner => {
315
+ this.owner = owner;
316
+ });
311
317
  this.loadDeviceData();
312
318
  }
313
319
  }
@@ -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, switchMap, tap } from 'rxjs';\nimport { Config, SharedService } 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\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.config.owners[0].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.config.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\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","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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"}
@@ -212,7 +212,7 @@ class DetailEditComponent {
212
212
  const { patient, mealStart, mealEnd, recordingStart } = recordingSession;
213
213
  this.recordingStart = recordingStart;
214
214
  return {
215
- dob: this.config.owners[0].dateOfBirth,
215
+ dob: this.owner.dateOfBirth,
216
216
  height: patient.height,
217
217
  weight: patient.weight,
218
218
  mealStart: localiseDateTime(mealStart),
@@ -267,7 +267,7 @@ class DetailEditComponent {
267
267
  }
268
268
  }
269
269
  const changeLog = {
270
- author: this.config.currentUser.emailAddress,
270
+ author: this.currentUser.emailAddress,
271
271
  prevChangeLog: prevChangeLog,
272
272
  newChangeLog: newChangeLog,
273
273
  timestamp: new Date().toISOString()
@@ -306,6 +306,12 @@ class DetailEditComponent {
306
306
  this.status = 'nouser';
307
307
  return;
308
308
  }
309
+ this.shared.getUser(this.config.currentUser.userId).subscribe(user => {
310
+ this.currentUser = user;
311
+ });
312
+ this.shared.getUser(this.config.owners[0].userId).subscribe(owner => {
313
+ this.owner = owner;
314
+ });
309
315
  this.loadDeviceData();
310
316
  }
311
317
  }
@@ -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, switchMap, tap } from 'rxjs';\nimport { Config, SharedService } 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\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.config.owners[0].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.config.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\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","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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"}
@@ -10,6 +10,8 @@ export declare class DetailEditComponent {
10
10
  private recordingStart;
11
11
  private initialFormState;
12
12
  private detailChangeLog;
13
+ private currentUser;
14
+ private owner;
13
15
  formGroup: FormGroup<{
14
16
  dob: FormControl<string>;
15
17
  height: FormControl<number>;
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "alimetry-detail-edit",
3
- "version": "0.0.1",
3
+ "version": "1.0.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^15.2.0",
6
- "@angular/core": "^15.2.0"
6
+ "@angular/core": "^15.2.0",
7
+ "alimetry-shared": "^1.0.0"
7
8
  },
8
9
  "dependencies": {
9
10
  "tslib": "^2.3.0"