=== 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 2015-02-06 20:22:45 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dashboard/dashboard-controller.js 2015-02-09 17:04:31 +0000 @@ -3,53 +3,91 @@ function($rootScope, $scope, $location, + $route, $modal, $timeout, + $filter, + orderByFilter, storage, TEIService, TEService, OptionSetService, EnrollmentService, ProgramFactory, + DashboardLayoutService, CurrentSelection) { - //dashboard items - $rootScope.dashboardWidgets = []; - $rootScope.dashboardStatus = []; - $scope.widgetsChanged = []; - - $rootScope.enrollmentWidget = {title: 'enrollment', view: "components/enrollment/enrollment.html", show: true, expand: true, parent: 'biggerWidget', order: 0}; - $rootScope.dataentryWidget = {title: 'dataentry', view: "components/dataentry/dataentry.html", show: true, expand: true, parent: 'biggerWidget', order: 1}; - $rootScope.reportWidget = {title: 'report', view: "components/report/tei-report.html", show: true, expand: true, parent: 'biggerWidget', order: 2}; - $rootScope.selectedWidget = {title: 'current_selections', view: "components/selected/selected.html", show: false, expand: true, parent: 'smallerWidget', order: 0}; - $rootScope.profileWidget = {title: 'profile', view: "components/profile/profile.html", show: true, expand: true, parent: 'smallerWidget', order: 1}; - $rootScope.relationshipWidget = {title: 'relationships', view: "components/relationship/relationship.html", show: true, expand: true, parent: 'smallerWidget', order: 2}; - $rootScope.notesWidget = {title: 'notes', view: "components/notes/notes.html", show: true, expand: true, parent: 'smallerWidget', order: 3}; - - $scope.dashboardStatus['enrollment'] = {title: 'enrollment', view: "components/enrollment/enrollment.html", show: true, expand: true, parent: 'biggerWidget', order: 0}; - $scope.dashboardStatus['dataentry'] = {title: 'dataentry', view: "components/dataentry/dataentry.html", show: true, expand: true, parent: 'biggerWidget', order: 1}; - $scope.dashboardStatus['report'] = {title: 'report', view: "components/report/tei-report.html", show: true, expand: true, parent: 'biggerWidget', order: 2}; - $scope.dashboardStatus['current_selections'] = {title: 'current_selections', view: "components/selected/selected.html", show: false, expand: true, parent: 'smallerWidget', order: 0}; - $scope.dashboardStatus['profile'] = {title: 'profile', view: "components/profile/profile.html", show: true, expand: true, parent: 'smallerWidget', order: 1}; - $scope.dashboardStatus['relationships'] = {title: 'relationships', view: "components/relationship/relationship.html", show: true, expand: true, parent: 'smallerWidget', order: 2}; - $scope.dashboardStatus['notes'] = {title: 'notes', view: "components/notes/notes.html", show: true, expand: true, parent: 'smallerWidget', order: 3}; - - $scope.dashboardWidgetsOrder = {biggerWidgets: ['enrollment', 'dataentry', 'report'], smallerWidgets: ['current_selections', 'profile', 'relationships', 'notes']}; - - $rootScope.dashboardWidgets.push($rootScope.enrollmentWidget); - $rootScope.dashboardWidgets.push($rootScope.dataentryWidget); - $rootScope.dashboardWidgets.push($rootScope.reportWidget); - $rootScope.dashboardWidgets.push($rootScope.selectedWidget); - $rootScope.dashboardWidgets.push($rootScope.profileWidget); - $rootScope.dashboardWidgets.push($rootScope.relationshipWidget); - $rootScope.dashboardWidgets.push($rootScope.notesWidget); - //selections $scope.selectedTeiId = ($location.search()).tei; $scope.selectedProgramId = ($location.search()).program; $scope.selectedOrgUnit = storage.get('SELECTED_OU'); - $scope.selectedProgram; - $scope.selectedTei; + $scope.selectedTei; + + //dashboard items + var getDashboardLayout = function(){ + $rootScope.dashboardWidgets = []; + $scope.widgetsChanged = []; + $scope.dashboardStatus = []; + $scope.dashboardWidgetsOrder = {biggerWidgets: [], smallerWidgets: []}; + $scope.orderChanged = false; + + DashboardLayoutService.get().then(function(response){ + $scope.dashboardLayouts = response; + + var selectedLayout = $scope.dashboardLayouts ['DEFAULT']; + if($scope.selectedProgram && $scope.selectedProgram.id){ + selectedLayout = $scope.dashboardLayouts [$scope.selectedProgram.id] ? $scope.dashboardLayouts [$scope.selectedProgram.id] : selectedLayout; + } + + for(var widget in selectedLayout.widgets){ + switch(selectedLayout.widgets[widget].title){ + case 'enrollment': + $rootScope.enrollmentWidget = selectedLayout.widgets[widget]; + $rootScope.dashboardWidgets.push($rootScope.enrollmentWidget); + $scope.dashboardStatus[widget] = selectedLayout.widgets[widget]; + break; + case 'dataentry': + $rootScope.dataentryWidget = selectedLayout.widgets[widget]; + $rootScope.dashboardWidgets.push($rootScope.dataentryWidget); + $scope.dashboardStatus[widget] = selectedLayout.widgets[widget]; + break; + case 'report': + $rootScope.reportWidget = selectedLayout.widgets[widget]; + $rootScope.dashboardWidgets.push($rootScope.reportWidget); + $scope.dashboardStatus[widget] = selectedLayout.widgets[widget]; + break; + case 'current_selections': + $rootScope.selectedWidget = selectedLayout.widgets[widget]; + $rootScope.dashboardWidgets.push($rootScope.selectedWidget); + $scope.dashboardStatus[widget] = selectedLayout.widgets[widget]; + break; + case 'profile': + $rootScope.profileWidget = selectedLayout.widgets[widget]; + $rootScope.dashboardWidgets.push($rootScope.profileWidget); + $scope.dashboardStatus[widget] = selectedLayout.widgets[widget]; + break; + case 'relationships': + $rootScope.relationshipWidget = selectedLayout.widgets[widget]; + $rootScope.dashboardWidgets.push($rootScope.relationshipWidget); + $scope.dashboardStatus[widget] = selectedLayout.widgets[widget]; + break; + case 'notes': + $rootScope.notesWidget = selectedLayout.widgets[widget]; + $rootScope.dashboardWidgets.push($rootScope.notesWidget); + $scope.dashboardStatus[widget] = selectedLayout.widgets[widget]; + break; + } + } + + angular.forEach(orderByFilter($filter('filter')($scope.dashboardWidgets, {parent: "biggerWidget"}), 'order'), function(w){ + $scope.dashboardWidgetsOrder.biggerWidgets.push(w.title); + }); + + angular.forEach(orderByFilter($filter('filter')($scope.dashboardWidgets, {parent: "smallerWidget"}), 'order'), function(w){ + $scope.dashboardWidgetsOrder.smallerWidgets.push(w.title); + }); + }); + }; if($scope.selectedTeiId){ @@ -90,7 +128,9 @@ if($scope.selectedProgramId && program.id === $scope.selectedProgramId || selectedEnrollment && selectedEnrollment.program === program.id){ $scope.selectedProgram = program; } - }); + }); + + getDashboardLayout(); //broadcast selected items for dashboard controllers CurrentSelection.set({tei: $scope.selectedTei, te: $scope.trackedEntity, prs: $scope.programs, pr: $scope.selectedProgram, enrollments: response.enrollments, selectedEnrollment: selectedEnrollment, optionSets: $scope.optionSets}); @@ -104,7 +144,7 @@ //listen for any change to program selection //it is possible that such could happen during enrollment. - $scope.$on('mainDashboard', function(event, args) { + $scope.$on('mainDashboard', function(event, args) { var selections = CurrentSelection.get(); $scope.selectedProgram = null; angular.forEach($scope.programs, function(pr){ @@ -112,7 +152,6 @@ $scope.selectedProgram = pr; } }); - $scope.broadCastSelections(); }); //watch for widget sorting @@ -141,13 +180,18 @@ } }); + $scope.applySelectedProgram = function(){ + getDashboardLayout(); + $scope.broadCastSelections(); + }; + $scope.broadCastSelections = function(){ var selections = CurrentSelection.get(); $scope.selectedTei = selections.tei; $scope.trackedEntity = selections.te; $scope.optionSets = selections.optionSets; - + CurrentSelection.set({tei: $scope.selectedTei, te: $scope.trackedEntity, prs: $scope.programs, pr: $scope.selectedProgram, enrollments: selections.enrollments, selectedEnrollment: null, optionSets: $scope.optionSets}); $timeout(function() { $rootScope.$broadcast('selectedItems', {programExists: $scope.programs.length > 0}); @@ -185,14 +229,40 @@ } }; - $scope.saveDashboardLayout = function(){ - if($scope.widgetsChanged.length > 0){ - console.log('dashboardWidgets: ', $rootScope.dashboardWidgets); - } - - if($scope.orderChanged){ - console.log('order: ', $scope.widgetsOrder); - } + $scope.saveDashboardLayout = function(){ + var widgets = []; + angular.forEach($rootScope.dashboardWidgets, function(widget){ + var w = angular.copy(widget); + if($scope.orderChanged){ + if($scope.widgetsOrder.biggerWidgets.indexOf(w.title) !== -1){ + w.parent = 'biggerWidget'; + w.order = $scope.widgetsOrder.biggerWidgets.indexOf(w.title); + } + + if($scope.widgetsOrder.smallerWidgets.indexOf(w.title) !== -1){ + w.parent = 'smallerWidget'; + w.order = $scope.widgetsOrder.smallerWidgets.indexOf(w.title); + } + } + widgets.push(w); + }); + + //$scope.dashboardLayouts + + if($scope.selectedProgram && $scope.selectedProgram.id){ + $scope.dashboardLayouts[$scope.selectedProgram.id] = {widgets: widgets, program: $scope.selectedProgram.id}; + } + + DashboardLayoutService.saveLayout($scope.dashboardLayouts).then(function(){ + if($scope.selectedProgramId && $scope.selectedProgram && $scope.selectedProgramId === $scope.selectedProgram.id || + !$scope.selectedProgramId && !$scope.selectedProgram){ + $route.reload(); + } + else{ + $location.path('/dashboard').search({tei: $scope.selectedTeiId, + program: $scope.selectedProgram ? $scope.selectedProgram.id: null}); + } + }); }; $scope.showHideWidgets = function(){ === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dashboard/dashboard.html' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dashboard/dashboard.html 2015-02-06 20:22:45 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/dashboard/dashboard.html 2015-02-09 17:04:31 +0000 @@ -1,53 +1,3 @@ - -
@@ -57,12 +7,12 @@ class="form-control-program" ng-options="program as program.name for program in programs | orderBy: 'name'" ng-disabled="programs.length < 1" - ng-change="broadCastSelections()"> + ng-change="applySelectedProgram()">
- + {{'dashboard_layout_not_saved'| translate}}
=== 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-02-06 20:22:45 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/enrollment/enrollment-controller.js 2015-02-09 17:04:31 +0000 @@ -17,14 +17,16 @@ DialogService) { $scope.today = DateUtils.getToday(); - $scope.selectedOrgUnit = storage.get('SELECTED_OU'); - - $scope.attributes = []; - $scope.attributesById = []; + $scope.selectedOrgUnit = storage.get('SELECTED_OU'); + AttributesFactory.getAll().then(function(atts){ + $scope.attributes = []; + $scope.attributesById = []; angular.forEach(atts, function(att){ $scope.attributesById[att.id] = att; }); + + CurrentSelection.setAttributesById($scope.attributesById); }); //listen for the selected items @@ -233,7 +235,8 @@ }, 200); }; - var getProcessedForm = function(){ + var getProcessedForm = function(){ + $scope.attributesById = CurrentSelection.getAttributesById(); var tei = angular.copy(selections.tei); tei.attributes = []; var formEmpty = true; @@ -249,7 +252,7 @@ var processSelectedTei = function(){ $scope.selectedTei = null; - $scope.selectedTei = angular.copy(selections.tei); + $scope.selectedTei = angular.copy(selections.tei); angular.forEach($scope.selectedTei.attributes, function(att){ $scope.selectedTei[att.attribute] = att.value; }); === modified file 'dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/profile/profile-controller.js' --- dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/profile/profile-controller.js 2015-02-04 12:53:26 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/components/profile/profile-controller.js 2015-02-09 17:04:31 +0000 @@ -40,12 +40,13 @@ angular.forEach($scope.selectedTei.attributes, function(att){ $scope.selectedTei[att.attribute] = att.value; }); + delete $scope.selectedTei.attributes; - if($scope.selectedProgram && $scope.selectedProgram.id){ - AttributesFactory.getByProgram($scope.selectedProgram).then(function(atts){ - $scope.attributes = atts; - + AttributesFactory.getByProgram($scope.selectedProgram).then(function(atts){ + $scope.attributes = atts; + + if($scope.selectedProgram && $scope.selectedProgram.id){ $scope.selectedProgram.hasCustomForm = false; TEFormService.getByProgram($scope.selectedProgram, atts).then(function(teForm){ if(angular.isObject(teForm)){ @@ -55,13 +56,8 @@ $scope.customForm = CustomFormService.getForTrackedEntity($scope.trackedEntityForm, $scope.widget); } }); - }); - } - else{ - AttributesFactory.getWithoutProgram().then(function(atts){ - $scope.attributes = atts; - }); - } + } + }); }); //listen for enrollment editing === 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-02-06 20:22:45 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/services.js 2015-02-09 17:04:31 +0000 @@ -48,6 +48,40 @@ }; }) +/* Service to fetch/store dasboard widgets */ +.service('DashboardLayoutService', function($http) { + + var w = {}; + w.enrollmentWidget = {title: 'enrollment', view: "components/enrollment/enrollment.html", show: true, expand: true, parent: 'biggerWidget', order: 0}; + w.dataentryWidget = {title: 'dataentry', view: "components/dataentry/dataentry.html", show: true, expand: true, parent: 'biggerWidget', order: 1}; + w.reportWidget = {title: 'report', view: "components/report/tei-report.html", show: true, expand: true, parent: 'biggerWidget', order: 2}; + w.selectedWidget = {title: 'current_selections', view: "components/selected/selected.html", show: false, expand: true, parent: 'smallerWidget', order: 0}; + w.profileWidget = {title: 'profile', view: "components/profile/profile.html", show: true, expand: true, parent: 'smallerWidget', order: 1}; + w.relationshipWidget = {title: 'relationships', view: "components/relationship/relationship.html", show: true, expand: true, parent: 'smallerWidget', order: 2}; + w.notesWidget = {title: 'notes', view: "components/notes/notes.html", show: true, expand: true, parent: 'smallerWidget', order: 3}; + var defaultLayout = new Object(); + defaultLayout['DEFAULT'] = {widgets: w, program: 'DEFAULT'}; + + return { + saveLayout: function(dashboardLayout){ + var layout = JSON.stringify(dashboardLayout); + var promise = $http.post( '../api/userSettings/dhis2-tracker-dashboard?value=' + layout, '', {headers: {'Content-Type': 'text/plain;charset=utf-8'}}).then(function(response){ + return response.data; + }); + return promise; + }, + get: function(){ + var promise = $http.get( '../api/userSettings/dhis2-tracker-dashboard' ).then(function(response){ + return response.data === "" ? defaultLayout: response.data; + }, function(){ + console.log('has failed....'); + return defaultLayout; + }); + return promise; + } + }; +}) + /* Factory to fetch optionSets */ .factory('OptionSetService', function($q, $rootScope, TCStorageService) { return { @@ -684,25 +718,36 @@ return def.promise; }, getByProgram: function(program){ - - var attributes = []; - var programAttributes = []; - var def = $q.defer(); - this.getAll().then(function(atts){ - angular.forEach(atts, function(attribute){ - attributes[attribute.id] = attribute; - }); + this.getAll().then(function(atts){ + + if(program && program.id){ + var attributes = []; + var programAttributes = []; + angular.forEach(atts, function(attribute){ + attributes[attribute.id] = attribute; + }); - angular.forEach(program.programTrackedEntityAttributes, function(pAttribute){ - var att = attributes[pAttribute.trackedEntityAttribute.id]; - att.mandatory = pAttribute.mandatory; - if(pAttribute.displayInList){ - att.displayInListNoProgram = true; - } - programAttributes.push(att); - }); - def.resolve(programAttributes); + angular.forEach(program.programTrackedEntityAttributes, function(pAttribute){ + var att = attributes[pAttribute.trackedEntityAttribute.id]; + att.mandatory = pAttribute.mandatory; + if(pAttribute.displayInList){ + att.displayInListNoProgram = true; + } + programAttributes.push(att); + }); + + def.resolve(programAttributes); + } + else{ + var attributes = []; + angular.forEach(atts, function(attribute){ + if (attribute.displayInListNoProgram) { + attributes.push(attribute); + } + }); + def.resolve(attributes); + } }); return def.promise; }, @@ -1018,6 +1063,7 @@ this.currentSelection = ''; this.relationshipInfo = ''; this.optionSets = null; + this.attributesById = null; this.set = function(currentSelection){ this.currentSelection = currentSelection; @@ -1039,6 +1085,13 @@ this.getOptionSets = function(){ return this.optionSets; }; + + this.setAttributesById = function(attributesById){ + this.attributesById = attributesById; + }; + this.getAttributesById = function(){ + return this.attributesById; + }; }) .service('TEIGridService', function(OrgUnitService, OptionSetService, DateUtils, $translate, AttributesFactory){ === 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 2015-01-29 17:13:36 +0000 +++ dhis-2/dhis-web/dhis-web-apps/src/main/webapp/dhis-web-tracker-capture/scripts/tracker-capture.js 2015-02-09 17:04:31 +0000 @@ -168,7 +168,7 @@ promise = promise.then( getMetaProgramValidations ); promise = promise.then( getProgramValidations ); promise = promise.then( getMetaTrackedEntityForms ); - promise = promise.then( getTrackedEntityForms ); + promise = promise.then( getTrackedEntityForms ); promise.done(function() { //Enable ou selection after meta-data has downloaded @@ -831,4 +831,4 @@ }); }); }; -} +} \ No newline at end of file