d2
Version:
Javascript library for DHIS2
284 lines (242 loc) • 9.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _AnalyticsResponseHeader = _interopRequireDefault(require("./AnalyticsResponseHeader"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
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; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
var booleanMap = {
0: 'No',
// XXX i18n.no || 'No',
1: 'Yes' // i18n.yes || 'Yes',
};
var OUNAME = 'ouname';
var OU = 'ou';
var DEFAULT_COLLECT_IGNORE_HEADERS = ['psi', 'ps', 'eventdate', 'longitude', 'latitude', 'ouname', 'oucode', 'eventdate', 'eventdate'];
var DEFAULT_PREFIX_IGNORE_HEADERS = ['dy'].concat(DEFAULT_COLLECT_IGNORE_HEADERS);
var getParseMiddleware = function getParseMiddleware(type) {
switch (type) {
case 'STRING':
case 'TEXT':
return function (value) {
return "".concat(value);
};
case 'INTEGER':
case 'NUMBER':
return function (value) {
return !Number.isNaN(+value) && Number.isFinite(+value) ? parseFloat(+value) : value;
};
default:
return function (value) {
return value;
};
}
};
var isPrefixHeader = function isPrefixHeader(header, dimensions) {
if (DEFAULT_PREFIX_IGNORE_HEADERS.includes(header.name)) {
return false;
}
return Boolean(Array.isArray(dimensions) && dimensions.length === 0);
};
var isCollectHeader = function isCollectHeader(header, dimensions) {
if (DEFAULT_COLLECT_IGNORE_HEADERS.includes(header.name)) {
return false;
}
return Boolean(Array.isArray(dimensions) && dimensions.length === 0);
};
var getPrefixedId = function getPrefixedId(id, prefix) {
return "".concat(prefix || '', " ").concat(id);
};
var getNameByIdsByValueType = function getNameByIdsByValueType(id, valueType) {
if (valueType === 'BOOLEAN') {
return booleanMap[id];
}
return id;
};
var AnalyticsResponse =
/*#__PURE__*/
function () {
function AnalyticsResponse(response) {
_classCallCheck(this, AnalyticsResponse);
if (response) {
this.response = response;
this.headers = this.extractHeaders();
this.rows = this.extractRows();
this.metaData = this.extractMetadata();
}
}
_createClass(AnalyticsResponse, [{
key: "extractHeaders",
value: function extractHeaders() {
var dimensions = this.response.metaData.dimensions;
var headers = this.response.headers || [];
return headers.map(function (header, index) {
return new _AnalyticsResponseHeader.default(header, {
isPrefix: isPrefixHeader(header, dimensions[header.name]),
isCollect: isCollectHeader(header, dimensions[header.name]),
index: index
});
});
}
}, {
key: "extractRows",
value: function extractRows() {
var headersWithOptionSet = this.headers.filter(function (header) {
return header.optionSet;
});
var rows = this.response.rows;
if (headersWithOptionSet.length) {
rows = rows.slice();
var optionCodeIdMap = this.optionCodeIdMap(); // replace option code with option uid
headersWithOptionSet.forEach(function (header) {
rows.forEach(function (row, index) {
var id = optionCodeIdMap[header.name][row[header.index]];
if (id) {
rows[index][header.index] = id;
}
});
});
}
return rows;
}
}, {
key: "extractMetadata",
value: function extractMetadata() {
var _this = this;
var metaData = _objectSpread({}, this.response.metaData);
var dimensions = metaData.dimensions,
items = metaData.items; // populate metaData dimensions and items
this.headers.filter(function (header) {
return !DEFAULT_COLLECT_IGNORE_HEADERS.includes(header.name);
}).forEach(function (header) {
var ids; // collect row values
if (header.isCollect) {
ids = _this.getSortedUniqueRowIdStringsByHeader(header);
dimensions[header.name] = ids;
} else {
ids = dimensions[header.name];
}
if (header.isPrefix) {
// create prefixed dimensions array
dimensions[header.name] = ids.map(function (id) {
return getPrefixedId(id, header.name);
}); // create items
dimensions[header.name].forEach(function (prefixedId, index) {
var id = ids[index];
var valueType = header.valueType;
var name = getNameByIdsByValueType(id, valueType);
items[prefixedId] = {
name: name
};
});
}
}); // for events, add items from 'ouname'
if (this.hasHeader(OUNAME) && this.hasHeader(OU)) {
var ouNameHeaderIndex = this.getHeader(OUNAME).getIndex();
var ouHeaderIndex = this.getHeader(OU).getIndex();
var ouId;
var ouName;
this.rows.forEach(function (row) {
ouId = row[ouHeaderIndex];
if (items[ouId] === undefined) {
ouName = row[ouNameHeaderIndex];
items[ouId] = {
name: ouName
};
}
});
}
return metaData;
}
}, {
key: "getHeader",
value: function getHeader(name) {
return this.headers.find(function (header) {
return header.name === name;
});
}
}, {
key: "hasHeader",
value: function hasHeader(name) {
return this.getHeader(name) !== undefined;
}
}, {
key: "getSortedUniqueRowIdStringsByHeader",
value: function getSortedUniqueRowIdStringsByHeader(header) {
var parseByType = getParseMiddleware(header.valueType);
var parseString = getParseMiddleware('STRING');
var rowIds = Array.from( // unique values
new Set(this.rows.map(function (responseRow) {
return parseByType(responseRow[header.index]);
})) // remove empty values
).filter(function (id) {
return id !== '';
});
return rowIds.sort().map(function (id) {
return parseString(id);
});
}
}, {
key: "optionCodeIdMap",
value: function optionCodeIdMap() {
var _this$response$metaDa = this.response.metaData,
dimensions = _this$response$metaDa.dimensions,
items = _this$response$metaDa.items;
var map = {};
this.headers.filter(function (header) {
return typeof header.optionSet === 'string';
}).forEach(function (header) {
var optionIds = dimensions[header.name];
map[header.name] = optionIds.map(function (id) {
return _defineProperty({}, items[id].code, id);
}).reduce(function (acc, obj) {
return Object.assign(acc, obj);
}, {});
});
return map;
}
}, {
key: "sortOrganisationUnitsHierarchy",
value: function sortOrganisationUnitsHierarchy() {
var _this2 = this;
var organisationUnits = this.metaData.dimensions.ou;
organisationUnits.forEach(function (organisationUnit, i) {
var hierarchyPrefix = _this2.metaData.ouHierarchy[organisationUnit];
var hierarchyIds = [organisationUnit];
var hierarchyNames = [];
hierarchyPrefix.split('/').reverse().forEach(function (ouId) {
hierarchyIds.unshift(ouId);
});
hierarchyIds.forEach(function (ouId) {
if (_this2.metaData.items[ouId]) {
hierarchyNames.push(_this2.metaData.items[ouId].name);
}
});
organisationUnits[i] = {
id: organisationUnit,
fullName: hierarchyNames.join(' / ')
};
}); // XXX how does this work with different languages/collations?
organisationUnits.sort(function (a, b) {
var aFullName = a.fullName;
var bFullName = b.fullName;
if (aFullName < bFullName) {
return -1;
}
return aFullName > bFullName ? 1 : 0;
});
this.metaData.dimensions.ou = organisationUnits.map(function (ou) {
return ou.id;
});
}
}]);
return AnalyticsResponse;
}();
var _default = AnalyticsResponse;
exports.default = _default;
//# sourceMappingURL=AnalyticsResponse.js.map