This solved the problem:
1. Backend: I overloaded ObsResource1_11
in my module’s OMOD
@Resource(name = RestConstants.VERSION_1 + "/complexobs", order = 1, supportedClass = Obs.class, supportedOpenmrsVersions = {"1.11.*", "1.12.*"})
public class ComplexObsResource extends ObsResource1_11 {
...
@Override
public Obs save(Obs delegate) {
if (isComplex(delegate) && null == delegate.getComplexData()) {
delegate = Context.getObsService().getComplexObs(delegate.getId(), "view");
}
return super.save(delegate);
}
public static boolean isComplex(Obs obs) {
return (null != obs && null != obs.getConcept() && obs.getConcept().isComplex());
}
}
2. Frontend: I added a convenience Angular service: complexObsService.js
angular.module('complexObsService', ['ngResource', 'uicommons.common'])
.factory('ComplexObs', function($resource) {
return $resource("/" + OPENMRS_CONTEXT_PATH + "/ws/rest/v1/complexobs/:uuid", {
uuid: '@uuid'
},{
query: { method:'GET', isArray:false }
});
});
This was just copied from UI Commons’s obsService.js .