openchs-models 1.13.0 → 1.16.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.
@@ -186,6 +186,10 @@ class AbstractEncounter extends _BaseEntity.default {
186
186
  return (0, _Media.findMediaObservations)(_ObservationsHolder.default.clone(this.observations), _ObservationsHolder.default.clone(this.cancelObservations));
187
187
  }
188
188
 
189
+ replaceMediaObservation(originalValue, newValue, conceptUUID) {
190
+ new _ObservationsHolder.default(this.observations).replaceMediaObservation(originalValue, newValue, conceptUUID);
191
+ }
192
+
189
193
  replaceObservation(originalValue, newValue) {
190
194
  new _ObservationsHolder.default(this.observations).updateObservationBasedOnValue(originalValue, newValue);
191
195
  new _ObservationsHolder.default(this.cancelObservations).updateObservationBasedOnValue(originalValue, newValue);
package/dist/Concept.js CHANGED
@@ -189,7 +189,7 @@ class Concept {
189
189
  }
190
190
 
191
191
  getValueWrapperFor(obsValue) {
192
- if (this.isCodedConcept() || this.isSubjectConcept()) {
192
+ if (this.isCodedConcept() || this.isSubjectConcept() || this.isMediaConcept()) {
193
193
  return _lodash.default.isArray(obsValue) ? new _MultipleCodedValues.default(obsValue) : new _SingleCodedValue.default(obsValue);
194
194
  }
195
195
 
@@ -224,6 +224,10 @@ class Concept {
224
224
  return this.isType(Concept.dataType.Subject);
225
225
  }
226
226
 
227
+ isMediaConcept() {
228
+ return _lodash.default.includes([Concept.dataType.Image, Concept.dataType.Video, Concept.dataType.File], this.datatype);
229
+ }
230
+
227
231
  isDurationConcept() {
228
232
  return this.isType(Concept.dataType.Duration);
229
233
  }
@@ -241,7 +245,7 @@ class Concept {
241
245
  }
242
246
 
243
247
  isPrimitive() {
244
- return [Concept.dataType.Text, Concept.dataType.Time, Concept.dataType.Numeric, Concept.dataType.Video, Concept.dataType.Image, Concept.dataType.Audio, Concept.dataType.Date, Concept.dataType.DateTime, Concept.dataType.Location, Concept.dataType.File].includes(this.datatype);
248
+ return [Concept.dataType.Text, Concept.dataType.Time, Concept.dataType.Numeric, Concept.dataType.Audio, Concept.dataType.Date, Concept.dataType.DateTime, Concept.dataType.Location].includes(this.datatype);
245
249
  }
246
250
 
247
251
  getAnswers() {
package/dist/Family.js CHANGED
@@ -50,7 +50,7 @@ class Family extends _BaseEntity.default {
50
50
  }
51
51
 
52
52
  get toResource() {
53
- const resource = _lodash.default.pick(this, ["uuid", "firstName", "lastName", "dateOfBirthVerified"]);
53
+ const resource = _lodash.default.pick(this, ["uuid", "firstName", "lastName", "profilePicture", "dateOfBirthVerified"]);
54
54
 
55
55
  resource.dateOfBirth = (0, _moment.default)(this.dateOfBirth).format("YYYY-MM-DD");
56
56
  resource.registrationDate = (0, _moment.default)(this.registrationDate).format("YYYY-MM-DD");
@@ -67,7 +67,7 @@ class Family extends _BaseEntity.default {
67
67
  const addressLevel = entityService.findByKey("uuid", _ResourceUtil.default.getUUIDFor(individualResource, "addressUUID"), _AddressLevel.default.schema.name);
68
68
  const gender = entityService.findByKey("uuid", _ResourceUtil.default.getUUIDFor(individualResource, "genderUUID"), _Gender.default.schema.name);
69
69
 
70
- const individual = _General.default.assignFields(individualResource, new _Individual.default(), ["uuid", "firstName", "lastName", "dateOfBirthVerified"], ["dateOfBirth", "registrationDate"], ["observations"], entityService);
70
+ const individual = _General.default.assignFields(individualResource, new _Individual.default(), ["uuid", "firstName", "lastName", "profilePicture", "dateOfBirthVerified"], ["dateOfBirth", "registrationDate"], ["observations"], entityService);
71
71
 
72
72
  individual.gender = gender;
73
73
  individual.lowestAddressLevel = addressLevel;
@@ -85,6 +85,8 @@ class Individual extends _BaseEntity.default {
85
85
 
86
86
  _defineProperty(this, "lastName", void 0);
87
87
 
88
+ _defineProperty(this, "profilePicture", void 0);
89
+
88
90
  _defineProperty(this, "dateOfBirthVerified", void 0);
89
91
 
90
92
  _defineProperty(this, "latestEntityApprovalStatus", void 0);
@@ -127,7 +129,7 @@ class Individual extends _BaseEntity.default {
127
129
  }
128
130
 
129
131
  get toResource() {
130
- const resource = _lodash.default.pick(this, ["uuid", "firstName", "lastName", "dateOfBirthVerified", "voided"]);
132
+ const resource = _lodash.default.pick(this, ["uuid", "firstName", "lastName", "profilePicture", "dateOfBirthVerified", "voided"]);
131
133
 
132
134
  resource.dateOfBirth = this.dateOfBirth ? (0, _moment.default)(this.dateOfBirth).format("YYYY-MM-DD") : null;
133
135
  resource.registrationDate = (0, _moment.default)(this.registrationDate).format("YYYY-MM-DD");
@@ -154,11 +156,12 @@ class Individual extends _BaseEntity.default {
154
156
  return this.nonVoidedEnrolments().find(enrolment => enrolment.findLatestObservationInEntireEnrolment(conceptNameOrUuid) !== undefined);
155
157
  }
156
158
 
157
- static newInstance(uuid, firstName, lastName, dateOfBirth, dateOfBirthVerified, gender, lowestAddressLevel, subjectType) {
159
+ static newInstance(uuid, firstName, lastName, dateOfBirth, dateOfBirthVerified, gender, lowestAddressLevel, subjectType, profilePicture) {
158
160
  const individual = new Individual();
159
161
  individual.uuid = uuid;
160
162
  individual.firstName = firstName;
161
163
  individual.lastName = lastName;
164
+ individual.profilePicture = profilePicture;
162
165
  individual.subjectType = subjectType;
163
166
  individual.name = individual.nameString;
164
167
  individual.dateOfBirth = dateOfBirth;
@@ -173,7 +176,7 @@ class Individual extends _BaseEntity.default {
173
176
  const gender = entityService.findByKey("uuid", _ResourceUtil.default.getUUIDFor(individualResource, "genderUUID"), _Gender.default.schema.name);
174
177
  const subjectType = entityService.findByKey("uuid", _ResourceUtil.default.getUUIDFor(individualResource, "subjectTypeUUID"), _SubjectType.default.schema.name);
175
178
 
176
- const individual = _General.default.assignFields(individualResource, new Individual(), ["uuid", "firstName", "lastName", "dateOfBirthVerified", "voided"], ["dateOfBirth", "registrationDate"], ["observations"], entityService);
179
+ const individual = _General.default.assignFields(individualResource, new Individual(), ["uuid", "firstName", "lastName", "profilePicture", "dateOfBirthVerified", "voided"], ["dateOfBirth", "registrationDate"], ["observations"], entityService);
177
180
 
178
181
  individual.gender = gender;
179
182
  individual.lowestAddressLevel = addressLevel;
@@ -460,6 +463,7 @@ class Individual extends _BaseEntity.default {
460
463
  individual.name = this.name;
461
464
  individual.firstName = this.firstName;
462
465
  individual.lastName = this.lastName;
466
+ individual.profilePicture = this.profilePicture;
463
467
  individual.dateOfBirth = this.dateOfBirth;
464
468
  individual.registrationDate = this.registrationDate;
465
469
  individual.dateOfBirthVerified = this.dateOfBirthVerified;
@@ -485,6 +489,7 @@ class Individual extends _BaseEntity.default {
485
489
  individual.name = this.name;
486
490
  individual.firstName = this.firstName;
487
491
  individual.lastName = this.lastName;
492
+ individual.profilePicture = this.profilePicture;
488
493
  individual.dateOfBirth = this.dateOfBirth;
489
494
  individual.gender = _lodash.default.isNil(this.gender) ? null : this.gender.clone();
490
495
  return individual;
@@ -600,10 +605,22 @@ class Individual extends _BaseEntity.default {
600
605
  return _lodash.default.sortBy(this.nonVoidedEnrolments(), enrolment => enrolment.encounterDateTime);
601
606
  }
602
607
 
608
+ getProfilePicture() {
609
+ return this.profilePicture;
610
+ }
611
+
612
+ updateProfilePicture(newValue) {
613
+ this.profilePicture = newValue;
614
+ }
615
+
603
616
  findMediaObservations() {
604
617
  return (0, _Media.findMediaObservations)(this.observations);
605
618
  }
606
619
 
620
+ replaceMediaObservation(originalValue, newValue, conceptUUID) {
621
+ new _ObservationsHolder.default(this.observations).replaceMediaObservation(originalValue, newValue, conceptUUID);
622
+ }
623
+
607
624
  replaceObservation(originalValue, newValue) {
608
625
  new _ObservationsHolder.default(this.observations).updateObservationBasedOnValue(originalValue, newValue);
609
626
  } //TODO use polymorphism to avoid if checks based on this
@@ -784,6 +801,7 @@ class Individual extends _BaseEntity.default {
784
801
  uuid: this.uuid,
785
802
  firstName: this.firstName,
786
803
  lastName: this.lastName,
804
+ profilePicture: this.profilePicture,
787
805
  enrolments: this.enrolments,
788
806
  dateOfBirth: this.dateOfBirth,
789
807
  gender: this.gender,
@@ -816,6 +834,10 @@ _defineProperty(Individual, "schema", {
816
834
  type: "string",
817
835
  optional: true
818
836
  },
837
+ profilePicture: {
838
+ type: "string",
839
+ optional: true
840
+ },
819
841
  dateOfBirth: {
820
842
  type: "date",
821
843
  optional: true
@@ -878,6 +900,7 @@ _defineProperty(Individual, "validationKeys", {
878
900
  GENDER: "GENDER",
879
901
  FIRST_NAME: "FIRST_NAME",
880
902
  LAST_NAME: "LAST_NAME",
903
+ PROFILE_PICTURE: "PROFILE_PICTURE",
881
904
  REGISTRATION_DATE: "REGISTRATION_DATE",
882
905
  LOWEST_ADDRESS_LEVEL: "LOWEST_ADDRESS_LEVEL",
883
906
  REGISTRATION_LOCATION: "REGISTRATION_LOCATION",
@@ -12,13 +12,15 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
12
12
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
13
 
14
14
  class MediaQueue {
15
- static create(entityUUID, entityName, fileName, type, uuid = _General.default.randomUUID()) {
15
+ static create(entityUUID, entityName, fileName, type, entityTargetField, conceptUUID, uuid = _General.default.randomUUID()) {
16
16
  var mediaQueue = new MediaQueue();
17
17
  mediaQueue.entityUUID = entityUUID;
18
18
  mediaQueue.uuid = uuid;
19
19
  mediaQueue.entityName = entityName;
20
+ mediaQueue.entityTargetField = entityTargetField;
20
21
  mediaQueue.fileName = fileName;
21
22
  mediaQueue.type = type;
23
+ mediaQueue.conceptUUID = conceptUUID;
22
24
  return mediaQueue;
23
25
  }
24
26
 
@@ -27,8 +29,10 @@ class MediaQueue {
27
29
  mediaQueueItem.uuid = this.uuid;
28
30
  mediaQueueItem.entityUUID = this.entityUUID;
29
31
  mediaQueueItem.entityName = this.entityName;
32
+ mediaQueueItem.entityTargetField = this.entityTargetField;
30
33
  mediaQueueItem.fileName = this.fileName;
31
34
  mediaQueueItem.type = this.type;
35
+ mediaQueueItem.conceptUUID = this.conceptUUID;
32
36
  return mediaQueueItem;
33
37
  }
34
38
 
@@ -41,8 +45,13 @@ _defineProperty(MediaQueue, "schema", {
41
45
  uuid: "string",
42
46
  entityUUID: "string",
43
47
  entityName: "string",
48
+ entityTargetField: "string",
44
49
  fileName: "string",
45
- type: "string"
50
+ type: "string",
51
+ conceptUUID: {
52
+ type: "string",
53
+ optional: true
54
+ }
46
55
  }
47
56
  });
48
57
 
@@ -57,6 +57,8 @@ class Observation {
57
57
  if (observation.concept.datatype === _Concept.default.dataType.Subject) {
58
58
  const subject = subjectService.findByUUID(valueWrapper.getValue());
59
59
  return [new _Displayable.default(subject.nameStringWithUniqueAttribute, subject)];
60
+ } else if (_Concept.default.dataType.Media.includes(observation.concept.datatype)) {
61
+ return new _Displayable.default(valueWrapper.getValue(), null);
60
62
  } else {
61
63
  return new _Displayable.default(i18n.t(conceptService.getConceptByUUID(valueWrapper.getConceptUUID()).name), null);
62
64
  }
@@ -66,6 +68,8 @@ class Observation {
66
68
  const subject = subjectService.findByUUID(uuid);
67
69
  return new _Displayable.default(subject.nameStringWithUniqueAttribute, subject);
68
70
  });
71
+ } else if (_Concept.default.dataType.Media.includes(observation.concept.datatype)) {
72
+ return new _Displayable.default(valueWrapper.getValue(), null);
69
73
  } else {
70
74
  return new _Displayable.default(_lodash.default.join(valueWrapper.getValue().map(value => {
71
75
  return i18n.t(conceptService.getConceptByUUID(value).name);
@@ -25,6 +25,8 @@ var _Identifier = _interopRequireDefault(require("./Identifier"));
25
25
 
26
26
  var _QuestionGroup = _interopRequireDefault(require("./observation/QuestionGroup"));
27
27
 
28
+ var _General = _interopRequireDefault(require("./utility/General"));
29
+
28
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
31
 
30
32
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
@@ -334,6 +336,50 @@ class ObservationsHolder {
334
336
  }
335
337
  }
336
338
 
339
+ replaceMediaObservation(oldValue, newValue, conceptUUID) {
340
+ if (_lodash.default.isNil(conceptUUID)) {
341
+ return this.updateObservationBasedOnValue(oldValue, newValue);
342
+ }
343
+
344
+ const observation = _lodash.default.find(this.observations, observation => observation.concept.uuid === conceptUUID);
345
+
346
+ if (observation) {
347
+ const valueWrapper = observation.getValueWrapper();
348
+
349
+ if (valueWrapper.isMultipleCoded) {
350
+ const answers = valueWrapper.getValue();
351
+
352
+ const oldValueIndex = _lodash.default.indexOf(answers, oldValue);
353
+
354
+ const newAnswers = _lodash.default.reject(answers, answer => answer === oldValue);
355
+
356
+ newAnswers.splice(oldValueIndex, 0, newValue);
357
+ observation.valueJSON = new _MultipleCodedValues.default(newAnswers);
358
+ } else {
359
+ observation.valueJSON = new _SingleCodedValue.default(newValue);
360
+ }
361
+ }
362
+ }
363
+
364
+ migrateMultiSelectMediaObservations(form) {
365
+ _lodash.default.forEach(form.nonVoidedFormElementGroups(), feg => {
366
+ _lodash.default.forEach(feg.getFormElements(), fe => {
367
+ const concept = fe.concept;
368
+ const observation = this.getObservation(concept);
369
+
370
+ if (_lodash.default.includes(_Concept.default.dataType.Media, fe.getType()) && observation && fe.isMultiSelect()) {
371
+ const valueWrapper = observation.getValueWrapper();
372
+
373
+ if (!_lodash.default.isArray(valueWrapper.getValue())) {
374
+ _General.default.logDebug("ObservationHolder", `Found string value ${valueWrapper.getValue()} for multi select media element, doing migration`);
375
+
376
+ observation.valueJSON = new _MultipleCodedValues.default([valueWrapper.getValue()]);
377
+ }
378
+ }
379
+ });
380
+ });
381
+ }
382
+
337
383
  toString(I18n) {
338
384
  let display = "";
339
385
  this.observations.forEach(obs => {
@@ -453,6 +453,10 @@ class ProgramEnrolment extends _BaseEntity.default {
453
453
  return (0, _Media.findMediaObservations)(_ObservationsHolder.default.clone(this.observations), _ObservationsHolder.default.clone(this.programExitObservations));
454
454
  }
455
455
 
456
+ replaceMediaObservation(originalValue, newValue, conceptUUID) {
457
+ new _ObservationsHolder.default(this.observations).replaceMediaObservation(originalValue, newValue, conceptUUID);
458
+ }
459
+
456
460
  replaceObservation(originalValue, newValue) {
457
461
  new _ObservationsHolder.default(this.observations).updateObservationBasedOnValue(originalValue, newValue);
458
462
  new _ObservationsHolder.default(this.programExitObservations).updateObservationBasedOnValue(originalValue, newValue);
package/dist/Schema.js CHANGED
@@ -168,7 +168,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
168
168
  var _default = {
169
169
  //order is important, should be arranged according to the dependency
170
170
  schema: [_LocaleMapping.default, _Settings.default, _Concept.ConceptAnswer, _Concept.default, _EncounterType.default, _Gender.default, _UserDefinedIndividualProperty.default, _AddressLevel.LocationMapping, _AddressLevel.default, _KeyValue.default, _Form.default, _FormMapping.default, _FormElementGroup.default, _FormElement.default, _SubjectType.default, _Individual.default, _ProgramOutcome.default, _Program.default, _ProgramEnrolment.default, _Observation.default, _ProgramEncounter.default, _Encounter.default, _EntitySyncStatus.default, _EntityQueue.default, _ConfigFile.default, _Checklist.default, _ChecklistItem.default, _Format.default, _UserInfo.default, _StringKeyNumericValue.default, _VisitScheduleInterval.default, _VisitScheduleConfig.default, _ProgramConfig.default, _Family.default, _IndividualRelation.default, _IndividualRelationGenderMapping.default, _IndividualRelationshipType.default, _IndividualRelationship.default, _RuleDependency.default, _Rule.default, _ChecklistItemStatus.default, _ChecklistDetail.default, _ChecklistItemDetail.default, _VideoTelemetric.default, _Video.default, _MediaQueue.default, _Point.default, _SyncTelemetry.default, _IdentifierSource.default, _IdentifierAssignment.default, _RuleFailureTelemetry.default, _BeneficiaryModePin.default, _OrganisationConfig.default, _PlatformTranslation.default, _Translation.default, _Groups.default, _MyGroups.default, _GroupPrivileges.default, _Privilege.default, _GroupRole.default, _GroupSubject.default, _DashboardCache.default, _LocationHierarchy.default, _ReportCard.default, _Dashboard.default, _DashboardSectionCardMapping.default, _DraftSubject.default, _StandardReportCardType.default, _ApprovalStatus.default, _EntityApprovalStatus.default, _GroupDashboard.default, _DashboardSection.default, _News.default, _Comment.default, _CommentThread.default, _Extension.default, _SubjectMigration.default],
171
- schemaVersion: 151,
171
+ schemaVersion: 153,
172
172
  migration: function (oldDB, newDB) {
173
173
  if (oldDB.schemaVersion < 10) {
174
174
  var oldObjects = oldDB.objects("DecisionConfig");
@@ -612,6 +612,16 @@ var _default = {
612
612
  individual.groups = groups;
613
613
  });
614
614
  }
615
+
616
+ if (oldDB.schemaVersion < 152) {
617
+ _lodash.default.forEach(newDB.objects(_MediaQueue.default.schema.name), mediaQueueItem => {
618
+ mediaQueueItem.entityTargetField = "observations";
619
+ });
620
+
621
+ _lodash.default.forEach(newDB.objects(_SubjectType.default.schema.name), sub => {
622
+ sub.allowProfilePicture = false;
623
+ });
624
+ }
615
625
  }
616
626
  };
617
627
  exports.default = _default;
@@ -29,6 +29,8 @@ class SubjectType extends _ReferenceEntity.default {
29
29
 
30
30
  _defineProperty(this, "allowEmptyLocation", void 0);
31
31
 
32
+ _defineProperty(this, "allowProfilePicture", void 0);
33
+
32
34
  _defineProperty(this, "uniqueName", void 0);
33
35
 
34
36
  _defineProperty(this, "validFirstNameFormat", void 0);
@@ -58,6 +60,7 @@ class SubjectType extends _ReferenceEntity.default {
58
60
  subjectType.type = operationalSubjectType.type;
59
61
  subjectType.subjectSummaryRule = operationalSubjectType.subjectSummaryRule;
60
62
  subjectType.uniqueName = operationalSubjectType.uniqueName;
63
+ subjectType.allowProfilePicture = operationalSubjectType.allowProfilePicture;
61
64
  subjectType.validFirstNameFormat = _Format.default.fromResource(operationalSubjectType["validFirstNameFormat"]);
62
65
  subjectType.validLastNameFormat = _Format.default.fromResource(operationalSubjectType["validLastNameFormat"]);
63
66
  subjectType.iconFileS3Key = operationalSubjectType.iconFileS3Key;
@@ -78,6 +81,7 @@ class SubjectType extends _ReferenceEntity.default {
78
81
  cloned.type = this.type;
79
82
  cloned.subjectSummaryRule = this.subjectSummaryRule;
80
83
  cloned.allowEmptyLocation = this.allowEmptyLocation;
84
+ cloned.allowProfilePicture = this.allowProfilePicture;
81
85
  cloned.uniqueName = this.uniqueName;
82
86
  cloned.validFirstNameFormat = this.validFirstNameFormat;
83
87
  cloned.validLastNameFormat = this.validLastNameFormat;
@@ -165,6 +169,10 @@ _defineProperty(SubjectType, "schema", {
165
169
  type: "string",
166
170
  optional: true
167
171
  },
172
+ allowProfilePicture: {
173
+ type: 'bool',
174
+ default: false
175
+ },
168
176
  nameHelpText: {
169
177
  type: "string",
170
178
  optional: true
@@ -20,6 +20,7 @@ class DraftSubject {
20
20
  draftSubject.subjectType = subject.subjectType;
21
21
  draftSubject.firstName = subject.firstName;
22
22
  draftSubject.lastName = subject.lastName;
23
+ draftSubject.profilePicture = subject.profilePicture;
23
24
  draftSubject.dateOfBirth = subject.dateOfBirth;
24
25
  draftSubject.registrationDate = subject.registrationDate;
25
26
  draftSubject.dateOfBirthVerified = subject.dateOfBirthVerified;
@@ -38,6 +39,7 @@ class DraftSubject {
38
39
  individual.subjectType = this.subjectType.clone();
39
40
  individual.firstName = this.firstName;
40
41
  individual.lastName = this.lastName;
42
+ individual.profilePicture = this.profilePicture;
41
43
  individual.dateOfBirth = this.dateOfBirth;
42
44
  individual.registrationDate = this.registrationDate;
43
45
  individual.dateOfBirthVerified = this.dateOfBirthVerified;
@@ -66,6 +68,10 @@ _defineProperty(DraftSubject, "schema", {
66
68
  type: "string",
67
69
  optional: true
68
70
  },
71
+ profilePicture: {
72
+ type: "string",
73
+ optional: true
74
+ },
69
75
  dateOfBirth: {
70
76
  type: "date",
71
77
  optional: true
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "openchs-models",
3
3
  "description": "OpenCHS data model to be used by front end clients",
4
- "version": "1.13.0",
4
+ "version": "1.16.0",
5
5
  "private": false,
6
6
  "repository": {
7
7
  "type": "git",