=== modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dashboard/dashboard-controller.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dashboard/dashboard-controller.js 2014-12-16 15:44:11 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dashboard/dashboard-controller.js 2014-12-19 16:52:40 +0000 @@ -9,6 +9,7 @@ TEIService, TEService, OptionSetService, + EnrollmentService, ProgramFactory, CurrentSelection) { //dashboard items @@ -56,25 +57,33 @@ TEService.get($scope.selectedTei.trackedEntity).then(function(te){ $scope.trackedEntity = te; - ProgramFactory.getAll().then(function(programs){ - - $scope.programs = []; - - //get programs valid for the selected ou and tei - angular.forEach(programs, function(program){ - if(program.organisationUnits.hasOwnProperty($scope.selectedOrgUnit.id) && - program.trackedEntity.id === $scope.selectedTei.trackedEntity){ - $scope.programs.push(program); - } - - if($scope.selectedProgramId && program.id === $scope.selectedProgramId){ - $scope.selectedProgram = program; - } - }); - - //broadcast selected items for dashboard controllers - CurrentSelection.set({tei: $scope.selectedTei, te: $scope.trackedEntity, pr: $scope.selectedProgram, enrollment: null, optionSets: $scope.optionSets}); - $scope.broadCastSelections(); + //get enrollments for the selected tei + EnrollmentService.getByEntity($scope.selectedTeiId).then(function(response){ + + var selectedEnrollment = null; + if(response.enrollments.length === 1 && response.enrollments[0].status === 'ACTIVE'){ + selectedEnrollment = response.enrollments[0]; + } + + ProgramFactory.getAll().then(function(programs){ + $scope.programs = []; + + //get programs valid for the selected ou and tei + angular.forEach(programs, function(program){ + if(program.organisationUnits.hasOwnProperty($scope.selectedOrgUnit.id) && + program.trackedEntity.id === $scope.selectedTei.trackedEntity){ + $scope.programs.push(program); + } + + if($scope.selectedProgramId && program.id === $scope.selectedProgramId || selectedEnrollment && selectedEnrollment.program === program.id){ + $scope.selectedProgram = program; + } + }); + + //broadcast selected items for dashboard controllers + CurrentSelection.set({tei: $scope.selectedTei, te: $scope.trackedEntity, prs: $scope.programs, pr: $scope.selectedProgram, enrollment: selectedEnrollment, optionSets: $scope.optionSets}); + $scope.broadCastSelections(); + }); }); }); }); @@ -101,7 +110,7 @@ $scope.trackedEntity = selections.te; $scope.optionSets = selections.optionSets; - CurrentSelection.set({tei: $scope.selectedTei, te: $scope.trackedEntity, pr: $scope.selectedProgram, enrollment: null, optionSets: $scope.optionSets}); + CurrentSelection.set({tei: $scope.selectedTei, te: $scope.trackedEntity, prs: $scope.programs, pr: $scope.selectedProgram, enrollment: null, optionSets: $scope.optionSets}); $timeout(function() { $rootScope.$broadcast('selectedItems', {programExists: $scope.programs.length > 0}); }, 100); === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dataentry/dataentry-controller.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dataentry/dataentry-controller.js 2014-12-16 15:48:16 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dataentry/dataentry-controller.js 2014-12-19 16:52:40 +0000 @@ -40,7 +40,7 @@ $scope.showEventColors = false; //listen for the selected items - $scope.$on('dashboardWidgets', function(event, args) { + $scope.$on('dashboardWidgets', function() { $scope.showDataEntryDiv = false; $scope.showEventCreationDiv = false; $scope.showDummyEventDiv = false; @@ -60,19 +60,20 @@ $scope.optionSets = selections.optionSets; $scope.selectedProgramWithStage = []; - if($scope.selectedOrgUnit && $scope.selectedProgram && $scope.selectedEntity && $scope.selectedEnrollment){ - angular.forEach($scope.selectedProgram.programStages, function(st){ - ProgramStageFactory.get(st.id).then(function(stage){ + if($scope.selectedOrgUnit && $scope.selectedProgram && $scope.selectedEntity && $scope.selectedEnrollment){ + + ProgramStageFactory.getByProgram($scope.selectedProgram).then(function(stages){ + + angular.forEach(stages, function(stage){ if(stage.openAfterEnrollment){ $scope.currentStage = stage; } $scope.selectedProgramWithStage[stage.id] = stage; }); - }); - - setTimeout(function () { + $scope.getEvents(); - }, 100); + + }); } }); @@ -104,16 +105,17 @@ dhis2Event.sortingDate = dhis2Event.eventDate; } - dhis2Event.statusColor = EventUtils.getEventStatusColor(dhis2Event); - //dhis2Event = EventUtils.setEventOrgUnitName(dhis2Event); + dhis2Event.statusColor = EventUtils.getEventStatusColor(dhis2Event); if($scope.currentStage && $scope.currentStage.id === dhis2Event.programStage){ $scope.currentEvent = dhis2Event; $scope.showDataEntry($scope.currentEvent, true); } } - } + } }); + + $scope.dhis2Events = orderByFilter($scope.dhis2Events, '-sortingDate'); } $scope.dummyEvents = $scope.checkForEventCreation($scope.dhis2Events, $scope.selectedProgram); === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dataentry/dataentry.html' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dataentry/dataentry.html 2014-12-08 16:37:23 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dataentry/dataentry.html 2014-12-19 16:52:40 +0000 @@ -103,7 +103,7 @@ {{'due_date'| translate}} - {{'due_date'| translate}} + {{'reschedule_duedate'| translate}} - +
{{note.value}}
+ === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/report/tei-report-controller.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/report/tei-report-controller.js 2014-12-08 15:56:07 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/report/tei-report-controller.js 2014-12-19 16:52:40 +0000 @@ -106,7 +106,7 @@ //process tei attributes, this is to have consistent display so that the tei //contains program attributes whether it has value or not - TEIService.processAttributes($scope.selectedTei, $scope.selectedProgram, null, $scope.optionSets).then(function(tei){ + TEIService.processAttributes($scope.selectedTei, $scope.selectedProgram, null).then(function(tei){ $scope.tei = tei; }); === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/i18n/i18n_app.properties' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/i18n/i18n_app.properties 2014-12-10 08:11:56 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/i18n/i18n_app.properties 2014-12-19 16:52:40 +0000 @@ -186,6 +186,7 @@ show_hide_messaging=Show/hide messaging form messaging=Messaging scheduling=Scheduling +reschedule_duedate=Reschedule due date reschedule=Reschedule rescheduling=Rescheduling scheduling_messaging=Scheduling and Messaging @@ -261,4 +262,6 @@ log_out=Log out about_dhis2=About DHIS 2 missing_translation_file=Missing Translation File -missing_translation_using_default=No translation file is found for the selected locale. Using default translation (English). \ No newline at end of file +missing_translation_using_default=No translation file is found for the selected locale. Using default translation (English). +loading_tree=Loading orgunit tree +loading_metadata=Loading meta-data \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/app.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/app.js 2014-12-15 14:00:00 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/app.js 2014-12-19 16:52:40 +0000 @@ -13,7 +13,7 @@ 'trackerCaptureControllers', 'd2Directives', 'd2Filters', - 'd2Services', + //'d2Services', 'd2Controllers', 'angularLocalStorage', 'ui.select2', === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js 2014-12-16 15:44:11 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js 2014-12-19 16:52:40 +0000 @@ -22,6 +22,7 @@ $scope.ouModes = [{name: 'SELECTED'}, {name: 'CHILDREN'}, {name: 'DESCENDANTS'}, {name: 'ACCESSIBLE'}]; $scope.selectedOuMode = $scope.ouModes[0]; $scope.dashboardProgramId = ($location.search()).program; + $scope.treeLoaded = false; //Paging $scope.pager = {pageSize: 50, page: 1, toolBarDisplay: 5}; === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/services.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/services.js 2014-12-16 15:44:11 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/services.js 2014-12-19 16:52:40 +0000 @@ -443,7 +443,7 @@ }); return def.promise; - }, + }, get: function(entityUid, optionSets){ var promise = $http.get( '../api/trackedEntityInstances/' + entityUid ); this.convertFromApiToUser(promise, optionSets).then(function(response){ @@ -500,38 +500,106 @@ }); return promise; }, - processAttributes: function(selectedTei, selectedProgram, selectedEnrollment, optionSets){ + processAttributes: function(selectedTei, selectedProgram, selectedEnrollment){ var def = $q.defer(); if(selectedTei.attributes){ if(selectedProgram && selectedEnrollment){ //show attribute for selected program and enrollment AttributesFactory.getByProgram(selectedProgram).then(function(atts){ - selectedTei.attributes = AttributesFactory.showRequiredAttributes(atts,selectedTei.attributes, true, optionSets); + selectedTei.attributes = AttributesFactory.showRequiredAttributes(atts,selectedTei.attributes, true); def.resolve(selectedTei); }); } if(selectedProgram && !selectedEnrollment){ //show attributes for selected program AttributesFactory.getByProgram(selectedProgram).then(function(atts){ - selectedTei.attributes = AttributesFactory.showRequiredAttributes(atts,selectedTei.attributes, false, optionSets); + selectedTei.attributes = AttributesFactory.showRequiredAttributes(atts,selectedTei.attributes, false); def.resolve(selectedTei); }); } if(!selectedProgram && !selectedEnrollment){ //show attributes in no program AttributesFactory.getWithoutProgram().then(function(atts){ - selectedTei.attributes = AttributesFactory.showRequiredAttributes(atts,selectedTei.attributes, false, optionSets); + selectedTei.attributes = AttributesFactory.showRequiredAttributes(atts,selectedTei.attributes, false); def.resolve(selectedTei); }); } } return def.promise; + }, + reconstructForWebApi: function(tei, attributes, attributesById, optionSets){ + var registrationAttributes = []; + var formEmpty = true; + angular.forEach(attributes, function(att){ + if(att.valueType === 'trueOnly'){ + if(!tei[att.id]){ + registrationAttributes.push({attribute: att.id, value: ''}); + formEmpty = false; + } + else{ + registrationAttributes.push({attribute: att.id, value: 'true'}); + formEmpty = false; + } + } + else{ + if(tei[att.id] !== '' && tei[att.id]){ + + var val = tei[att.id]; + if(att.valueType === 'date'){ + val = DateUtils.formatFromUserToApi(val); + } + + if(att.valueType === 'optionSet' && attributesById[att.id] && attributesById[att.id].optionSet && optionSets[attributesById[att.id].optionSet.id]){ + val = OptionSetService.getCode(optionSets[attributesById[att.id].optionSet.id].options, val); + } + + registrationAttributes.push({attribute: att.id, value: val}); + formEmpty = false; + } + } + }); + + return {attributes: registrationAttributes, formEmpty: formEmpty}; + }, + reconstructForUser: function(tei, attributes, attributesById, optionSets){ + var registrationAttributes = []; + var formEmpty = true; + angular.forEach(attributes, function(att){ + if(att.valueType === 'trueOnly'){ + if(!tei[att.id]){ + registrationAttributes.push({attribute: att.id, value: ''}); + formEmpty = false; + } + else{ + registrationAttributes.push({attribute: att.id, value: 'true'}); + formEmpty = false; + } + } + else{ + if(tei[att.id] !== '' && tei[att.id]){ + + var val = tei[att.id]; + if(att.valueType === 'date'){ + val = DateUtils.formatFromApiToUser(val); + } + + if(att.valueType === 'optionSet' && attributesById[att.id] && attributesById[att.id].optionSet && optionSets[attributesById[att.id].optionSet.id]){ + val = OptionSetService.getName(optionSets[attributesById[att.id].optionSet.id].options, val); + } + + registrationAttributes.push({attribute: att.id, value: val}); + formEmpty = false; + } + } + }); + + return {attributes: registrationAttributes, formEmpty: formEmpty}; } }; }) /* Factory for getting tracked entity attributes */ -.factory('AttributesFactory', function($q, $rootScope, TCStorageService, orderByFilter, DateUtils) { +.factory('AttributesFactory', function($q, $rootScope, TCStorageService, orderByFilter) { return { getAll: function(){ @@ -606,7 +674,7 @@ }); return def.promise(); }, - showRequiredAttributes: function(requiredAttributes, teiAttributes, fromEnrollment, optionSets){ + showRequiredAttributes: function(requiredAttributes, teiAttributes, fromEnrollment){ //first reset teiAttributes for(var j=0; j 0){ + return; + } + var def = $.Deferred(); + + $.ajax({ + url: '../api/relationshipTypes.json?paging=false&fields=id,name,aIsToB,bIsToA,displayName', + type: 'GET' + }).done(function(response) { + dhis2.tc.store.setAll( 'relationshipTypes', response.relationshipTypes ); + def.resolve(); + }).fail(function(){ + def.resolve(); + }); + + return def.promise(); + }); } function getTrackedEntities() { - var def = $.Deferred(); - - $.ajax({ - url: '../api/trackedEntities', - type: 'GET', - data: 'viewClass=detailed&paging=false' - }).done(function(response) { - dhis2.tc.store.setAll( 'trackedEntities', response.trackedEntities ); - def.resolve(); - }); - - return def.promise(); + dhis2.tc.store.getKeys('trackedEntities').done(function(res){ + if(res.length > 0){ + return; + } + + var def = $.Deferred(); + + $.ajax({ + url: '../api/trackedEntities', + type: 'GET', + data: 'viewClass=detailed&paging=false' + }).done(function(response) { + dhis2.tc.store.setAll( 'trackedEntities', response.trackedEntities ); + def.resolve(); + }).fail(function(){ + def.resolve(); + }); + + return def.promise(); + }); } function getMetaPrograms() @@ -321,21 +255,16 @@ $.ajax({ url: '../api/programs.json', type: 'GET', - data:'filter=type:eq:1&paging=false&fields=id,name,version,programTrackedEntityAttributes[displayInList,mandatory,trackedEntityAttribute[id]],programStages[id,version,programStageDataElements[dataElement[id,optionSet[id,version]]]]' + data:'filter=type:eq:1&paging=false&fields=id,version,programTrackedEntityAttributes[trackedEntityAttribute[id,optionSet[id,version]]],programStages[id,version,programStageDataElements[dataElement[optionSet[id,version]]]]' }).done( function(response) { var programs = []; _.each( _.values( response.programs ), function ( program ) { - if( program.programStages && - program.programStages.length && - program.programStages[0].programStageDataElements && - program.programStages[0].programStageDataElements.length ) { - - programs.push(program); - } - + programs.push(program); }); def.resolve( programs ); + }).fail(function(){ + def.resolve( null ); }); return def.promise(); @@ -378,6 +307,8 @@ promise = promise.done( function () { mainDef.resolve( programs ); } ); + }).fail(function(){ + mainDef.resolve( null ); }); builder.resolve(); @@ -391,22 +322,27 @@ return $.ajax( { url: '../api/programs.json', type: 'GET', - data: 'paging=false&filter=id:eq:' + id +'&fields=id,name,type,version,dataEntryMethod,relationshipText,relationshipFromA,dateOfEnrollmentDescription,dateOfIncidentDescription,displayIncidentDate,ignoreOverdueEvents,realionshipText,relationshipFromA,selectEnrollmentDatesInFuture,selectIncidentDatesInFuture,onlyEnrollOnce,externalAccess,displayOnAllOrgunit,registration,trackedEntity[id,name,description],userRoles[id,name],organisationUnits[id,name],programStages[id,name,version,minDaysFromStart,standardInterval,generatedByEnrollmentDate,reportDateDescription,repeatable,autoGenerateEvent,openAfterEnrollment,reportDateToUse],programTrackedEntityAttributes[displayInList,mandatory,allowFutureDate,trackedEntityAttribute[id]]' + data: 'paging=false&filter=id:eq:' + id +'&fields=id,name,type,version,dataEntryMethod,dateOfEnrollmentDescription,dateOfIncidentDescription,displayIncidentDate,ignoreOverdueEvents,selectEnrollmentDatesInFuture,selectIncidentDatesInFuture,onlyEnrollOnce,externalAccess,displayOnAllOrgunit,registration,relationshipText,relationshipFromA,relatedProgram[id,name],relationshipType[id,name],trackedEntity[id,name,description],userRoles[id,name],organisationUnits[id,name],programStages[id,name,sortOrder,version,minDaysFromStart,reportDateDescription,repeatable,autoGenerateEvent,generatedByEnrollmentDate],programTrackedEntityAttributes[displayInList,mandatory,allowFutureDate,trackedEntityAttribute[id,unique]]' }).done( function( response ){ _.each( _.values( response.programs ), function ( program ) { var ou = {}; - _.each(_.values( program.organisationUnits), function(o){ - ou[o.id] = o.name; - }); + if(program.organisationUnits){ + _.each(_.values( program.organisationUnits), function(o){ + ou[o.id] = o.name; + }); + } program.organisationUnits = ou; var ur = {}; - _.each(_.values( program.userRoles), function(u){ - ur[u.id] = u.name; - }); + + if(program.userRoles){ + _.each(_.values( program.userRoles), function(u){ + ur[u.id] = u.name; + }); + } program.userRoles = ur; @@ -417,7 +353,7 @@ }; } -function getProgramStages( programs ) +function getTrackedEntityAttributes( programs ) { if( !programs ){ return; @@ -434,19 +370,21 @@ _.each( _.values( programs ), function ( program ) { - _.each(_.values(program.programStages), function(programStage){ - build = build.then(function() { - var d = $.Deferred(); - var p = d.promise(); - dhis2.tc.store.get('programStages', programStage.id).done(function(obj) { - if(!obj || obj.version !== programStage.version) { - promise = promise.then( getProgramStage( programStage.id ) ); - } - d.resolve(); - }); - return p; - }); - }); + if(program.programTrackedEntityAttributes){ + _.each(_.values(program.programTrackedEntityAttributes), function(teAttribute){ + build = build.then(function() { + var d = $.Deferred(); + var p = d.promise(); + dhis2.tc.store.get('attributes', teAttribute.trackedEntityAttribute.id).done(function(obj) { + if(!obj || obj.version !== teAttribute.trackedEntityAttribute.version) { + promise = promise.then( getAttribute( teAttribute.trackedEntityAttribute.id ) ); + } + d.resolve(); + }); + return p; + }); + }); + } }); build.done(function() { @@ -455,6 +393,8 @@ promise = promise.done( function () { mainDef.resolve( programs ); } ); + }).fail(function(){ + mainDef.resolve( null ); }); builder.resolve(); @@ -462,22 +402,23 @@ return mainPromise; } -function getProgramStage( id ) +function getAttribute( id ) { return function() { return $.ajax( { - url: '../api/programStages.json', + url: '../api/trackedEntityAttributes.json', type: 'GET', - data: 'filter=id:eq:' + id +'&fields=id,name,version,dataEntryForm,captureCoordinates,blockEntryForm,autoGenerateEvent,openAfterEnrollment,reportDateToUse,reportDateDescription,minDaysFromStart,standardInterval,repeatable,programStageDataElements[displayInReports,allowProvidedElsewhere,allowFutureDate,compulsory,dataElement[id,name,formName,type,numberType,optionSet[id]]]' + data: 'filter=id:eq:' + id +'&fields=id,name,code,version,description,valueType,inherit,displayOnVisitSchedule,displayInListNoProgram,unique,optionSet[id,version]' }).done( function( response ){ - _.each( _.values( response.programStages ), function( programStage ) { - dhis2.tc.store.set( 'programStages', programStage ); + _.each( _.values( response.trackedEntityAttributes ), function( teAttribute ) { + dhis2.tc.store.set( 'attributes', teAttribute ); }); }); }; } -function getOptionSetsForPrograms( programs ) + +function getOptionSetsForAttributes( programs ) { if( !programs ){ return; @@ -493,16 +434,17 @@ var build = builder.promise(); _.each( _.values( programs ), function ( program ) { - _.each(_.values( program.programStages), function( programStage) { - _.each(_.values( programStage.programStageDataElements), function(prStDe){ - if( prStDe.dataElement.optionSet && prStDe.dataElement.optionSet.id ){ + + if(program.programTrackedEntityAttributes){ + _.each(_.values( program.programTrackedEntityAttributes), function( teAttribute) { + if( teAttribute.trackedEntityAttribute.optionSet && teAttribute.trackedEntityAttribute.optionSet.id ){ build = build.then(function() { var d = $.Deferred(); var p = d.promise(); - dhis2.tc.store.get('optionSets', prStDe.dataElement.optionSet.id).done(function(obj) { - if((!obj || obj.version !== prStDe.dataElement.optionSet.version) && !optionSetsInPromise[prStDe.dataElement.optionSet.id]) { - optionSetsInPromise[prStDe.dataElement.optionSet.id] = prStDe.dataElement.optionSet.id; - promise = promise.then( getOptionSet( prStDe.dataElement.optionSet.id ) ); + dhis2.tc.store.get('optionSets', teAttribute.trackedEntityAttribute.optionSet.id).done(function(obj) { + if((!obj || obj.version !== teAttribute.trackedEntityAttribute.optionSet.version) && !optionSetsInPromise[teAttribute.trackedEntityAttribute.optionSet.id]) { + optionSetsInPromise[teAttribute.trackedEntityAttribute.optionSet.id] = teAttribute.trackedEntityAttribute.optionSet.id; + promise = promise.then( getOptionSet( teAttribute.trackedEntityAttribute.optionSet.id ) ); } d.resolve(); }); @@ -511,15 +453,139 @@ }); } }); - }); - }); - - build.done(function() { - def.resolve(); - - promise = promise.done( function () { - mainDef.resolve( programs ); - } ); + } + }); + + build.done(function() { + def.resolve(); + + promise = promise.done( function () { + mainDef.resolve( programs ); + } ); + }).fail(function(){ + mainDef.resolve( null ); + }); + + builder.resolve(); + + return mainPromise; +} + +function getProgramStages( programs ) +{ + if( !programs ){ + return; + } + + var mainDef = $.Deferred(); + var mainPromise = mainDef.promise(); + + var def = $.Deferred(); + var promise = def.promise(); + + var builder = $.Deferred(); + var build = builder.promise(); + + _.each( _.values( programs ), function ( program ) { + + if(program.programStages){ + _.each(_.values(program.programStages), function(programStage){ + build = build.then(function() { + var d = $.Deferred(); + var p = d.promise(); + dhis2.tc.store.get('programStages', programStage.id).done(function(obj) { + if(!obj || obj.version !== programStage.version) { + promise = promise.then( getProgramStage( programStage.id ) ); + } + d.resolve(); + }); + return p; + }); + }); + } + }); + + build.done(function() { + def.resolve(); + + promise = promise.done( function () { + mainDef.resolve( programs ); + } ); + }).fail(function(){ + mainDef.resolve( null ); + }); + + builder.resolve(); + + return mainPromise; +} + +function getProgramStage( id ) +{ + return function() { + return $.ajax( { + url: '../api/programStages.json', + type: 'GET', + data: 'filter=id:eq:' + id +'&fields=id,name,sortOrder,version,dataEntryForm,captureCoordinates,blockEntryForm,autoGenerateEvent,generatedByEnrollmentDate,reportDateDescription,minDaysFromStart,repeatable,programStageDataElements[displayInReports,allowProvidedElsewhere,allowFutureDate,compulsory,dataElement[id,code,name,formName,type,optionSet[id]]]' + }).done( function( response ){ + _.each( _.values( response.programStages ), function( programStage ) { + dhis2.tc.store.set( 'programStages', programStage ); + }); + }); + }; +} + +function getOptionSetsForDataElements( programs ) +{ + if( !programs ){ + return; + } + + var mainDef = $.Deferred(); + var mainPromise = mainDef.promise(); + + var def = $.Deferred(); + var promise = def.promise(); + + var builder = $.Deferred(); + var build = builder.promise(); + + _.each( _.values( programs ), function ( program ) { + + if(program.programStages){ + _.each(_.values( program.programStages), function( programStage) { + + if(programStage.programStageDataElements){ + _.each(_.values( programStage.programStageDataElements), function(prStDe){ + if( prStDe.dataElement.optionSet && prStDe.dataElement.optionSet.id ){ + build = build.then(function() { + var d = $.Deferred(); + var p = d.promise(); + dhis2.tc.store.get('optionSets', prStDe.dataElement.optionSet.id).done(function(obj) { + if((!obj || obj.version !== prStDe.dataElement.optionSet.version) && !optionSetsInPromise[prStDe.dataElement.optionSet.id]) { + optionSetsInPromise[prStDe.dataElement.optionSet.id] = prStDe.dataElement.optionSet.id; + promise = promise.then( getOptionSet( prStDe.dataElement.optionSet.id ) ); + } + d.resolve(); + }); + + return p; + }); + } + }); + } + }); + } + }); + + build.done(function() { + def.resolve(); + + promise = promise.done( function () { + mainDef.resolve( programs ); + } ); + }).fail(function(){ + mainDef.resolve( null ); }); builder.resolve(); @@ -565,6 +631,9 @@ }); def.resolve( trackedEntityForms ); + + }).fail(function(){ + def.resolve( null ); }); return def.promise(); @@ -607,6 +676,8 @@ promise = promise.done( function () { mainDef.resolve(); } ); + }).fail(function(){ + mainDef.resolve(); }); builder.resolve(); === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/styles/style.css' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/styles/style.css 2014-12-16 15:44:11 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/styles/style.css 2014-12-19 16:52:40 +0000 @@ -529,7 +529,7 @@ font-size: 14px; } -input[type=number], input[type=text], input[type=password], textarea, select { +input[type=number], input[type=text], input[type=email], input[type=password], textarea, select { border: 1px solid #aaa; padding: 2px 6px; font-size: 14px; @@ -636,6 +636,7 @@ font-size: 14px; line-height: 1.0; color: #555; + padding: 2px 6px; margin-bottom: 5px; margin-top: 5px; vertical-align: middle; @@ -824,6 +825,10 @@ font-weight: bold; } +.disable-clicks { + pointer-events: none; +} + @media print { #header, #leftBar, .not-printable { display: none; === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/views/home.html' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/views/home.html 2014-12-16 07:54:45 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/views/home.html 2014-12-19 16:52:40 +0000 @@ -41,11 +41,17 @@ +
+ {{'loading_tree'| translate}} +
- {{'in_progress'| translate}} +
+ {{'in_progress'| translate}}
+ {{'loading_metadata'| translate}} +
@@ -88,7 +94,9 @@
-
+
+ +
@@ -104,6 +112,9 @@
+ + +
@@ -112,6 +123,7 @@