openchs-models 1.31.87 → 1.31.88

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.
@@ -7,6 +7,10 @@ exports.default = void 0;
7
7
 
8
8
  var _BaseEntity = _interopRequireDefault(require("./BaseEntity"));
9
9
 
10
+ var _Dashboard = _interopRequireDefault(require("./Dashboard"));
11
+
12
+ var _General = _interopRequireDefault(require("./utility/General"));
13
+
10
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
15
 
12
16
  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; }
@@ -16,14 +20,6 @@ class CustomDashboardCache extends _BaseEntity.default {
16
20
  super(that);
17
21
  }
18
22
 
19
- get checksum() {
20
- return this.that.checksum;
21
- }
22
-
23
- set checksum(x) {
24
- this.that.checksum = x;
25
- }
26
-
27
23
  get updatedAt() {
28
24
  return this.that.updatedAt;
29
25
  }
@@ -48,84 +44,59 @@ class CustomDashboardCache extends _BaseEntity.default {
48
44
  this.that.filterApplied = x;
49
45
  }
50
46
 
51
- get filterErrorsJSON() {
52
- return this.that.filterErrorsJSON;
53
- }
54
-
55
- set filterErrorsJSON(x) {
56
- this.that.filterErrorsJSON = x;
57
- }
58
-
59
- get ruleInputJSON() {
60
- return this.that.ruleInputJSON;
47
+ get dashboard() {
48
+ return this.toEntity("dashboard", _Dashboard.default);
61
49
  }
62
50
 
63
- set ruleInputJSON(x) {
64
- this.that.ruleInputJSON = x;
51
+ set dashboard(x) {
52
+ this.that.dashboard = this.fromObject(x);
65
53
  }
66
54
 
67
- get transformedFiltersJSON() {
68
- return this.that.transformedFiltersJSON;
55
+ get dashboardFiltersHash() {
56
+ return this.that.dashboardFiltersHash;
69
57
  }
70
58
 
71
- set transformedFiltersJSON(x) {
72
- this.that.transformedFiltersJSON = x;
59
+ set dashboardFiltersHash(x) {
60
+ this.that.dashboardFiltersHash = x;
73
61
  }
74
62
 
75
- static create(uuid, checksum, updatedAt, selectedValuesJSON, filterApplied, filterErrorsJSON, ruleInputJSON, transformedFiltersJSON) {
63
+ static create(uuid, updatedAt, selectedValuesJSON = '{}', filterApplied) {
76
64
  const customDashboardCache = new CustomDashboardCache();
77
65
  customDashboardCache.uuid = uuid;
78
- customDashboardCache.checksum = checksum;
79
66
  customDashboardCache.updatedAt = updatedAt;
80
67
  customDashboardCache.selectedValuesJSON = selectedValuesJSON;
81
68
  customDashboardCache.filterApplied = filterApplied;
82
- customDashboardCache.filterErrorsJSON = filterErrorsJSON;
83
- customDashboardCache.ruleInputJSON = ruleInputJSON;
84
- customDashboardCache.transformedFiltersJSON = transformedFiltersJSON;
85
69
  return customDashboardCache;
86
70
  }
87
71
 
88
- static getSelectedValuesFromState(state) {
89
- const filterCache = {
90
- date: state.date,
91
- applied: false,
92
- selectedLocations: state.selectedLocations,
93
- selectedCustomFilters: state.selectedCustomFilters,
94
- selectedGenders: state.selectedGenders
95
- };
96
- return filterCache;
97
- }
98
-
99
- static createEmptyInstance() {
100
- return new CustomDashboardCache();
72
+ static newInstance(dashboard, dashboardFiltersHash) {
73
+ const customDashboardCache = new CustomDashboardCache();
74
+ customDashboardCache.uuid = _General.default.randomUUID();
75
+ customDashboardCache.dashboard = dashboard;
76
+ customDashboardCache.reset(dashboardFiltersHash);
77
+ return customDashboardCache;
101
78
  }
102
79
 
103
- getChecksum() {
104
- return this.checksum;
80
+ reset(dashboardFiltersHash) {
81
+ this.filterApplied = false;
82
+ this.selectedValuesJSON = JSON.stringify({});
83
+ this.dashboardFiltersHash = dashboardFiltersHash;
84
+ this.updatedAt = new Date();
105
85
  }
106
86
 
107
87
  getSelectedValues() {
108
- return this.selectedValuesJSON && JSON.parse(this.selectedValuesJSON) || {};
109
- }
110
-
111
- getFilterErrors() {
112
- return this.filterErrorsJSON && JSON.parse(this.filterErrorsJSON) || {};
113
- }
114
-
115
- getRuleInput() {
116
- return this.ruleInputJSON && JSON.parse(this.ruleInputJSON) || {
117
- ruleInputArray: null
118
- };
88
+ return JSON.parse(this.selectedValuesJSON);
119
89
  }
120
90
 
121
- getTransformedFilters() {
122
- return this.transformedFiltersJSON && JSON.parse(this.transformedFiltersJSON) || {
123
- date: new Date(),
124
- applied: false,
125
- selectedLocations: [],
126
- selectedCustomFilters: [],
127
- selectedGenders: []
128
- };
91
+ clone() {
92
+ const customDashboardCache = new CustomDashboardCache();
93
+ customDashboardCache.uuid = this.uuid;
94
+ customDashboardCache.dashboard = this.dashboard;
95
+ customDashboardCache.updatedAt = this.updatedAt;
96
+ customDashboardCache.selectedValuesJSON = this.selectedValuesJSON;
97
+ customDashboardCache.filterApplied = this.filterApplied;
98
+ customDashboardCache.dashboardFiltersHash = this.dashboardFiltersHash;
99
+ return customDashboardCache;
129
100
  }
130
101
 
131
102
  }
@@ -135,16 +106,11 @@ _defineProperty(CustomDashboardCache, "schema", {
135
106
  primaryKey: "uuid",
136
107
  properties: {
137
108
  uuid: "string",
138
- checksum: "string",
109
+ dashboard: "Dashboard",
139
110
  updatedAt: "date",
140
111
  selectedValuesJSON: "string",
141
- filterApplied: {
142
- type: "bool",
143
- default: false
144
- },
145
- filterErrorsJSON: "string",
146
- ruleInputJSON: "string",
147
- transformedFiltersJSON: "string"
112
+ filterApplied: "bool",
113
+ dashboardFiltersHash: "string"
148
114
  }
149
115
  });
150
116
 
@@ -41,7 +41,9 @@ _defineProperty(CustomFilter, "type", {
41
41
  EncounterDate: "EncounterDate",
42
42
  Address: "Address",
43
43
  Concept: "Concept",
44
- GroupSubject: "GroupSubject"
44
+ GroupSubject: "GroupSubject",
45
+ SubjectType: "SubjectType",
46
+ AsOnDate: "AsOnDate"
45
47
  });
46
48
 
47
49
  _defineProperty(CustomFilter, "scope", {
package/dist/Dashboard.js CHANGED
@@ -36,6 +36,14 @@ class Dashboard extends _BaseEntity.default {
36
36
  this.that.description = x;
37
37
  }
38
38
 
39
+ get filters() {
40
+ return this.toEntityList("filters", _DashboardFilter.default);
41
+ }
42
+
43
+ set filters(x) {
44
+ this.that.filters = this.fromEntityList(x);
45
+ }
46
+
39
47
  static fromResource(resource) {
40
48
  return _General.default.assignFields(resource, new Dashboard(), ["uuid", "name", "description", "voided"]);
41
49
  }
@@ -9,8 +9,6 @@ var _General = _interopRequireDefault(require("./utility/General"));
9
9
 
10
10
  var _BaseEntity = _interopRequireDefault(require("./BaseEntity"));
11
11
 
12
- var _lodash = _interopRequireDefault(require("lodash"));
13
-
14
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
13
 
16
14
  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; }
@@ -69,7 +67,7 @@ class MediaQueue extends _BaseEntity.default {
69
67
  }
70
68
 
71
69
  static create(entityUUID, entityName, fileName, type, entityTargetField, conceptUUID, uuid = _General.default.randomUUID()) {
72
- const mediaQueue = new MediaQueue();
70
+ var mediaQueue = new MediaQueue();
73
71
  mediaQueue.entityUUID = entityUUID;
74
72
  mediaQueue.uuid = uuid;
75
73
  mediaQueue.entityName = entityName;
@@ -92,18 +90,6 @@ class MediaQueue extends _BaseEntity.default {
92
90
  return mediaQueueItem;
93
91
  }
94
92
 
95
- getDisplayText() {
96
- // generate safe to string
97
- let str = "";
98
- if (!_lodash.default.isNil(this.entityName)) str += "EntityName: " + this.entityName + ", ";
99
- if (!_lodash.default.isNil(this.entityUUID)) str += "EntityUUID: " + this.entityUUID + ", ";
100
- if (!_lodash.default.isNil(this.entityTargetField)) str += "EntityTargetField: " + this.entityTargetField + ", ";
101
- if (!_lodash.default.isNil(this.fileName)) str += "FileName: " + this.fileName + ", ";
102
- if (!_lodash.default.isNil(this.type)) str += "Type: " + this.type + ", ";
103
- if (!_lodash.default.isNil(this.conceptUUID)) str += "ConceptUUID: " + this.conceptUUID;
104
- return str;
105
- }
106
-
107
93
  }
108
94
 
109
95
  _defineProperty(MediaQueue, "schema", {
@@ -21,19 +21,16 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
21
21
 
22
22
  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; }
23
23
 
24
- const clone = function (concept, valueJSON, abnormal) {
24
+ const clone = function (concept, valueJSON) {
25
25
  const observation = new Observation();
26
26
  observation.concept = concept;
27
27
  observation.valueJSON = valueJSON;
28
- observation.abnormal = abnormal;
29
28
  return observation;
30
29
  };
31
30
 
32
31
  class Observation extends _PersistedObject.default {
33
32
  constructor(that = null) {
34
33
  super(that);
35
-
36
- _defineProperty(this, "abnormal", void 0);
37
34
  }
38
35
 
39
36
  get concept() {
@@ -52,11 +49,10 @@ class Observation extends _PersistedObject.default {
52
49
  this.that.valueJSON = x;
53
50
  }
54
51
 
55
- static create(concept, value, abnormal = false) {
52
+ static create(concept, value) {
56
53
  const observation = new Observation();
57
54
  observation.concept = concept;
58
55
  observation.valueJSON = value;
59
- observation.abnormal = abnormal;
60
56
  return observation;
61
57
  }
62
58
 
@@ -15,15 +15,26 @@ var _StandardReportCardType = _interopRequireDefault(require("./StandardReportCa
15
15
 
16
16
  var _lodash = _interopRequireDefault(require("lodash"));
17
17
 
18
+ var _SubjectType = _interopRequireDefault(require("./SubjectType"));
19
+
20
+ var _Program = _interopRequireDefault(require("./Program"));
21
+
22
+ var _EncounterType = _interopRequireDefault(require("./EncounterType"));
23
+
18
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
25
 
20
26
  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; }
21
27
 
22
- function throwInvalidIndexError(index, reportCardsLength) {
23
- throw new Error(`Invalid index ${index} specified for reportCard with length ${reportCardsLength}`);
24
- }
25
-
26
28
  class ReportCard extends _BaseEntity.default {
29
+ static newReportCard() {
30
+ const reportCard = new ReportCard();
31
+ reportCard.standardReportCardInputSubjectTypes = [];
32
+ reportCard.standardReportCardInputPrograms = [];
33
+ reportCard.standardReportCardInputEncounterTypes = [];
34
+ reportCard.standardReportCardInputRecentDuration = null;
35
+ return reportCard;
36
+ }
37
+
27
38
  constructor(that = null) {
28
39
  super(that);
29
40
  }
@@ -96,6 +107,38 @@ class ReportCard extends _BaseEntity.default {
96
107
  get textColor() {
97
108
  return _lodash.default.isNil(this.standardReportCardType) ? '#ffffff' : this.standardReportCardType.textColor;
98
109
  }
110
+
111
+ get standardReportCardInputSubjectTypes() {
112
+ return this.toEntityList("standardReportCardInputSubjectTypes", _SubjectType.default);
113
+ }
114
+
115
+ set standardReportCardInputSubjectTypes(x) {
116
+ this.that.standardReportCardInputSubjectTypes = this.fromEntityList(x);
117
+ }
118
+
119
+ get standardReportCardInputPrograms() {
120
+ return this.toEntityList("standardReportCardInputPrograms", _Program.default);
121
+ }
122
+
123
+ set standardReportCardInputPrograms(x) {
124
+ this.that.standardReportCardInputPrograms = this.fromEntityList(x);
125
+ }
126
+
127
+ get standardReportCardInputEncounterTypes() {
128
+ return this.toEntityList("standardReportCardInputEncounterTypes", _EncounterType.default);
129
+ }
130
+
131
+ set standardReportCardInputEncounterTypes(x) {
132
+ this.that.standardReportCardInputEncounterTypes = this.fromEntityList(x);
133
+ }
134
+
135
+ get standardReportCardInputRecentDurationJSON() {
136
+ return JSON.parse(this.that.standardReportCardInputRecentDurationJSON);
137
+ }
138
+
139
+ set standardReportCardInputRecentDurationJSON(x) {
140
+ this.that.standardReportCardInputRecentDurationJSON = x;
141
+ }
99
142
  /**
100
143
  * Helper method used to generate unique key value for Nested Report Cards using UUID and Index of the Report Card.
101
144
  * The Nested Report Card's query responses would be mapped to the corresponding Dashboard Report cards using the UUID and Index.
@@ -122,9 +165,19 @@ class ReportCard extends _BaseEntity.default {
122
165
  }
123
166
 
124
167
  static fromResource(resource, entityService) {
125
- const reportCard = _General.default.assignFields(resource, new ReportCard(), ["uuid", "name", "query", "description", "colour", "voided", "nested", "countOfCards"]);
168
+ const reportCard = _General.default.assignFields(resource, ReportCard.newReportCard(), ["uuid", "name", "query", "description", "colour", "voided", "nested", "countOfCards"]);
126
169
 
127
170
  reportCard.standardReportCardType = entityService.findByKey("uuid", _ResourceUtil.default.getUUIDFor(resource, "standardReportCardUUID"), _StandardReportCardType.default.schema.name);
171
+ resource.standardReportCardInputSubjectTypes.forEach(uuid => {
172
+ reportCard.standardReportCardInputSubjectTypes.push(entityService.findByUUID(uuid, _SubjectType.default.schema.name));
173
+ });
174
+ resource.standardReportCardInputPrograms.forEach(uuid => {
175
+ reportCard.standardReportCardInputPrograms.push(entityService.findByUUID(uuid, _Program.default.schema.name));
176
+ });
177
+ resource.standardReportCardInputEncounterTypes.forEach(uuid => {
178
+ reportCard.standardReportCardInputEncounterTypes.push(entityService.findByUUID(uuid, _EncounterType.default.schema.name));
179
+ });
180
+ reportCard.standardReportCardInputRecentDurationJSON = resource.standardReportCardInputRecentDuration;
128
181
  return reportCard;
129
182
  }
130
183
 
@@ -132,6 +185,18 @@ class ReportCard extends _BaseEntity.default {
132
185
  return _lodash.default.isNil(this.standardReportCardType) ? false : this.standardReportCardType.isTaskType();
133
186
  }
134
187
 
188
+ isStandardReportType() {
189
+ return !_lodash.default.isNil(this.standardReportCardType);
190
+ }
191
+
192
+ isSubjectTypeFilterSupported() {
193
+ return this.isStandardReportType() && this.standardReportCardType.isSubjectTypeFilterSupported();
194
+ }
195
+
196
+ isRecentType() {
197
+ return this.isStandardReportType() && this.standardReportCardType.isRecentType();
198
+ }
199
+
135
200
  }
136
201
 
137
202
  _defineProperty(ReportCard, "schema", {
@@ -166,8 +231,24 @@ _defineProperty(ReportCard, "schema", {
166
231
  type: "int",
167
232
  default: 1,
168
233
  optional: true
169
- } //Used only by nested ReportCards
170
-
234
+ },
235
+ //Used only by nested ReportCards
236
+ standardReportCardInputSubjectTypes: {
237
+ type: "list",
238
+ objectType: "SubjectType"
239
+ },
240
+ standardReportCardInputPrograms: {
241
+ type: "list",
242
+ objectType: "Program"
243
+ },
244
+ standardReportCardInputEncounterTypes: {
245
+ type: "list",
246
+ objectType: "EncounterType"
247
+ },
248
+ standardReportCardInputRecentDurationJSON: {
249
+ type: "string",
250
+ optional: true
251
+ }
171
252
  }
172
253
  });
173
254
 
package/dist/Schema.js CHANGED
@@ -279,7 +279,7 @@ function createRealmConfig() {
279
279
  return doCompact;
280
280
  },
281
281
  //order is important, should be arranged according to the dependency
282
- schemaVersion: 190,
282
+ schemaVersion: 193,
283
283
  onMigration: function (oldDB, newDB) {
284
284
  console.log("[AvniModels.Schema]", `Running migration with old schema version: ${oldDB.schemaVersion} and new schema version: ${newDB.schemaVersion}`);
285
285
  if (oldDB.schemaVersion === VersionWithEmbeddedMigrationProblem) throw new Error(`Update from schema version ${VersionWithEmbeddedMigrationProblem} is not allowed. Please uninstall and install app.`);
@@ -913,6 +913,10 @@ function createRealmConfig() {
913
913
  if (oldDB.schemaVersion < 190) {// PlaceHolder for SubjectType.User changes, so that people with previous version of client
914
914
  // are not able to use fastSync of version 190 and above
915
915
  }
916
+
917
+ if (oldDB.schemaVersion < 191) {
918
+ newDB.delete(newDB.objects("CustomDashboardCache"));
919
+ }
916
920
  }
917
921
  };
918
922
  }
@@ -81,7 +81,7 @@ class StandardReportCardType extends _BaseEntity.default {
81
81
  }
82
82
 
83
83
  defaultTypes() {
84
- return [StandardReportCardType.type.ScheduledVisits, StandardReportCardType.type.OverdueVisits, StandardReportCardType.type.LatestRegistrations, StandardReportCardType.type.LatestEnrolments, StandardReportCardType.type.LatestVisits, StandardReportCardType.type.Total];
84
+ return [StandardReportCardType.type.ScheduledVisits, StandardReportCardType.type.OverdueVisits, StandardReportCardType.type.RecentRegistrations, StandardReportCardType.type.RecentEnrolments, StandardReportCardType.type.RecentVisits, StandardReportCardType.type.Total];
85
85
  }
86
86
 
87
87
  isApprovalType() {
@@ -118,6 +118,14 @@ class StandardReportCardType extends _BaseEntity.default {
118
118
  return typeToStatusMap[this.name];
119
119
  }
120
120
 
121
+ isSubjectTypeFilterSupported() {
122
+ return [StandardReportCardType.type.ScheduledVisits, StandardReportCardType.type.OverdueVisits, StandardReportCardType.type.RecentRegistrations, StandardReportCardType.type.RecentEnrolments, StandardReportCardType.type.RecentVisits].includes(this.name);
123
+ }
124
+
125
+ isRecentType() {
126
+ return [StandardReportCardType.type.RecentRegistrations, StandardReportCardType.type.RecentEnrolments, StandardReportCardType.type.RecentVisits].includes(this.name);
127
+ }
128
+
121
129
  }
122
130
 
123
131
  _defineProperty(StandardReportCardType, "schema", {
@@ -143,9 +151,9 @@ _defineProperty(StandardReportCardType, "type", {
143
151
  Rejected: "Rejected",
144
152
  ScheduledVisits: "Scheduled visits",
145
153
  OverdueVisits: "Overdue visits",
146
- LatestRegistrations: "Last 24 hours registrations",
147
- LatestEnrolments: "Last 24 hours enrolments",
148
- LatestVisits: "Last 24 hours visits",
154
+ RecentRegistrations: "Recent registrations",
155
+ RecentEnrolments: "Recent enrolments",
156
+ RecentVisits: "Recent visits",
149
157
  Total: "Total",
150
158
  Comments: "Comments",
151
159
  CallTasks: "Call tasks",
@@ -153,6 +161,8 @@ _defineProperty(StandardReportCardType, "type", {
153
161
  DueChecklist: "Due checklist"
154
162
  });
155
163
 
164
+ _defineProperty(StandardReportCardType, "recentCardDurationUnits", ["days", "weeks", "months"]);
165
+
156
166
  const typeToStatusMap = {
157
167
  [StandardReportCardType.type.PendingApproval]: _ApprovalStatus.default.statuses.Pending,
158
168
  [StandardReportCardType.type.Approved]: _ApprovalStatus.default.statuses.Approved,
package/dist/index.js CHANGED
@@ -789,6 +789,18 @@ Object.defineProperty(exports, "JSONStringify", {
789
789
  return _JsonStringify.JSONStringify;
790
790
  }
791
791
  });
792
+ Object.defineProperty(exports, "Locations", {
793
+ enumerable: true,
794
+ get: function () {
795
+ return _Locations.default;
796
+ }
797
+ });
798
+ Object.defineProperty(exports, "Range", {
799
+ enumerable: true,
800
+ get: function () {
801
+ return _Range.default;
802
+ }
803
+ });
792
804
 
793
805
  var _AbstractEncounter = _interopRequireDefault(require("./AbstractEncounter"));
794
806
 
@@ -1042,6 +1054,10 @@ var _DashboardCacheFilter = _interopRequireDefault(require("./application/Dashbo
1042
1054
 
1043
1055
  var _JsonStringify = require("./utility/JsonStringify");
1044
1056
 
1057
+ var _Locations = _interopRequireDefault(require("./location/Locations"));
1058
+
1059
+ var _Range = _interopRequireDefault(require("./reports/Range"));
1060
+
1045
1061
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
1046
1062
 
1047
1063
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _lodash = _interopRequireDefault(require("lodash"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ // AddressLevel = Location
13
+ class Locations {
14
+ static getUniqueLevels(locations) {
15
+ return _lodash.default.uniq(locations.map(x => x.level));
16
+ }
17
+
18
+ }
19
+
20
+ var _default = Locations;
21
+ exports.default = _default;
@@ -13,11 +13,23 @@ var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
14
  var _DateTimeUtil = _interopRequireDefault(require("../utility/DateTimeUtil"));
15
15
 
16
+ var _Range = _interopRequireDefault(require("./Range"));
17
+
18
+ var _Gender = _interopRequireDefault(require("../Gender"));
19
+
20
+ var _AddressLevel = _interopRequireDefault(require("../AddressLevel"));
21
+
22
+ var _Individual = _interopRequireDefault(require("../Individual"));
23
+
16
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
25
 
18
26
  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; }
19
27
 
20
28
  const widgetConceptDataTypes = [_Concept.default.dataType.Date, _Concept.default.dataType.DateTime, _Concept.default.dataType.Time, _Concept.default.dataType.Numeric];
29
+ const conceptEntityTypes = {
30
+ [_Concept.default.dataType.Coded]: _Concept.default.schema.name,
31
+ [_Concept.default.dataType.Location]: _AddressLevel.default.schema.name
32
+ };
21
33
 
22
34
  class ObservationBasedFilter {
23
35
  constructor() {
@@ -42,6 +54,15 @@ class ObservationBasedFilter {
42
54
  return !_lodash.default.isNil(concept) && (!_lodash.default.isEmpty(programs) || !_lodash.default.isEmpty(encounterTypes) || this.scope === _CustomFilter.default.scope.Registration);
43
55
  }
44
56
 
57
+ isMultiEntityType() {
58
+ return [_Concept.default.dataType.Coded, _Concept.default.dataType.Location].includes(this.concept.datatype);
59
+ }
60
+
61
+ getEntityType() {
62
+ if (this.isMultiEntityType()) return conceptEntityTypes[this.concept.datatype];
63
+ throw new Error("Unsupported concept data type for getting entity type: " + this.concept.datatype);
64
+ }
65
+
45
66
  toServerRequest() {
46
67
  return {
47
68
  scope: this.scope,
@@ -107,10 +128,29 @@ class GroupSubjectTypeFilter {
107
128
  }
108
129
 
109
130
  exports.GroupSubjectTypeFilter = GroupSubjectTypeFilter;
110
- const dateFilterTypes = [_CustomFilter.default.type.RegistrationDate, _CustomFilter.default.type.EnrolmentDate, _CustomFilter.default.type.EncounterDate, _CustomFilter.default.type.ProgramEncounterDate];
131
+ const dateFilterTypes = [_CustomFilter.default.type.RegistrationDate, _CustomFilter.default.type.EnrolmentDate, _CustomFilter.default.type.EncounterDate, _CustomFilter.default.type.ProgramEncounterDate, _CustomFilter.default.type.AsOnDate];
132
+ const entityTypes = {
133
+ [_CustomFilter.default.type.Gender]: _Gender.default.schema.name,
134
+ [_CustomFilter.default.type.Address]: _AddressLevel.default.schema.name,
135
+ [_CustomFilter.default.type.GroupSubject]: _Individual.default.schema.name
136
+ };
137
+
138
+ function isDateDataType(dashboardFilterConfig) {
139
+ return dateFilterTypes.includes(dashboardFilterConfig.type) || dashboardFilterConfig.isConceptTypeFilter() && dashboardFilterConfig.observationBasedFilter.concept.datatype === _Concept.default.dataType.Date;
140
+ }
141
+
142
+ function isDateTimeDataType(dashboardFilterConfig) {
143
+ return dashboardFilterConfig.isConceptTypeFilter() && dashboardFilterConfig.observationBasedFilter.concept.datatype === _Concept.default.dataType.DateTime;
144
+ }
145
+
146
+ function isTimeDataType(dashboardFilterConfig) {
147
+ return dashboardFilterConfig.isConceptTypeFilter() && dashboardFilterConfig.observationBasedFilter.concept.datatype === _Concept.default.dataType.Time;
148
+ }
111
149
 
112
150
  class DashboardFilterConfig {
113
151
  constructor() {
152
+ _defineProperty(this, "subjectType", void 0);
153
+
114
154
  _defineProperty(this, "type", void 0);
115
155
 
116
156
  _defineProperty(this, "widget", void 0);
@@ -120,26 +160,104 @@ class DashboardFilterConfig {
120
160
  _defineProperty(this, "observationBasedFilter", void 0);
121
161
  }
122
162
 
163
+ toDisplayText() {
164
+ let s = `Type: ${this.type}.`;
165
+
166
+ if (this.isRangeWidget()) {
167
+ s += ` Widget: ${this.widget}.`;
168
+ }
169
+
170
+ if (this.isConceptTypeFilter()) {
171
+ s += ` Concept: ${this.observationBasedFilter.concept.name}. DataType: ${this.observationBasedFilter.concept.datatype}.`;
172
+ }
173
+
174
+ return s;
175
+ }
176
+
177
+ isRangeWidget() {
178
+ return this.widget === _CustomFilter.default.widget.Range;
179
+ }
180
+
123
181
  getInputDataType() {
124
182
  if (this.isConceptTypeFilter()) {
125
183
  return this.observationBasedFilter.concept.datatype;
126
- } else if (this.isGroupSubjectTypeFilter()) {
127
- return _Concept.default.dataType.Subject;
128
- } else if (dateFilterTypes.includes(this.type)) {
184
+ } else if ([_CustomFilter.default.type.Gender, _CustomFilter.default.type.Address, _CustomFilter.default.type.GroupSubject].includes(this.type)) {
185
+ return DashboardFilterConfig.dataTypes.array;
186
+ } else if (dateFilterTypes.includes(this.type) && !this.isRangeWidget()) {
129
187
  return _Concept.default.dataType.Date;
130
- } else {
131
- return this.type;
188
+ } else if (dateFilterTypes.includes(this.type) && this.isRangeWidget()) {
189
+ return _Range.default.DateRange;
190
+ } else if (this.type === _CustomFilter.default.type.SubjectType) {
191
+ return DashboardFilterConfig.dataTypes.formMetaData;
192
+ }
193
+
194
+ throw new Error("Unsupported filter type: " + this.type);
195
+ }
196
+
197
+ isDateFilterType() {
198
+ return isDateDataType(this) && !this.isRangeWidget();
199
+ }
200
+
201
+ isDateRangeFilterType() {
202
+ return isDateDataType(this) && this.isRangeWidget();
203
+ }
204
+
205
+ isDateTimeFilterType() {
206
+ return isDateTimeDataType(this) && !this.isRangeWidget();
207
+ }
208
+
209
+ isDateTimeRangeFilterType() {
210
+ return isDateTimeDataType(this) && this.isRangeWidget();
211
+ }
212
+
213
+ isTimeFilterType() {
214
+ return isTimeDataType(this) && !this.isRangeWidget();
215
+ }
216
+
217
+ isTimeRangeFilterType() {
218
+ return isTimeDataType(this) && this.isRangeWidget();
219
+ }
220
+
221
+ isNumericRangeFilterType() {
222
+ return this.isConceptTypeFilter() && this.observationBasedFilter.concept.datatype === _Concept.default.dataType.Numeric && this.isRangeWidget();
223
+ }
224
+
225
+ isDateLikeFilterType() {
226
+ return this.isDateFilterType() || this.isDateTimeFilterType() || this.isTimeFilterType();
227
+ }
228
+
229
+ isDateLikeRangeFilterType() {
230
+ return this.isDateRangeFilterType() || this.isDateTimeRangeFilterType() || this.isTimeRangeFilterType();
231
+ }
232
+
233
+ isMultiEntityType() {
234
+ return [_CustomFilter.default.type.Gender, _CustomFilter.default.type.Address, _CustomFilter.default.type.GroupSubject].includes(this.type) || this.isConceptTypeFilter() && this.observationBasedFilter.isMultiEntityType();
235
+ }
236
+
237
+ getEntityType() {
238
+ if (this.isMultiEntityType()) {
239
+ return _lodash.default.isNil(entityTypes[this.type]) ? this.observationBasedFilter.getEntityType() : entityTypes[this.type];
132
240
  }
241
+
242
+ throw new Error("Unsupported filter type: " + this.type);
133
243
  }
134
244
 
135
245
  isConceptTypeFilter() {
136
246
  return this.type === _CustomFilter.default.type.Concept;
137
247
  }
138
248
 
249
+ isNonCodedObservationDataType() {
250
+ return this.isConceptTypeFilter() && this.observationBasedFilter.concept.datatype !== _Concept.default.dataType.Coded;
251
+ }
252
+
139
253
  isGroupSubjectTypeFilter() {
140
254
  return this.type === _CustomFilter.default.type.GroupSubject;
141
255
  }
142
256
 
257
+ requiresSpecificSubjectType() {
258
+ return ![_CustomFilter.default.type.SubjectType, _CustomFilter.default.type.AsOnDate].includes(this.type);
259
+ }
260
+
143
261
  isValid() {
144
262
  const valid = !_lodash.default.isNil(this.type);
145
263
  if (!valid) return valid;
@@ -149,6 +267,7 @@ class DashboardFilterConfig {
149
267
  toServerRequest() {
150
268
  const request = {
151
269
  type: this.type,
270
+ subjectTypeUUID: this.subjectType && this.subjectType.uuid,
152
271
  widget: this.widget
153
272
  };
154
273
  if (this.isConceptTypeFilter()) request.observationBasedFilter = this.observationBasedFilter.toServerRequest();else if (this.isGroupSubjectTypeFilter()) request.groupSubjectTypeFilter = this.groupSubjectTypeFilter.toServerRequest();
@@ -175,6 +294,12 @@ class DashboardFilterConfig {
175
294
  return [RegistrationDate, EnrolmentDate, ProgramEncounterDate, EncounterDate].includes(this.type) || this.isConceptTypeFilter() && this.observationBasedFilter.isWidgetRequired();
176
295
  }
177
296
 
297
+ setSubjectType(subjectType) {
298
+ if (_lodash.default.get(subjectType, "uuid") !== _lodash.default.get(this.subjectType, "uuid")) {
299
+ this.subjectType = subjectType;
300
+ }
301
+ }
302
+
178
303
  willObservationBeInScopeOfProgramEnrolment() {
179
304
  return this.isConceptTypeFilter() && this.observationBasedFilter.willObservationBeInScopeOfProgramEnrolment();
180
305
  }
@@ -184,13 +309,11 @@ class DashboardFilterConfig {
184
309
  }
185
310
 
186
311
  validate(filterValue) {
187
- const inputDataType = this.getInputDataType();
188
-
189
- if ([_Concept.default.dataType.Date, _Concept.default.dataType.DateTime].includes(inputDataType) && this.widget === _CustomFilter.default.widget.Range) {
312
+ if (this.isDateRangeFilterType()) {
190
313
  return _DateTimeUtil.default.validateDateRange(filterValue.minValue, filterValue.maxValue);
191
314
  }
192
315
 
193
- if (_Concept.default.dataType.Time === inputDataType && this.widget === _CustomFilter.default.widget.Range) {
316
+ if (this.isTimeRangeFilterType()) {
194
317
  return _DateTimeUtil.default.validateTimeRange(filterValue.minValue, filterValue.maxValue);
195
318
  }
196
319
 
@@ -200,6 +323,7 @@ class DashboardFilterConfig {
200
323
  clone() {
201
324
  const clone = new DashboardFilterConfig();
202
325
  clone.type = this.type;
326
+ clone.subjectType = this.subjectType;
203
327
  clone.widget = this.widget;
204
328
  clone.groupSubjectTypeFilter = this.groupSubjectTypeFilter;
205
329
  clone.observationBasedFilter = this.observationBasedFilter;
@@ -208,5 +332,10 @@ class DashboardFilterConfig {
208
332
 
209
333
  }
210
334
 
335
+ _defineProperty(DashboardFilterConfig, "dataTypes", {
336
+ array: "array",
337
+ formMetaData: "formMetaData"
338
+ });
339
+
211
340
  var _default = DashboardFilterConfig;
212
341
  exports.default = _default;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _lodash = _interopRequireDefault(require("lodash"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
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
+
14
+ class Range {
15
+ constructor(minValue, maxValue) {
16
+ _defineProperty(this, "minValue", void 0);
17
+
18
+ _defineProperty(this, "maxValue", void 0);
19
+
20
+ this.minValue = minValue;
21
+ this.maxValue = maxValue;
22
+ }
23
+
24
+ static empty() {
25
+ return new Range(null, null);
26
+ }
27
+
28
+ isEmpty() {
29
+ return _lodash.default.isNil(this.minValue) || _lodash.default.isNil(this.maxValue);
30
+ }
31
+
32
+ }
33
+
34
+ _defineProperty(Range, "DateRange", "DateRange");
35
+
36
+ var _default = Range;
37
+ exports.default = _default;
@@ -99,6 +99,10 @@ class MetaDataService {
99
99
  return _lodash.default.filter(formMappings, formMapping => formMapping.formType === _Form.default.formTypes.ProgramEncounter || formMapping.formType === _Form.default.formTypes.ProgramEncounterCancellation);
100
100
  }
101
101
 
102
+ static getProgramEncounterFormMappingsForFormType(formMappings, formType) {
103
+ return _lodash.default.filter(formMappings, formMapping => formMapping.formType === formType);
104
+ }
105
+
102
106
  static getProgramsForSubjectType(allPrograms, subjectType, formMappings) {
103
107
  if (_lodash.default.isNil(subjectType)) return allPrograms;
104
108
 
@@ -116,9 +120,9 @@ class MetaDataService {
116
120
  }
117
121
 
118
122
  static getEncounterTypesForPrograms(allEncounterTypes, programs, formMappings) {
119
- const programEncounterTypeMappings = MetaDataService.getProgramEncounterFormMappings(formMappings);
123
+ const programEncounterTypeMappings = MetaDataService.getProgramEncounterFormMappingsForFormType(formMappings, _Form.default.formTypes.ProgramEncounter);
120
124
 
121
- const encounterTypeMappingsForPrograms = _lodash.default.intersectionWith(programEncounterTypeMappings, programs, (etMapping, program) => etMapping.programUUID === program.uuid);
125
+ const encounterTypeMappingsForPrograms = _lodash.default.filter(programEncounterTypeMappings, formMapping => _lodash.default.some(programs, program => formMapping.programUUID === program.uuid));
122
126
 
123
127
  return encounterTypeMappingsForPrograms.map(x => _lodash.default.find(allEncounterTypes, et => et.uuid === x.encounterTypeUUID));
124
128
  }
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.31.87",
4
+ "version": "1.31.88",
5
5
  "private": false,
6
6
  "repository": {
7
7
  "type": "git",