openchs-models 1.29.3 → 1.29.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Makefile CHANGED
@@ -27,7 +27,11 @@ copy-dist-to-avni-client:
27
27
  deploy-to-avni-client-only:
28
28
  $(call _deploy,../avni-client/packages/openchs-android/node_modules/openchs-models)
29
29
 
30
+ deploy-to-avni-web-only:
31
+ $(call _deploy,../avni-webapp/node_modules/openchs-models)
32
+
30
33
  deploy-to-avni-client: build deploy-to-avni-client-only
34
+ deploy-to-avni-web: build deploy-to-avni-web-only
31
35
 
32
36
  deploy-to-avni-project: build
33
37
  $(if $(local),$(call _deploy,$(local)/node_modules/openchs-models))
@@ -5,9 +5,30 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
 
8
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
9
+
10
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
11
+
8
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; }
9
13
 
10
- class CustomFilter {}
14
+ class CustomFilter {
15
+ static getDashboardFilterTypes() {
16
+ const clonedTypes = _objectSpread({}, CustomFilter.type);
17
+
18
+ delete clonedTypes.Name;
19
+ delete clonedTypes.Age;
20
+ delete clonedTypes.SearchAll;
21
+ return clonedTypes;
22
+ }
23
+
24
+ static getDashboardFilterWidgets() {
25
+ const cloned = _objectSpread({}, CustomFilter.widget);
26
+
27
+ delete cloned.Relative;
28
+ return cloned;
29
+ }
30
+
31
+ }
11
32
 
12
33
  _defineProperty(CustomFilter, "type", {
13
34
  Name: "Name",
@@ -191,6 +191,31 @@ class FormMapping extends _BaseEntity.default {
191
191
  }
192
192
  }
193
193
 
194
+ get programUUID() {
195
+ return this.entityUUID;
196
+ }
197
+
198
+ set programUUID(x) {
199
+ this.entityUUID = x;
200
+ }
201
+
202
+ get encounterTypeUUID() {
203
+ return this.observationsTypeEntityUUID;
204
+ }
205
+
206
+ set encounterTypeUUID(x) {
207
+ this.observationsTypeEntityUUID = x;
208
+ } // created for legacy reasons because the web app doesn't construct the domain model in the same way
209
+
210
+
211
+ get subjectTypeUUID() {
212
+ return this.subjectType.uuid;
213
+ }
214
+
215
+ get formType() {
216
+ return this.form.formType;
217
+ }
218
+
194
219
  }
195
220
 
196
221
  _defineProperty(FormMapping, "schema", {
package/dist/index.js CHANGED
@@ -753,6 +753,30 @@ Object.defineProperty(exports, "getUnderlyingRealmObject", {
753
753
  return _RealmCollectionHelper.getUnderlyingRealmObject;
754
754
  }
755
755
  });
756
+ Object.defineProperty(exports, "DashboardFilterConfig", {
757
+ enumerable: true,
758
+ get: function () {
759
+ return _DashboardFilterConfig.default;
760
+ }
761
+ });
762
+ Object.defineProperty(exports, "GroupSubjectTypeFilter", {
763
+ enumerable: true,
764
+ get: function () {
765
+ return _DashboardFilterConfig.GroupSubjectTypeFilter;
766
+ }
767
+ });
768
+ Object.defineProperty(exports, "ObservationBasedFilter", {
769
+ enumerable: true,
770
+ get: function () {
771
+ return _DashboardFilterConfig.ObservationBasedFilter;
772
+ }
773
+ });
774
+ Object.defineProperty(exports, "MetaDataService", {
775
+ enumerable: true,
776
+ get: function () {
777
+ return _MetaDataService.default;
778
+ }
779
+ });
756
780
 
757
781
  var _AbstractEncounter = _interopRequireDefault(require("./AbstractEncounter"));
758
782
 
@@ -1002,4 +1026,12 @@ var _ArrayHelper = _interopRequireDefault(require("./framework/ArrayHelper"));
1002
1026
 
1003
1027
  var _RealmCollectionHelper = require("./framework/RealmCollectionHelper");
1004
1028
 
1029
+ var _DashboardFilterConfig = _interopRequireWildcard(require("./reports/DashboardFilterConfig"));
1030
+
1031
+ var _MetaDataService = _interopRequireDefault(require("./service/MetaDataService"));
1032
+
1033
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
1034
+
1035
+ 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; }
1036
+
1005
1037
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -54,7 +54,8 @@ _defineProperty(DashboardFilter, "schema", {
54
54
  properties: {
55
55
  uuid: "string",
56
56
  dashboard: "Dashboard",
57
- filter: "string",
57
+ name: "string",
58
+ filterConfig: "string",
58
59
  voided: {
59
60
  type: "bool",
60
61
  default: false
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.GroupSubjectTypeFilter = exports.ObservationBasedFilter = void 0;
7
+
8
+ var _CustomFilter = _interopRequireDefault(require("../CustomFilter"));
9
+
10
+ var _Concept = _interopRequireDefault(require("../Concept"));
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
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; }
17
+
18
+ const widgetConceptDataTypes = [_Concept.default.dataType.Date, _Concept.default.dataType.DateTime, _Concept.default.dataType.Time, _Concept.default.dataType.Numeric];
19
+
20
+ class ObservationBasedFilter {
21
+ constructor() {
22
+ _defineProperty(this, "scope", void 0);
23
+
24
+ _defineProperty(this, "concept", void 0);
25
+
26
+ _defineProperty(this, "programs", void 0);
27
+
28
+ _defineProperty(this, "encounterTypes", void 0);
29
+
30
+ this.programs = [];
31
+ this.encounterTypes = [];
32
+ }
33
+
34
+ isValid() {
35
+ const {
36
+ concept,
37
+ programs,
38
+ encounterTypes
39
+ } = this;
40
+ return !_lodash.default.isNil(concept) && (!_lodash.default.isEmpty(programs) || !_lodash.default.isEmpty(encounterTypes) || this.scope === _CustomFilter.default.scope.Registration);
41
+ }
42
+
43
+ toServerRequest() {
44
+ return {
45
+ scope: this.scope,
46
+ conceptUUID: this.concept.uuid,
47
+ programUUIDs: this.programs.map(x => x.uuid),
48
+ encounterTypeUUIDs: this.encounterTypes.map(x => x.uuid)
49
+ };
50
+ }
51
+
52
+ isWidgetRequired() {
53
+ return widgetConceptDataTypes.includes(_lodash.default.get(this.concept, "dataType"));
54
+ }
55
+
56
+ setPrograms(programs) {
57
+ this.programs = programs;
58
+ }
59
+
60
+ setEncounterTypes(encounterTypes) {
61
+ this.encounterTypes = encounterTypes;
62
+ }
63
+
64
+ setScope(scope) {
65
+ if (this.scope !== scope) {
66
+ this.scope = scope;
67
+
68
+ if (!this.willObservationBeInScopeOfEncounter()) {
69
+ this.encounterTypes = [];
70
+ }
71
+
72
+ if (!this.willObservationBeInScopeOfProgramEnrolment()) {
73
+ this.programs = [];
74
+ }
75
+ }
76
+ }
77
+
78
+ willObservationBeInScopeOfProgramEnrolment() {
79
+ return [_CustomFilter.default.scope.ProgramEnrolment, _CustomFilter.default.scope.ProgramEncounter].includes(this.scope);
80
+ }
81
+
82
+ willObservationBeInScopeOfEncounter() {
83
+ return [_CustomFilter.default.scope.ProgramEncounter, _CustomFilter.default.scope.Encounter].includes(this.scope);
84
+ }
85
+
86
+ }
87
+
88
+ exports.ObservationBasedFilter = ObservationBasedFilter;
89
+
90
+ class GroupSubjectTypeFilter {
91
+ constructor() {
92
+ _defineProperty(this, "subjectType", void 0);
93
+ }
94
+
95
+ isValid() {
96
+ return !_lodash.default.isNil(this.subjectType);
97
+ }
98
+
99
+ toServerRequest() {
100
+ return {
101
+ subjectTypeUUID: this.subjectType.uuid
102
+ };
103
+ }
104
+
105
+ }
106
+
107
+ exports.GroupSubjectTypeFilter = GroupSubjectTypeFilter;
108
+
109
+ class DashboardFilterConfig {
110
+ constructor() {
111
+ _defineProperty(this, "subjectType", void 0);
112
+
113
+ _defineProperty(this, "type", void 0);
114
+
115
+ _defineProperty(this, "widget", void 0);
116
+
117
+ _defineProperty(this, "groupSubjectTypeFilter", void 0);
118
+
119
+ _defineProperty(this, "observationBasedFilter", void 0);
120
+ }
121
+
122
+ isConceptTypeFilter() {
123
+ return this.type === _CustomFilter.default.type.Concept;
124
+ }
125
+
126
+ isGroupSubjectTypeFilter() {
127
+ return this.type === _CustomFilter.default.type.GroupSubject;
128
+ }
129
+
130
+ isValid() {
131
+ const valid = !(_lodash.default.isNil(this.type) || _lodash.default.isNil(this.subjectType));
132
+ if (!valid) return valid;
133
+ if (this.isConceptTypeFilter()) return this.observationBasedFilter.isValid();else if (this.isGroupSubjectTypeFilter()) return this.groupSubjectTypeFilter.isValid();else if (this.isWidgetRequired()) return !_lodash.default.isNil(this.widget);else return true;
134
+ }
135
+
136
+ toServerRequest() {
137
+ const request = {
138
+ subjectTypeUUID: this.subjectType.uuid,
139
+ type: this.type,
140
+ widget: this.widget
141
+ };
142
+ if (this.isConceptTypeFilter()) request.observationBasedFilter = this.observationBasedFilter.toServerRequest();else if (this.isGroupSubjectTypeFilter()) request.groupSubjectTypeFilter = this.groupSubjectTypeFilter.toServerRequest();
143
+ return request;
144
+ }
145
+
146
+ setType(type) {
147
+ if (type !== this.type) {
148
+ this.type = type;
149
+ this.widget = null;
150
+ this.groupSubjectTypeFilter = type === _CustomFilter.default.type.GroupSubject ? new GroupSubjectTypeFilter() : null;
151
+ this.observationBasedFilter = type === _CustomFilter.default.type.Concept ? new ObservationBasedFilter() : null;
152
+ }
153
+ }
154
+
155
+ isWidgetRequired() {
156
+ const {
157
+ RegistrationDate,
158
+ EnrolmentDate,
159
+ ProgramEncounterDate,
160
+ EncounterDate
161
+ } = _CustomFilter.default.getDashboardFilterTypes();
162
+
163
+ return [RegistrationDate, EnrolmentDate, ProgramEncounterDate, EncounterDate].includes(this.type) || this.isConceptTypeFilter() && this.observationBasedFilter.isWidgetRequired();
164
+ }
165
+
166
+ setSubjectType(subjectType) {
167
+ if (_lodash.default.get(subjectType, "uuid") !== _lodash.default.get(this.subjectType, "uuid")) {
168
+ this.subjectType = subjectType;
169
+
170
+ if (!_lodash.default.isNil(this.observationBasedFilter)) {
171
+ this.observationBasedFilter.programs = [];
172
+ this.observationBasedFilter.encounterTypes = [];
173
+ } else if (!_lodash.default.isNil(this.groupSubjectTypeFilter)) {
174
+ this.groupSubjectTypeFilter.subjectType = null;
175
+ }
176
+ }
177
+ }
178
+
179
+ willObservationBeInScopeOfProgramEnrolment() {
180
+ return this.isConceptTypeFilter() && this.observationBasedFilter.willObservationBeInScopeOfProgramEnrolment();
181
+ }
182
+
183
+ willObservationBeInScopeOfEncounter() {
184
+ return this.isConceptTypeFilter() && this.observationBasedFilter.willObservationBeInScopeOfEncounter();
185
+ }
186
+
187
+ clone() {
188
+ const clone = new DashboardFilterConfig();
189
+ clone.type = this.type;
190
+ clone.subjectType = this.subjectType;
191
+ clone.widget = this.widget;
192
+ clone.groupSubjectTypeFilter = this.groupSubjectTypeFilter;
193
+ clone.observationBasedFilter = this.observationBasedFilter;
194
+ return clone;
195
+ }
196
+
197
+ }
198
+
199
+ var _default = DashboardFilterConfig;
200
+ exports.default = _default;
@@ -0,0 +1,63 @@
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
+ var _openchsModels = require("openchs-models");
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ class MetaDataService {
15
+ static getProgramFormMappings(formMappings) {
16
+ return _lodash.default.filter(formMappings, formMapping => formMapping.formType === _openchsModels.Form.formTypes.ProgramEnrolment);
17
+ }
18
+
19
+ static getGeneralEncounterFormMappings(formMappings) {
20
+ return _lodash.default.filter(formMappings, formMapping => formMapping.formType === _openchsModels.Form.formTypes.Encounter || formMapping.formType === _openchsModels.Form.formTypes.IndividualEncounterCancellation);
21
+ }
22
+
23
+ static getProgramEncounterFormMappings(formMappings) {
24
+ return _lodash.default.filter(formMappings, formMapping => formMapping.formType === _openchsModels.Form.formTypes.ProgramEncounter || formMapping.formType === _openchsModels.Form.formTypes.ProgramEncounterCancellation);
25
+ }
26
+
27
+ static getProgramsForSubjectType(allPrograms, subjectType, formMappings) {
28
+ if (_lodash.default.isNil(subjectType)) return allPrograms;
29
+
30
+ const programFormMappingsForSubjectType = _lodash.default.filter(formMappings, formMapping => formMapping.subjectTypeUUID === subjectType.uuid && formMapping.formType === _openchsModels.Form.formTypes.ProgramEnrolment);
31
+
32
+ return _lodash.default.intersectionWith(allPrograms, programFormMappingsForSubjectType, (p, fm) => p.uuid === fm.programUUID);
33
+ }
34
+
35
+ static getEncounterTypesForSubjectType(allEncounterTypes, subjectType, formMappings) {
36
+ if (_lodash.default.isNil(subjectType)) return allEncounterTypes;
37
+
38
+ const generalEncounterFormMappingsForSubjectType = _lodash.default.filter(this.getGeneralEncounterFormMappings(formMappings), formMapping => formMapping.subjectTypeUUID === subjectType.uuid);
39
+
40
+ return generalEncounterFormMappingsForSubjectType.map(x => _lodash.default.some(allEncounterTypes, et => et.uuid === x.encounterTypeUUID));
41
+ }
42
+
43
+ static getEncounterTypesForPrograms(allEncounterTypes, programs, formMappings) {
44
+ const programEncounterTypeMappings = MetaDataService.getProgramEncounterFormMappings(formMappings);
45
+
46
+ const encounterTypeMappingsForPrograms = _lodash.default.intersectionWith(programEncounterTypeMappings, programs, (etMapping, program) => etMapping.programUUID === program.uuid);
47
+
48
+ return encounterTypeMappingsForPrograms.map(x => _lodash.default.find(allEncounterTypes, et => et.uuid === x.encounterTypeUUID));
49
+ }
50
+
51
+ static getEncounterTypes_For_SubjectTypeAndPrograms(allEncounterTypes, subjectType, programs, formMappings) {
52
+ if (_lodash.default.isEmpty(programs)) return MetaDataService.getEncounterTypesForSubjectType(allEncounterTypes, subjectType, formMappings);
53
+ return MetaDataService.getEncounterTypesForPrograms(allEncounterTypes, programs, formMappings);
54
+ }
55
+
56
+ static getPossibleGroupSubjectTypesFor(subjectTypes, subjectType) {
57
+ return _lodash.default.isNil(subjectType) ? _lodash.default.filter(subjectTypes, x => x.group) : _lodash.default.filter(subjectTypes, x => x.uuid !== subjectType.uuid && x.group);
58
+ }
59
+
60
+ }
61
+
62
+ var _default = MetaDataService;
63
+ exports.default = _default;
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.29.3",
4
+ "version": "1.29.5",
5
5
  "private": false,
6
6
  "repository": {
7
7
  "type": "git",