in src/Sfx/App/Scripts/Directives/DetailViewPartDirective.ts [86:167]
private getResolvedDataObjectInternal(data: any, parent: any, preserveEmptyProperties: boolean = false): ResolvedObject {
let resolvedObject = new ResolvedObject();
_.forOwn(data, (value, name) => {
let resolvedName = _.startCase(name);
let resolvedValue = null;
// Use decorator to resolve value if defined
if (parent && parent.decorators) {
if (parent.decorators.showList && !_.includes(parent.decorators.showList, name)) {
// If a showList is defined, use it to filter the object properties
return;
} else if (parent.decorators.hideList && _.includes(parent.decorators.hideList, name)) {
// If a hideList is defined, use it to filter the object properties
return;
}
// If a decorator is defined for current property, use it
if (parent.decorators.decorators && parent.decorators.decorators[name]) {
if (parent.decorators.decorators[name].displayName) {
resolvedName = parent.decorators.decorators[name].displayName(name);
}
if (parent.decorators.decorators[name].displayValueInHtml) {
resolvedValue = parent.decorators.decorators[name].displayValueInHtml(value);
}
}
}
if (!resolvedValue) {
// Try to look for the same property defined in parent object
if (parent) {
resolvedValue = parent[name] || parent[_.camelCase(name)];
}
// Fall back to the original value
if (!resolvedValue) {
resolvedValue = data[name];
}
}
if (_.isNumber(resolvedValue) || _.isBoolean(resolvedValue)) {
// Number and Boolean are always preserved
} else if (_.isUndefined(resolvedValue) || _.isNull(resolvedValue) || _.isEmpty(resolvedValue)) {
if (preserveEmptyProperties) {
resolvedValue = Constants.Empty;
} else {
// Remove all empty/undefined/null value properties
resolvedValue = null;
}
} else if (_.isArray(resolvedValue)) {
if (!_.isObject(_.first(resolvedValue))) {
// The first element in the array is not an object, assume all the elements are value types
resolvedValue = `[${_.map(resolvedValue, v => v.toString()).join(", ")}]`;
} else {
// Resolve sub-array, for array, all properties are preserved unless filtered by showList/hideList
resolvedValue = _.map(resolvedValue, v => this.getResolvedDataObject(v, true));
}
} else if (_.isObject(resolvedValue)) {
// Deal with badge class as a special case
if (Utils.isBadge(resolvedValue)) {
if (resolvedValue.text && resolvedValue.badgeClass) {
resolvedValue = HtmlUtils.getBadgeHtml(resolvedValue);
} else {
resolvedValue = resolvedValue.text;
}
} else {
// Resolve sub-object
resolvedValue = this.getResolvedDataObject(resolvedValue);
}
}
if (_.isEmpty(resolvedName)) {
resolvedName = Constants.Empty;
}
if (resolvedValue !== null) {
resolvedObject[resolvedName] = resolvedValue;
}
});
return _.size(resolvedObject) > 0 ? resolvedObject : null;
}