------------------------------------------------------------ revno: 18582 committer: Abyot Asalefew Gizaw <aby...@gmail.com> branch nick: dhis2 timestamp: Wed 2015-03-11 12:21:40 +0100 message: tracker-capture: possibility to filter events in data entry widget modified: 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.html dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/enrollment/enrollment-controller.js 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/scripts/services.js dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/styles/style.css
-- lp:dhis2 https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk Your team DHIS 2 developers is subscribed to branch lp:dhis2. To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== 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 2015-03-10 10:07:03 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dataentry/dataentry-controller.js 2015-03-11 11:21:40 +0000 @@ -1,6 +1,7 @@ trackerCapture.controller('DataEntryController', function($scope, $modal, + $filter, DateUtils, EventUtils, orderByFilter, @@ -10,13 +11,16 @@ OptionSetService, ModalService, CurrentSelection, - CustomFormService) { - + CustomFormService, + PeriodService) { //Data entry form $scope.dataEntryOuterForm = {}; $scope.displayCustomForm = false; $scope.currentElement = {}; $scope.schedulingEnabled = false; + $scope.eventPeriods = []; + $scope.currentPeriod = []; + $scope.filterEvents = true; var loginDetails = storage.get('LOGIN_DETAILS'); var storedBy = ''; @@ -60,7 +64,7 @@ $scope.selectedEnrollment = selections.selectedEnrollment; $scope.optionSets = selections.optionSets; - $scope.selectedProgramWithStage = []; + $scope.stagesById = []; if($scope.selectedOrgUnit && $scope.selectedProgram && $scope.selectedProgram.id && $scope.selectedEntity && $scope.selectedEnrollment && $scope.selectedEnrollment.enrollment){ ProgramStageFactory.getByProgram($scope.selectedProgram).then(function(stages){ $scope.programStages = stages; @@ -73,7 +77,7 @@ $scope.prStDes[prStDe.dataElement.id] = prStDe; }); - $scope.selectedProgramWithStage[stage.id] = stage; + $scope.stagesById[stage.id] = stage; $scope.eventsByStage[stage.id] = []; }); $scope.getEvents(); @@ -93,7 +97,7 @@ }); } - var eventStage = $scope.selectedProgramWithStage[dhis2Event.programStage]; + var eventStage = $scope.stagesById[dhis2Event.programStage]; if(angular.isObject(eventStage)){ dhis2Event.name = eventStage.name; @@ -152,6 +156,9 @@ templateUrl: 'components/dataentry/new-event.html', controller: 'EventCreationController', resolve: { + stagesById: function(){ + return $scope.stagesById; + }, dummyEvent: function(){ return dummyEvent; }, @@ -224,7 +231,7 @@ $scope.getDataEntryForm = function(){ - $scope.currentStage = $scope.selectedProgramWithStage[$scope.currentEvent.programStage]; + $scope.currentStage = $scope.stagesById[$scope.currentEvent.programStage]; angular.forEach($scope.currentStage.programStageSections, function(section){ section.open = true; @@ -667,18 +674,40 @@ return "width: " + width + '%'; }; + $scope.sortEventsByDate = function(dhis2Event){ + var d = dhis2Event.sortingDate; + return DateUtils.getDate(d); + }; + var sortEventsByStage = function(){ - for(var key in $scope.eventsByStage){ - if($scope.eventsByStage.hasOwnProperty(key)){ - $scope.eventsByStage[key] = orderByFilter($scope.eventsByStage[key], '-sortingDate').reverse(); - $scope.totalEvents += $scope.eventsByStage[key].length <=1 ? 1:$scope.eventsByStage[key].length; - - console.log('the stage: ', key); - angular.forEach($scope.eventsByStage[key], function(stage){ - console.log('event: ', stage.sortingDate); - }); - } - } + $scope.eventFilteringRequired = false; + for(var key in $scope.eventsByStage){ + var stage = $scope.stagesById[key]; + if($scope.eventsByStage.hasOwnProperty(key) && stage){ + var sortedEvents = $filter('orderBy')($scope.eventsByStage[key], function(event) { + return DateUtils.getDate(event.sortingDate); + }); + var periods = PeriodService.getPeriods(sortedEvents, stage); + $scope.eventPeriods[key] = periods; + $scope.currentPeriod[key] = periods.length > 0 ? periods[0] : null; + $scope.eventFilteringRequired = $scope.eventFilteringRequired ? $scope.eventFilteringRequired : periods.length > 1; + } + } + }; + + $scope.showDataEntryForEvent = function(period){ + var event = null; + for(var i=0; i<$scope.eventsByStage[period.stage].length; i++){ + if($scope.eventsByStage[period.stage][i].event === period.event){ + event = $scope.eventsByStage[period.stage][i]; + break; + } + } + + if(event){ + $scope.showDataEntry(event, false); + } + }; $scope.showMap = function(event){ @@ -711,9 +740,11 @@ DateUtils, DHIS2EventFactory, DialogService, + stagesById, dummyEvent, programId, trackedEntityInstanceId){ + $scope.stagesById = stagesById; $scope.programStageId = dummyEvent.programStage; $scope.programId = programId; $scope.orgUnitId = dummyEvent.orgUnit; @@ -724,7 +755,7 @@ $scope.dueDateInvalid = false; $scope.eventDateInvalid = false; - //watch for changes in eventDate + //watch for changes in due/event-date $scope.$watchCollection('[dhis2Event.dueDate, dhis2Event.eventDate]', function() { if(angular.isObject($scope.dhis2Event)){ if(!$scope.dhis2Event.dueDate){ @@ -765,8 +796,9 @@ notes: [], dataValues: [], status: 'ACTIVE' - }; - newEvents.events.push(newEvent); + }; + newEvents.events.push(newEvent); + DHIS2EventFactory.create(newEvents).then(function(data){ if (data.importSummaries[0].status === 'ERROR') { var dialogOptions = { @@ -781,6 +813,7 @@ $modalInstance.close(newEvent); } }); + }; $scope.cancel = function(){ === 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 2015-03-09 15:56:34 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dataentry/dataentry.html 2015-03-11 11:21:40 +0000 @@ -3,7 +3,8 @@ {{dataentryWidget.title| translate}} <span class="pull-right widget-link"> - <a href ng-click="toggleLegend()" title="{{'event_color_legend'| translate}}"><i class="fa fa-info-circle vertical-center"></i></a> + <a href ng-click="filterEvents = !filterEvents" title="{{filterEvents ? 'list_events' : 'filter_events' | translate}}" ng-show="eventFilteringRequired"><span ng-if="!filterEvents"><i class="fa fa-filter vertical-center"></i></span><span ng-if="filterEvents"><i class="fa fa-list vertical-center"></i></span></a> + <a href ng-click="toggleLegend()" title="{{'event_color_legend'| translate}}" class="small-horizonal-spacing"><i class="fa fa-info-circle vertical-center"></i></a> <a class="small-horizonal-spacing" href ng-click="expandCollapse(dataentryWidget)"> <span ng-show="dataentryWidget.expand"><i class="fa fa-chevron-up vertical-center" title="{{'collapse'| translate}}"></i></span> <span ng-show="!dataentryWidget.expand"><i class="fa fa-chevron-down vertical-center" title="{{'expand'| translate}}"></i></span> @@ -20,7 +21,7 @@ <td ng-class="eventColor.color" ng-repeat="eventColor in eventColors"> <span class="bold">{{eventColor.description| translate}}</span> </td> - </tr> + </tr> </table> </div> @@ -28,17 +29,21 @@ <table class="table table-bordered"> <thead> <tr> - <th class="active" ng-class="getColumnWidth(eventsByStage[stage.id].length)" ng-repeat="stage in programStages| orderBy:'sortOrder':reverse"> + <th class="active" style="vertical-align:middle" ng-repeat="stage in programStages| orderBy:'sortOrder':reverse"> {{stage.name}} + <div ng-if="eventsByStage[stage.id].length > 1 && filterEvents" class="inline-block small-horizonal-spacing"> + <select class="form-control-inline" + ng-model="currentPeriod[stage.id]" + ng-change="showDataEntryForEvent(currentPeriod[stage.id])" + ng-options="period.name for period in eventPeriods[stage.id]"> + </select> + </div> <!-- event add/filter icon begins --> <span class='pull-right'> <span ng-if="stageNeedsEvent(stage)"> - <a href title="{{'create_new_event'| translate}}" ng-click="showCreateEvent(stage)"><i class="fa fa-plus"></i></a> + <a href title="{{'create_new_event'| translate}}" ng-click="showCreateEvent(stage)" style="vertical-align:middle"><i class="fa fa-plus"></i></a> </span> - <span class="small-horizonal-spacing" ng-if="eventsByStage[stage.id].length > 1"> - <a href title="{{'filter'| translate}}"><i class="fa fa-search"></i></a> - </span> </span> <!-- event add/filter icon ends --> </th> @@ -47,15 +52,15 @@ <tbody> <tr> <td ng-repeat="stage in programStages| orderBy:'sortOrder':reverse"> - <div class="inline-block" ng-repeat="dhis2Event in eventsByStage[stage.id]"> + <div class="inline-block" ng-repeat="dhis2Event in eventsByStage[stage.id] | orderBy:sortEventsByDate:reverse"> <div class="event-container" ng-class="getEventStyle(dhis2Event)" + ng-show="!currentPeriod[stage.id] || !filterEvents || currentPeriod[stage.id] && currentPeriod[stage.id].event === dhis2Event.event" ng-click="showDataEntry(dhis2Event, false)"> {{dhis2Event.orgUnitName}}<br/> {{dhis2Event.sortingDate}}<br> - <span ng-if="eventsByStage[stage.id].length > 1">[{{$index + 1}}]</span> + <span ng-if="eventsByStage[stage.id].length > 1 && !filterEvents">[{{$index + 1}}]</span> </div> - <!--<i class="fa fa-arrow-right" ng-if="$index < eventsByStage[stage.id].length - 1"></i>--> </div> </td> </tr> === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/enrollment/enrollment-controller.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/enrollment/enrollment-controller.js 2015-03-09 16:23:47 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/enrollment/enrollment-controller.js 2015-03-11 11:21:40 +0000 @@ -47,9 +47,9 @@ if($scope.selectedProgram){ - $scope.selectedProgramWithStage = []; + $scope.stagesById = []; angular.forEach($scope.selectedProgram.programStages, function(stage){ - $scope.selectedProgramWithStage[stage.id] = stage; + $scope.stagesById[stage.id] = stage; }); angular.forEach($scope.enrollments, function(enrollment){ === 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 2015-03-06 10:08:41 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/i18n/i18n_app.properties 2015-03-11 11:21:40 +0000 @@ -281,4 +281,18 @@ zoom_in=Zoom in zoom_out=Zoom out center_map=Center map -capture_coordinate=Capture coordinate \ No newline at end of file +capture_coordinate=Capture coordinate +filter_events=Filter events +list_events=List all events +jan=January +feb=February +mar=March +apr=April +may=May +jun=June +jul=July +aug=August +sep=September +oct=October +nov=November +dec=December \ No newline at end of file === 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 2015-03-10 08:12:33 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/services.js 2015-03-11 11:21:40 +0000 @@ -48,6 +48,62 @@ }; }) +/* current selections */ +.service('PeriodService', function($translate, CalendarService){ + + var calendarSetting = CalendarService.getSetting(); + var months = [ + $translate('jan'), + $translate('feb'), + $translate('mar'), + $translate('apr'), + $translate('may'), + $translate('jun'), + $translate('jul'), + $translate('aug'), + $translate('sep'), + $translate('oct'), + $translate('nov'), + $translate('dec') + ]; + + this.getMonths = function(){ + return months; + }; + + this.getPeriods = function(events, stage){ + var periods = []; + if(stage){ + angular.forEach(events, function(event){ + periods.push({event: event.event, name: event.sortingDate, stage: stage.id}); + }); + /*if(stage.standardInterval === 30){ + angular.forEach(events, function(event){ + var obj = {year: moment(event.sortingDate, calendarSetting.momentFormat).year(), month: moment(event.sortingDate, calendarSetting.momentFormat).month(), week: moment(event.sortingDate, calendarSetting.momentFormat).week(), day: moment(event.sortingDate, calendarSetting.momentFormat).day()}; + periods.push({event: event.event, name: months[obj.month] + ' ' + obj.year, stage: stage.id}); + }); + } + else{ + angular.forEach(events, function(event){ + periods.push({event: event.event, name: event.sortingDate, stage: stage.id}); + }); + }*/ + } + + return periods; + }; + + + this.splitDate = function(dateValue){ + if(!dateValue){ + return; + } + var calendarSetting = CalendarService.getSetting(); + + return {year: moment(dateValue, calendarSetting.momentFormat).year(), month: moment(dateValue, calendarSetting.momentFormat).month(), week: moment(dateValue, calendarSetting.momentFormat).week(), day: moment(dateValue, calendarSetting.momentFormat).day()}; + }; +}) + /* Factory to fetch optionSets */ .factory('OptionSetService', function($q, $rootScope, TCStorageService) { return { === 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 2015-03-05 15:48:50 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/styles/style.css 2015-03-11 11:21:40 +0000 @@ -89,6 +89,8 @@ .vertical-center { line-height: inherit; + vertical-align: middle; + } .empty-event-container { @@ -463,6 +465,7 @@ padding-left: 5px; padding-right: 5px; } + .advanced-search-container-main { width: 100%; float: left; @@ -668,6 +671,21 @@ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } +.form-control-inline { + color: #555; + padding: 6px 6px; + vertical-align: middle; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} + + .form-control-program { width: 40%; height: 34px; @@ -711,6 +729,29 @@ background-color: #eee } +.form-control-inline:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px rgba(102,175,233,0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px rgba(102,175,233,0.6) +} +.form-control-inline:-moz-placeholder { + color: #999 +} +.form-control-inline::-moz-placeholder { + color: #999 +} +.form-control-inline:-ms-input-placeholder { + color: #999 +} +.form-control-inline::-webkit-input-placeholder { + color: #999 +} +.form-control-inline[disabled], .form-control-inline[readonly], fieldset[disabled] .form-control-inline { + cursor: not-allowed; + background-color: #eee +} + .form-control-select2 { display: block; width: 100%;
_______________________________________________ Mailing list: https://launchpad.net/~dhis2-devs Post to : dhis2-devs@lists.launchpad.net Unsubscribe : https://launchpad.net/~dhis2-devs More help : https://help.launchpad.net/ListHelp