=== modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/i18n/en.json' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/i18n/en.json 2014-09-23 10:48:24 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/i18n/en.json 2014-11-03 10:34:14 +0000 @@ -91,6 +91,10 @@ "online_nofification": "You are online", "latitude": "Latitude", "longitude": "Longitude", + "lat_lng": "[Latitude Longitude]", + "get_from_map": "Get from map", + "capture": "Capture", + "point_and_click_for_coordinate": "Point and click for coordinate", "profile": "Profile", "applications": "Apps", "more_applications": "More apps", === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/index.html' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/index.html 2014-10-17 14:33:57 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/index.html 2014-11-03 10:34:14 +0000 @@ -7,6 +7,12 @@ + + + + @@ -33,7 +39,7 @@ - + @@ -60,18 +66,22 @@ - + - + - + + + + + @@ -98,108 +108,9 @@
- - -
- -
- -
- - - - - -
- -
-
    -
-
- -
- -
-

- {{'event_capture'| translate}} -

- - -
- - - - - - - - - - - - -
- - - - - - - -
-
- -
- -
- - - -
-
-
-

- {{'event_details'| translate}} - {{'new_event'| translate}} -

- -
-
-
- -
-
-
- -
-
-
- -
+ +
+ === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/app.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/app.js 2014-06-12 23:12:59 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/app.js 2014-11-03 10:34:14 +0000 @@ -16,16 +16,27 @@ .value('DHIS2URL', '..') -.config(function($httpProvider, $translateProvider) { +.config(function($httpProvider, $routeProvider, $translateProvider) { $httpProvider.defaults.useXDomain = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; + $routeProvider.when('/', { + templateUrl: 'views/home.html', + controller: 'MainController'/*, + resolve: { + geoJsons: function(GeoJsonFactory){ + return GeoJsonFactory.getAll(); + } + }*/ + }).otherwise({ + redirectTo : '/' + }); + $translateProvider.useStaticFilesLoader({ prefix: 'i18n/', suffix: '.json' }); - $translateProvider.preferredLanguage('en'); - + $translateProvider.preferredLanguage('en'); }); \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/controllers.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/controllers.js 2014-10-17 14:33:27 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/controllers.js 2014-11-03 10:34:14 +0000 @@ -6,17 +6,17 @@ //Controller for settings page .controller('MainController', function($scope, - $filter, $modal, $timeout, storage, Paginator, TranslationService, - OptionSetFactory, + OptionSetService, ProgramFactory, - ProgramStageFactory, - DHIS2EventFactory, + ProgramStageFactory, + DHIS2EventFactory, DHIS2EventService, + GeoJsonFactory, ContextMenuSelectedItem, DateUtils, ModalService, @@ -57,18 +57,21 @@ $scope.dhis2Events = []; if( angular.isObject($scope.selectedOrgUnit)){ - //apply translation - by now user's profile is fetched from server. - TranslationService.translate(); - + TranslationService.translate(); $scope.loadPrograms(); - } }); + GeoJsonFactory.getAll().then(function(geoJsons){ + $scope.geoJsons = geoJsons; + }); + + + //load programs associated with the selected org unit. - $scope.loadPrograms = function() { - + $scope.loadPrograms = function() { + //$scope.selectedOrgUnit = orgUnit; $scope.selectedProgram = null; $scope.selectedProgramStage = null; @@ -121,19 +124,10 @@ if( $scope.selectedProgram && $scope.selectedProgram.programStages[0].id){ $scope.optionSets = []; - $scope.optionNamesByCode = new Object(); - $scope.optionCodesByName = new Object(); - OptionSetFactory.getAll().then(function(optionSets){ + OptionSetService.getAll().then(function(optionSets){ angular.forEach(optionSets, function(optionSet){ - //$scope.optionSets[optionSet.id] = optionSet; - angular.forEach(optionSet.options, function(option){ - if(option.name && option.code){ - $scope.optionNamesByCode[ '"' + option.code + '"'] = option.name; - $scope.optionCodesByName[ '"' + option.name + '"'] = option.code; - } - }); - $scope.optionSets[optionSet.id] = optionSet; + $scope.optionSets[optionSet.id] = optionSet; }); //because this is single event, take the first program stage @@ -155,7 +149,7 @@ $scope.newDhis2Event = {dataValues: []}; $scope.currentEvent = {dataValues: []}; - $scope.eventGridColumns.push({name: 'form_id', id: 'uid', type: 'string', compulsory: false, showFilter: false, show: true}); + $scope.eventGridColumns.push({name: 'form_id', id: 'uid', type: 'string', compulsory: false, showFilter: false, show: false}); $scope.filterTypes['uid'] = 'string'; $scope.eventGridColumns.push({name: $scope.selectedProgramStage.reportDateDescription ? $scope.selectedProgramStage.reportDateDescription : 'incident_date', id: 'event_date', type: 'date', compulsory: false, showFilter: false, show: true}); @@ -237,8 +231,8 @@ } } if($scope.prStDes[dataValue.dataElement].dataElement.type === 'string'){ - if($scope.prStDes[dataValue.dataElement].dataElement.optionSet && $scope.optionNamesByCode[ '"' + val + '"']){ - val = $scope.optionNamesByCode[ '"' + val + '"']; + if($scope.prStDes[dataValue.dataElement].dataElement.optionSet ){ + val = OptionSetService.getNameOrCode($scope.optionSets[$scope.prStDes[dataValue.dataElement].dataElement.optionSet.id].options, val); } } if($scope.prStDes[dataValue.dataElement].dataElement.type === 'date'){ @@ -440,9 +434,10 @@ valueExists = true; if($scope.prStDes[dataElement].dataElement.type === 'string'){ if($scope.prStDes[dataElement].dataElement.optionSet){ - if($scope.optionCodesByName[ '"' + val + '"']){ + /*if($scope.optionCodesByName[ '"' + val + '"']){ val = $scope.optionCodesByName[ '"' + val + '"']; - } + }*/ + val = OptionSetService.getNameOrCode($scope.optionSets[$scope.prStDes[dataElement].dataElement.optionSet.id].options,val); //$scope.optionSets[].options$scope.optionCodesByName[ '"' + val + '"']; } } @@ -555,9 +550,10 @@ if(val && $scope.prStDes[dataElement].dataElement.type === 'string'){ if($scope.prStDes[dataElement].dataElement.optionSet){ - if($scope.optionCodesByName[ '"' + val + '"']){ + /*if($scope.optionCodesByName[ '"' + val + '"']){ val = $scope.optionCodesByName[ '"' + val + '"']; - } + }*/ + val = OptionSetService.getNameOrCode($scope.optionSets[$scope.prStDes[dataElement].dataElement.optionSet.id].options,val); } } if(val && $scope.prStDes[dataElement].dataElement.type === 'date'){ @@ -643,9 +639,10 @@ if($scope.prStDes[dataElement].dataElement.type === 'string'){ if($scope.prStDes[dataElement].dataElement.optionSet){ - if($scope.optionCodesByName[ '"' + newValue + '"']){ + /*if($scope.optionCodesByName[ '"' + newValue + '"']){ newValue = $scope.optionCodesByName[ '"' + newValue + '"']; - } + }*/ + newValue = OptionSetService.getNameOrCode($scope.optionSets[$scope.prStDes[dataElement].dataElement.optionSet.id].options, newValue);//$scope.optionCodesByName[ '"' + newValue + '"']; } } if($scope.prStDes[dataElement].dataElement.type === 'date'){ @@ -702,15 +699,7 @@ }); }); }; - - $scope.printForm = function(){ - var printContents = document.getElementById('printableForm').innerHTML; - var originalContents = document.body.innerHTML; - document.body.innerHTML = printContents; - window.print(); - document.body.innerHTML = originalContents; - }; - + $scope.showNotes = function(dhis2Event){ var modalInstance = $modal.open({ @@ -729,56 +718,28 @@ $scope.getHelpContent = function(){ }; -}) - -//Controller for notes -.controller('NotesController', - function($scope, - $modalInstance, - dhis2Event){ - - $scope.dhis2Event = dhis2Event; - - $scope.close = function () { - $modalInstance.close(); - }; -}) - -//Controller for the header section -.controller('HeaderController', - function($scope, - DHIS2URL, - TranslationService) { - - TranslationService.translate(); - - $scope.home = function(){ - window.location = DHIS2URL; - }; - -}) - -//Controller for column show/hide -.controller('ColumnDisplayController', - function($scope, - $modalInstance, - hiddenGridColumns, - eventGridColumns){ - - $scope.eventGridColumns = eventGridColumns; - $scope.hiddenGridColumns = hiddenGridColumns; - - $scope.close = function () { - $modalInstance.close($scope.eventGridColumns); - }; - - $scope.showHideColumns = function(gridColumn){ - - if(gridColumn.show){ - $scope.hiddenGridColumns--; - } - else{ - $scope.hiddenGridColumns++; - } - }; -}); + + $scope.showMap = function(event){ + var modalInstance = $modal.open({ + templateUrl: 'views/map.html', + controller: 'MapController', + windowClass: 'modal-full-window', + resolve: { + location: function () { + return {lat: event.coordinate.latitude, lng: event.coordinate.longitude}; + }, + geoJsons: function(){ + return $scope.geoJsons; + } + } + }); + + modalInstance.result.then(function (location) { + if(angular.isObject(location)){ + event.coordinate.latitude = location.lat; + event.coordinate.longitude = location.lng; + } + }, function () { + }); + }; +}); \ No newline at end of file === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/directives.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/directives.js 2014-10-17 14:33:27 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/directives.js 2014-11-03 10:34:14 +0000 @@ -21,13 +21,7 @@ return { restrict: 'A', - link: function(scope, element, attrs){ - - dhis2.ec.store = new dhis2.storage.Store({ - name: EC_STORE_NAME, - adapters: [dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter], - objectStores: ['eventCapturePrograms', 'programStages', 'optionSets'] - }); + link: function(scope, element, attrs){ //when tree has loaded, get selected orgunit - if there is any - and inform angular $(function() { @@ -73,7 +67,7 @@ }); //listen to user selection, and inform angular - selection.setListenerFunction( organisationUnitSelected, true ); + selection.setListenerFunction( organisationUnitSelected ); selection.responseReceived(); function organisationUnitSelected( orgUnits, orgUnitNames ) { @@ -84,7 +78,7 @@ }; }) -.directive('dhisCustomForm', function($compile, $parse, CustomFormService) { +.directive('d2CustomForm', function($compile, $parse, CustomFormService) { return{ restrict: 'E', link: function(scope, elm, attrs){ @@ -101,7 +95,7 @@ }; }) -.directive('dhisContextMenu', function(ContextMenuSelectedItem) { +.directive('d2ContextMenu', function(ContextMenuSelectedItem) { return { restrict: 'A', @@ -153,44 +147,6 @@ }; }) -.directive('ngDate', function($filter) { - return { - restrict: 'A', - require: 'ngModel', - link: function(scope, element, attrs, ctrl) { - element.datepicker({ - changeYear: true, - changeMonth: true, - maxDate: new Date(), - dateFormat: 'yy-mm-dd', - onSelect: function(date) { - ctrl.$setViewValue(date); - $(this).change(); - scope.$apply(); - } - }) - .change(function() { - var rawDate = this.value; - var convertedDate = moment(this.value, 'YYYY-MM-DD')._d; - convertedDate = $filter('date')(convertedDate, 'yyyy-MM-dd'); - - if(rawDate != convertedDate){ - scope.invalidDate = true; - ctrl.$setViewValue(this.value); - ctrl.$setValidity('foo', false); - scope.$apply(); - } - else{ - scope.invalidDate = false; - ctrl.$setViewValue(this.value); - ctrl.$setValidity('foo', true); - scope.$apply(); - } - }); - } - }; -}) - .directive('d2Date', function(DateUtils, CalendarService, storage, $parse) { return { restrict: 'A', @@ -274,15 +230,6 @@ }; }) -.directive('draggableModal', function(){ - return { - restrict: 'EA', - link: function(scope, element) { - element.draggable(); - } - }; -}) - .directive('d2PopOver', function($compile, $templateCache){ return { restrict: 'EA', @@ -306,6 +253,155 @@ }; }) +.directive('d2GoogleMap', function ($parse, $compile, storage) { + return { + restrict: 'E', + replace: true, + template: '
', + link: function(scope, element, attrs){ + + //remove angular bootstrap ui modal draggable + $(".modal-content").draggable({ disabled: true }); + + //get a default center + var latCenter = 12.31, lngCenter = 51.48; + + //if there is any marker already - use it as center + if(angular.isObject(scope.location)){ + if(scope.location.lat && scope.location.lng){ + latCenter = scope.location.lat; + lngCenter = scope.location.lng; + } + } + + //default map configurations + var mapOptions = { + zoom: 3, + center: new google.maps.LatLng(latCenter, lngCenter), + mapTypeId: google.maps.MapTypeId.ROADMAP + },featureStyle = { + strokeWeight: 2, + strokeOpacity: 0.4, + fillOpacity: 0.4, + fillColor: 'green' + }; + + var geojsons = $parse(attrs.geojsons)(scope); + var currentLayer = 0, currentGeojson = geojsons[0]; + + var map = new google.maps.Map(document.getElementById(attrs.id), mapOptions); + var currentGeojsonFeatures = map.data.addGeoJson(currentGeojson); + + var marker = new google.maps.Marker({ + map: map + }); + + if(angular.isObject(scope.location)){ + if(scope.location.lat && scope.location.lng){ + addMarker({lat: scope.location.lat, lng: scope.location.lng}); + } + } + + function addMarker(loc){ + var latLng = new google.maps.LatLng(loc.lat, loc.lng); + marker.setPosition(latLng); + } + + function centerMap(){ + + if(currentGeojson && currentGeojson.features){ + var latLngBounds = new google.maps.LatLngBounds(); + angular.forEach(currentGeojson.features, function(feature){ + if(feature.geometry.type === 'MultiPolygon'){ + angular.forEach(feature.geometry.coordinates[0][0], function(coordinate){ + latLngBounds.extend(new google.maps.LatLng(coordinate[1],coordinate[0])); + }); + } + else if(feature.geometry.type === 'Point'){ + latLngBounds.extend(new google.maps.LatLng(feature.geometry.coordinates[1],feature.geometry.coordinates[0])); + } + }); + + map.fitBounds(latLngBounds); + map.panToBounds(latLngBounds); + } + } + + function initializeMap(){ + google.maps.event.addListenerOnce(map, 'idle', function(){ + google.maps.event.trigger(map, 'resize'); + map.data.setStyle(featureStyle); + centerMap(); + }); + } + + map.data.addListener('mouseover', function(e) { + $("#polygon-label").text( e.feature.k.name ); + map.data.revertStyle(); + map.data.overrideStyle(e.feature, {fillOpacity: 0.8}); + }); + + map.data.addListener('mouseout', function() { + $("#polygon-label").text( '' ); + map.data.revertStyle(); + }); + + //drill-down based on polygons assigned to orgunits + map.data.addListener('rightclick', function(e){ + for (var i = 0; i < currentGeojsonFeatures.length; i++){ + map.data.remove(currentGeojsonFeatures[i]); + } + + if(currentLayer >= geojsons.length-1){ + currentLayer = 0; + currentGeojson = angular.copy(geojsons[currentLayer]); + } + else{ + currentLayer++; + currentGeojson = angular.copy(geojsons[currentLayer]); + currentGeojson.features = []; + var selectedFeatures = []; + angular.forEach(geojsons[currentLayer].features, function(feature){ + if(feature.properties.parent === e.feature.B){ + selectedFeatures.push(feature); + } + }); + + if(selectedFeatures.length){ + currentGeojson.features = selectedFeatures; + } + } + currentGeojsonFeatures = map.data.addGeoJson(currentGeojson); + centerMap(); + }); + + //capturing coordinate from defined polygons + map.data.addListener('click', function(e) { + scope.$apply(function(){ + addMarker({ + lat: e.latLng.lat(), + lng: e.latLng.lng() + }); + $parse(attrs.location).assign(scope.$parent, {lat: e.latLng.lat(), lng: e.latLng.lng()}); + }); + }); + + //capturing coordinate from anywhere in the map - incase no polygons are defined + google.maps.event.addListener(map, 'click', function(e){ + scope.$apply(function(){ + addMarker({ + lat: e.latLng.lat(), + lng: e.latLng.lng() + }); + $parse(attrs.location).assign(scope.$parent, {lat: e.latLng.lat(), lng: e.latLng.lng()}); + }); + }); + + initializeMap(); + } + }; +}) + .directive('serversidePaginator', function factory() { return { restrict: 'E', === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/event-capture.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/event-capture.js 2014-10-22 11:43:51 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/event-capture.js 2014-11-03 10:34:14 +0000 @@ -7,7 +7,7 @@ // Instance of the StorageManager dhis2.ec.storageManager = new StorageManager(); -var EC_STORE_NAME = "dhis2"; +var EC_STORE_NAME = "dhis2ec"; var i18n_no_orgunits = 'No organisation unit attached to current user, no data entry possible'; var i18n_offline_notification = 'You are offline, data will be stored locally'; var i18n_online_notification = 'You are online'; @@ -21,11 +21,10 @@ var EVENT_VALUES = 'EVENT_VALUES'; -dhis2.ec.store = new dhis2.storage.Store({ - name: EC_STORE_NAME, - adapters: [dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter], - objectStores: ['eventCapturePrograms', 'programStages', 'optionSets'] -}); +//var ecDAO = {}; + +dhis2.ec.store = null; +dhis2.ec.memoryOnly = $('html').hasClass('ie7') || $('html').hasClass('ie8'); (function($) { $.safeEach = function(arr, fn) @@ -54,26 +53,11 @@ $('#loaderSpan').show(); $('#orgUnitTree').one('ouwtLoaded', function() - { - var def = $.Deferred(); - var promise = def.promise(); - - promise = promise.then( dhis2.ec.store.open ); - promise = promise.then( getUserProfile ); - promise = promise.then( getCalendarSetting ); - promise = promise.then( getLoginDetails ); - promise = promise.then( getMetaPrograms ); - promise = promise.then( getPrograms ); - promise = promise.then( getProgramStages ); - promise = promise.then( getOptionSets ); - promise.done( function() { - selection.responseReceived(); - }); - - def.resolve(); + { + downloadMetaData(); }); - + $(document).bind('dhis2.online', function(event, loggedIn) { if (loggedIn) @@ -151,6 +135,56 @@ }); } +function downloadMetaData(){ + var adapters = []; + if( dhis2.ec.memoryOnly ) { + adapters = [ dhis2.storage.InMemoryAdapter ]; + } else { + adapters = [ dhis2.storage.IndexedDBAdapter, dhis2.storage.DomLocalStorageAdapter, dhis2.storage.InMemoryAdapter ]; + } + + + dhis2.ec.store = new dhis2.storage.Store({ + name: EC_STORE_NAME, + objectStores: [ + { + name: 'ecPrograms', + adapters: adapters + }, + { + name: 'programStages', + adapters: adapters + }, + { + name: 'geoJsons', + adapters: adapters + }, + { + name: 'optionSets', + adapters: adapters + } + ] + }); + + var def = $.Deferred(); + var promise = def.promise(); + + promise = promise.then( dhis2.ec.store.open ); + promise = promise.then( getUserProfile ); + promise = promise.then( getCalendarSetting ); + promise = promise.then( getLoginDetails ); + promise = promise.then( getOrgUnitLevels ); + promise = promise.then( getGeoJsonsByLevel ); + promise = promise.then( getMetaPrograms ); + promise = promise.then( getPrograms ); + promise = promise.then( getProgramStages ); + promise = promise.then( getOptionSets ); + promise.done( function() { + selection.responseReceived(); + }); + + def.resolve(); +} function getUserProfile() { @@ -197,6 +231,89 @@ return def.promise(); } +function getOrgUnitLevels() +{ + var def = $.Deferred(); + + $.ajax({ + url: '../api/organisationUnitLevels.json', + type: 'GET', + data:'filter=level:gt:1&fields=id,name,level&paging=false' + }).done( function(response) { + var ouLevels = []; + if(response.organisationUnitLevels){ + ouLevels = _.sortBy(response.organisationUnitLevels, function(ouLevel){ + return ouLevel.level; + }); + } + def.resolve( ouLevels ); + }); + + return def.promise(); +} + +function getGeoJsonsByLevel( ouLevels ) +{ + if( !ouLevels ){ + return; + } + + var mainDef = $.Deferred(); + var mainPromise = mainDef.promise(); + + var def = $.Deferred(); + var promise = def.promise(); + + var builder = $.Deferred(); + var build = builder.promise(); + + _.each( _.values( ouLevels ), function ( ouLevel ) { + if(ouLevel.level){ + build = build.then(function() { + var d = $.Deferred(); + var p = d.promise(); + dhis2.ec.store.get('geoJsons', ouLevel.level).done(function(obj) { + if(!obj) { + promise = promise.then( getGeoJson( ouLevel.level ) ); + } + d.resolve(); + }); + + return p; + }); + } + }); + + build.done(function() { + def.resolve(); + + promise = promise.done( function () { + mainDef.resolve(); + } ); + }); + + builder.resolve(); + + return mainPromise; +} + +function getGeoJson( level ) +{ + return function() { + return $.ajax( { + url: '../api/organisationUnits.geojson', + type: 'GET', + data: 'level=' + level + }).done( function( response ){ + + var geojson = {}; + geojson = response; + geojson.id = level; + dhis2.ec.store.set( 'geoJsons', geojson ); + }); + }; +} + function getMetaPrograms() { var def = $.Deferred(); @@ -208,15 +325,7 @@ }).done( function(response) { var programs = []; _.each( _.values( response.programs ), function ( program ) { - programs.push(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 ); @@ -244,7 +353,7 @@ build = build.then(function() { var d = $.Deferred(); var p = d.promise(); - dhis2.ec.store.get('eventCapturePrograms', program.id).done(function(obj) { + dhis2.ec.store.get('ecPrograms', program.id).done(function(obj) { if(!obj || obj.version !== program.version) { promise = promise.then( getProgram( program.id ) ); } @@ -293,7 +402,7 @@ program.userRoles = ur; - dhis2.ec.store.set( 'eventCapturePrograms', program ); + dhis2.ec.store.set( 'ecPrograms', program ); }); }); === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/services.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/services.js 2014-10-22 11:43:51 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/scripts/services.js 2014-11-03 10:34:14 +0000 @@ -7,9 +7,9 @@ .factory('StorageService', function(){ var store = new dhis2.storage.Store({ - name: 'dhis2', + name: 'dhis2ec', adapters: [dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter], - objectStores: ['eventCapturePrograms', 'programStages', 'optionSets'] + objectStores: ['ecPrograms', 'programStages', 'geoJsons', 'optionSets'] }); return{ currentStore: store @@ -84,8 +84,60 @@ }) +/* factory for fetching selected orgunit's coordinate */ +.factory('OrgUnitService', function($http) { + + var orgUnitId, promise; + return { + get: function(id) { + if( !promise && id !== orgUnitId){ + promise = $http.get('../api/me/profile').then(function(response){ + orgUnitId = id; + return response.data;; + }); + } + return promise; + } + }; +}) + + +/* Factory to fetch geojsons */ +.factory('GeoJsonFactory', function($q, $rootScope, StorageService) { + return { + getAll: function(){ + + //console.log('I am trying to fetch geojsons'); + var def = $q.defer(); + + StorageService.currentStore.open().done(function(){ + StorageService.currentStore.getAll('geoJsons').done(function(geoJsons){ + $rootScope.$apply(function(){ + def.resolve(geoJsons); + }); + }); + }); + + return def.promise; + }, + get: function(level){ + + var def = $q.defer(); + + StorageService.currentStore.open().done(function(){ + StorageService.currentStore.get('geoJsons', level).done(function(geoJson){ + $rootScope.$apply(function(){ + def.resolve(geoJson); + }); + }); + }); + return def.promise; + } + }; +}) + /* Factory to fetch optioSets */ -.factory('OptionSetFactory', function($q, $rootScope, StorageService) { +.factory('OptionSetService', function($q, $rootScope, StorageService) { return { getAll: function(){ @@ -113,18 +165,29 @@ }); }); return def.promise; + }, + getNameOrCode: function(options, key){ + var val = key; + + if(options){ + for(var i=0; i .list-group { - margin-bottom: 0 + margin-bottom: 0 } .panel > .list-group .list-group-item { - border-width: 1px 0 + border-width: 1px 0 } .panel > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0 + border-top-right-radius: 0; + border-top-left-radius: 0 } .panel > .list-group .list-group-item:last-child { - border-bottom: 0 + border-bottom: 0 } .panel-heading+ .list-group .list-group-item:first-child { - border-top-width: 0 + border-top-width: 0 } .panel > .table, .panel > .table-responsive { - margin-bottom: 0 + margin-bottom: 0 } .panel > .panel-body+ .table, .panel > .panel-body+ .table-responsive { - border-top: 1px solid #ddd + border-top: 1px solid #ddd } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { - border: 0 + border: 0 } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0 + border-left: 0 } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0 + border-right: 0 } .panel > .table-bordered > thead > tr:last-child > th, .panel > .table-responsive > .table-bordered > thead > tr:last-child > th, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, .panel > .table-bordered > thead > tr:last-child > td, .panel > .table-responsive > .table-bordered > thead > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0 + border-bottom: 0 } .panel-heading { - padding: 5px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px + padding: 5px; + border-bottom: 1px solid transparent; + border-top-right-radius: 3px; + border-top-left-radius: 3px } .panel-heading > .dropdown .dropdown-toggle { - color: inherit + color: inherit } .panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px + margin-top: 0; + margin-bottom: 0; + font-size: 16px } .panel-title > a { - color: inherit + color: inherit } .panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px } .panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px + margin-bottom: 0; + overflow: hidden; + border-radius: 4px } .panel-group .panel+ .panel { - margin-top: 5px + margin-top: 5px } .panel-group .panel-heading { - border-bottom: 0 + border-bottom: 0 } .panel-group .panel-heading+ .panel-collapse .panel-body { - border-top: 1px solid #ddd + border-top: 1px solid #ddd } .panel-group .panel-footer { - border-top: 0 + border-top: 0 } .panel-group .panel-footer+ .panel-collapse .panel-body { - border-bottom: 1px solid #ddd + border-bottom: 1px solid #ddd } .panel-default { - border-color: #ddd + border-color: #ddd } .panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd + color: #333; + background-color: #f5f5f5; + border-color: #ddd } .panel-default > .panel-heading+ .panel-collapse .panel-body { - border-top-color: #ddd + border-top-color: #ddd } .panel-default > .panel-heading > .dropdown .caret { - border-color: #333 transparent + border-color: #333 transparent } .panel-default > .panel-footer+ .panel-collapse .panel-body { - border-bottom-color: #ddd + border-bottom-color: #ddd } .panel-primary { - border-color: #428bca + border-color: #428bca } .panel-primary > .panel-heading { - color: #fff; - background-color: #428bca; - border-color: #428bca + color: #fff; + background-color: #428bca; + border-color: #428bca } .panel-primary > .panel-heading+ .panel-collapse .panel-body { - border-top-color: #428bca + border-top-color: #428bca } .panel-primary > .panel-heading > .dropdown .caret { - border-color: #fff transparent + border-color: #fff transparent } .panel-primary > .panel-footer+ .panel-collapse .panel-body { - border-bottom-color: #428bca + border-bottom-color: #428bca } .panel-success { - border-color: #d6e9c6 + border-color: #d6e9c6 } .panel-success > .panel-heading { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6 + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 } .panel-success > .panel-heading+ .panel-collapse .panel-body { - border-top-color: #d6e9c6 + border-top-color: #d6e9c6 } .panel-success > .panel-heading > .dropdown .caret { - border-color: #468847 transparent + border-color: #468847 transparent } .panel-success > .panel-footer+ .panel-collapse .panel-body { - border-bottom-color: #d6e9c6 + border-bottom-color: #d6e9c6 } .panel-warning { - border-color: #faebcc + border-color: #faebcc } .panel-warning > .panel-heading { - color: #c09853; - background-color: #fcf8e3; - border-color: #faebcc + color: #c09853; + background-color: #fcf8e3; + border-color: #faebcc } .panel-warning > .panel-heading+ .panel-collapse .panel-body { - border-top-color: #faebcc + border-top-color: #faebcc } .panel-warning > .panel-heading > .dropdown .caret { - border-color: #c09853 transparent + border-color: #c09853 transparent } .panel-warning > .panel-footer+ .panel-collapse .panel-body { - border-bottom-color: #faebcc + border-bottom-color: #faebcc } .panel-danger { - border-color: #ebccd1 + border-color: #ebccd1 } .panel-danger > .panel-heading { - color: #b94a48; - background-color: #f2dede; - border-color: #ebccd1 + color: #b94a48; + background-color: #f2dede; + border-color: #ebccd1 } .panel-danger > .panel-heading+ .panel-collapse .panel-body { - border-top-color: #ebccd1 + border-top-color: #ebccd1 } .panel-danger > .panel-heading > .dropdown .caret { - border-color: #b94a48 transparent + border-color: #b94a48 transparent } .panel-danger > .panel-footer+ .panel-collapse .panel-body { - border-bottom-color: #ebccd1 + border-bottom-color: #ebccd1 } .panel-info { - border-color: #bce8f1 + border-color: #bce8f1 } .panel-info > .panel-heading { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1 + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 } .panel-info > .panel-heading+ .panel-collapse .panel-body { - border-top-color: #bce8f1 + border-top-color: #bce8f1 } .panel-info > .panel-heading > .dropdown .caret { - border-color: #3a87ad transparent + border-color: #3a87ad transparent } .panel-info > .panel-footer+ .panel-collapse .panel-body { - border-bottom-color: #bce8f1 + border-bottom-color: #bce8f1 } .dropdown { === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/customForm.html' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/customForm.html 2014-10-17 14:33:27 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/customForm.html 2014-11-03 10:34:14 +0000 @@ -26,36 +26,38 @@ - {{'latitude'| translate}} + {{'lat_lng' | translate}} - + - {{'number_required'| translate}} [-90 ... 90] - - - - - {{'longitude'| translate}} - - - + {{'number_required'| translate}} [-90 ... 90] + + + - {{'number_required'| translate}}[-180 ... 180] - + style="width:100%;"/> + {{'number_required'| translate}}[-180 ... 180] + + + - +

=== modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/defaultForm.html' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/defaultForm.html 2014-10-21 07:53:37 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/defaultForm.html 2014-11-03 10:34:14 +0000 @@ -38,34 +38,36 @@ - {{'latitude'| translate}} + {{'lat_lng' | translate}} - + - {{'number_required'| translate}} [-90 ... 90] - - - - - {{'longitude'| translate}} - - - + {{'number_required'| translate}} [-90 ... 90] + + + - {{'number_required'| translate}}[-180 ... 180] - - + style="width:100%;"/> + {{'number_required'| translate}}[-180 ... 180] + + + + {{eventGridColumn.name}} === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/eventList.html' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/eventList.html 2014-10-17 14:33:27 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-event-capture/views/eventList.html 2014-11-03 10:34:14 +0000 @@ -98,7 +98,7 @@ - - + === 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-10-23 14:40:31 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/controllers.js 2014-11-03 10:34:14 +0000 @@ -11,7 +11,7 @@ Paginator, TranslationService, storage, - OptionSetFactory, + OptionSetService, OperatorFactory, ProgramFactory, AttributesFactory, @@ -62,7 +62,7 @@ if(!$scope.optionSets){ $scope.optionSets = {optionSets: [], optionNamesByCode: new Object(), optionCodesByName: new Object()}; - OptionSetFactory.getAll().then(function(optionSets){ + OptionSetService.getAll().then(function(optionSets){ angular.forEach(optionSets, function(optionSet){ angular.forEach(optionSet.options, function(option){ if(option.name && option.code){ === 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-10-23 16:54:30 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/services.js 2014-11-03 10:34:14 +0000 @@ -7,9 +7,9 @@ .factory('StorageService', function(){ var store = new dhis2.storage.Store({ - name: "dhis2", + name: "dhis2tc", adapters: [dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter], - objectStores: ['trackerCapturePrograms', 'programStages', 'trackedEntities', 'trackedEntityForms', 'attributes','optionSets'] + objectStores: ['tcPrograms', 'programStages', 'trackedEntities', 'trackedEntityForms', 'attributes','optionSets'] }); return{ currentStore: store @@ -17,7 +17,7 @@ }) /* Factory to fetch optioSets */ -.factory('OptionSetFactory', function($q, $rootScope, StorageService) { +.factory('OptionSetService', function($q, $rootScope, StorageService) { return { getAll: function(){ @@ -107,7 +107,7 @@ var def = $q.defer(); StorageService.currentStore.open().done(function(){ - StorageService.currentStore.getAll('trackerCapturePrograms').done(function(programs){ + StorageService.currentStore.getAll('tcPrograms').done(function(programs){ $rootScope.$apply(function(){ def.resolve(programs); }); @@ -121,7 +121,7 @@ var def = $q.defer(); StorageService.currentStore.open().done(function(){ - StorageService.currentStore.get('trackerCapturePrograms', uid).done(function(pr){ + StorageService.currentStore.get('tcPrograms', uid).done(function(pr){ $rootScope.$apply(function(){ def.resolve(pr); }); @@ -1230,8 +1230,8 @@ var columns = attributes ? angular.copy(attributes) : []; //also add extra columns which are not part of attributes (orgunit for example) - columns.push({id: 'orgUnitName', name: $translate('registering_unit'), type: 'string', displayInListNoProgram: false}); - columns.push({id: 'created', name: $translate('registration_date'), type: 'date', displayInListNoProgram: false}); + columns.push({id: 'orgUnitName', name: $translate('registering_unit'), valueType: 'string', displayInListNoProgram: false}); + columns.push({id: 'created', name: $translate('registration_date'), valueType: 'date', displayInListNoProgram: false}); //generate grid column for the selected program/attributes angular.forEach(columns, function(column){ @@ -1467,4 +1467,4 @@ return dhis2CalendarFormat; } }; -}); \ No newline at end of file +}); === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js 2014-10-23 14:40:31 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js 2014-11-03 10:34:14 +0000 @@ -6,7 +6,7 @@ // Instance of the StorageManager dhis2.tc.storageManager = new StorageManager(); -var TC_STORE_NAME = "dhis2"; +var TC_STORE_NAME = "dhis2tc"; var i18n_no_orgunits = 'No organisation unit attached to current user, no data entry possible'; var i18n_offline_notification = 'You are offline, data will be stored locally'; var i18n_online_notification = 'You are online'; @@ -22,11 +22,8 @@ var optionSetsInPromise = []; -dhis2.tc.store = new dhis2.storage.Store({ - name: TC_STORE_NAME, - adapters: [dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter], - objectStores: ['trackerCapturePrograms', 'programStages', 'trackedEntities', 'trackedEntityForms', 'attributes', 'relationshipTypes', 'optionSets'] -}); +dhis2.tc.store = null; +dhis2.tc.memoryOnly = $('html').hasClass('ie7') || $('html').hasClass('ie8'); (function($) { $.safeEach = function(arr, fn) @@ -55,28 +52,7 @@ $('#orgUnitTree').one('ouwtLoaded', function() { - var def = $.Deferred(); - var promise = def.promise(); - - promise = promise.then( dhis2.tc.store.open ); - promise = promise.then( getUserProfile ); - promise = promise.then( getCalendarSetting ); - promise = promise.then( getLoginDetails ); - promise = promise.then( getRelationships ); - promise = promise.then( getAttributes ); - promise = promise.then( getOptionSetsForAttributes ); - promise = promise.then( getTrackedEntities ); - promise = promise.then( getMetaPrograms ); - promise = promise.then( getPrograms ); - promise = promise.then( getProgramStages ); - promise = promise.then( getOptionSetsForPrograms ); - promise = promise.then( getMetaTrackedEntityForms ); - promise = promise.then( getTrackedEntityForms ); - promise.done(function() { - selection.responseReceived(); - }); - - def.resolve(); + loadMetaData(); }); @@ -185,6 +161,80 @@ }); } +function loadMetaData() +{ + /*dhis2.tc.store = new dhis2.storage.Store({ + name: TC_STORE_NAME, + adapters: [dhis2.storage.IndexedDBAdapter, dhis2.storage.DomSessionStorageAdapter, dhis2.storage.InMemoryAdapter], + objectStores: ['tcPrograms', 'programStages', 'trackedEntities', 'trackedEntityForms', 'attributes', 'relationshipTypes', 'optionSets'] + });*/ + + var adapters = []; + if( dhis2.tc.memoryOnly ) { + adapters = [ dhis2.storage.InMemoryAdapter ]; + } else { + adapters = [ dhis2.storage.IndexedDBAdapter, dhis2.storage.DomLocalStorageAdapter, dhis2.storage.InMemoryAdapter ]; + } + + dhis2.tc.store = new dhis2.storage.Store({ + name: TC_STORE_NAME, + objectStores: [ + { + name: 'tcPrograms', + adapters: adapters + }, + { + name: 'programStages', + adapters: adapters + }, + { + name: 'trackedEntities', + adapters: adapters + }, + { + name: 'trackedEntityForms', + adapters: adapters + }, + { + name: 'attributes', + adapters: adapters + }, + { + name: 'relationshipTypes', + adapters: adapters + }, + { + name: 'optionSets', + adapters: adapters + } + ] + }); + + + var def = $.Deferred(); + var promise = def.promise(); + + promise = promise.then( dhis2.tc.store.open ); + promise = promise.then( getUserProfile ); + promise = promise.then( getCalendarSetting ); + promise = promise.then( getLoginDetails ); + promise = promise.then( getRelationships ); + promise = promise.then( getAttributes ); + promise = promise.then( getOptionSetsForAttributes ); + promise = promise.then( getTrackedEntities ); + promise = promise.then( getMetaPrograms ); + promise = promise.then( getPrograms ); + promise = promise.then( getProgramStages ); + promise = promise.then( getOptionSetsForPrograms ); + promise = promise.then( getMetaTrackedEntityForms ); + promise = promise.then( getTrackedEntityForms ); + promise.done(function() { + selection.responseReceived(); + }); + + def.resolve(); +} + function getUserProfile() { var def = $.Deferred(); @@ -369,7 +419,7 @@ build = build.then(function() { var d = $.Deferred(); var p = d.promise(); - dhis2.tc.store.get('trackerCapturePrograms', program.id).done(function(obj) { + dhis2.tc.store.get('tcPrograms', program.id).done(function(obj) { if(!obj || obj.version !== program.version) { promise = promise.then( getProgram( program.id ) ); } @@ -419,7 +469,7 @@ program.userRoles = ur; - dhis2.tc.store.set( 'trackerCapturePrograms', program ); + dhis2.tc.store.set( 'tcPrograms', program ); }); });