From 93d89aa7bd7cd85cd63e07a7c02c5630733486b7 Mon Sep 17 00:00:00 2001 From: temi Date: Thu, 13 Feb 2025 17:40:47 +1100 Subject: [PATCH] #3432 - added new fields to override primary state/electorate - added exclude states/electorates fields - migration script for isDefault field --- grails-app/assets/javascripts/projects.js | 88 ++++++++++++++----- grails-app/views/project/_editProject.gsp | 39 +++++--- .../4.2/migrateIsDefaultInGeographicInfo.js | 12 +++ 3 files changed, 105 insertions(+), 34 deletions(-) create mode 100644 src/main/scripts/releases/4.2/migrateIsDefaultInGeographicInfo.js diff --git a/grails-app/assets/javascripts/projects.js b/grails-app/assets/javascripts/projects.js index 6a7b2a166..f7315fa18 100644 --- a/grails-app/assets/javascripts/projects.js +++ b/grails-app/assets/javascripts/projects.js @@ -180,11 +180,14 @@ function ProjectViewModel(project) { self.geographicInfo = { nationwide: ko.observable(project.geographicInfo.nationwide || false), statewide: ko.observable(project.geographicInfo.statewide || false), - isDefault: ko.observable(project.geographicInfo.isDefault || false), + overridePrimaryElectorate: ko.observable(project.geographicInfo.overridePrimaryElectorate || false), + overridePrimaryState: ko.observable(project.geographicInfo.overridePrimaryState || false), primaryState: ko.observable(project.geographicInfo.primaryState), primaryElectorate: ko.observable(project.geographicInfo.primaryElectorate), otherStates: ko.observableArray(project.geographicInfo.otherStates || []), - otherElectorates: ko.observableArray(project.geographicInfo.otherElectorates || []) + otherExcludedStates: ko.observableArray(project.geographicInfo.otherExcludedStates || []), + otherElectorates: ko.observableArray(project.geographicInfo.otherElectorates || []), + otherExcludedElectorates: ko.observableArray(project.geographicInfo.otherExcludedElectorates || []) }; self.geographicInfo.nationwide.subscribe(function(newValue) { if (newValue) { @@ -193,6 +196,8 @@ function ProjectViewModel(project) { self.geographicInfo.primaryElectorate(""); self.geographicInfo.otherStates([]); self.geographicInfo.otherElectorates([]); + self.geographicInfo.otherExcludedStates([]); + self.geographicInfo.otherExcludedElectorates([]); } }); @@ -202,6 +207,8 @@ function ProjectViewModel(project) { self.geographicInfo.primaryElectorate(""); self.geographicInfo.otherStates([]); self.geographicInfo.otherElectorates([]); + self.geographicInfo.otherExcludedStates([]); + self.geographicInfo.otherExcludedElectorates([]); } }); @@ -462,30 +469,66 @@ function ProjectViewModel(project) { }); self.associatedProgram(project.associatedProgram); // to trigger the computation of sub-programs }; - - self.transients.states = ko.observableArray([]); - self.transients.states.filteredStates = ko.computed(function() { - var primaryState = self.geographicInfo.primaryState(), states = self.transients.states().concat([]); - if (primaryState) { - var index = states.indexOf(primaryState); + self.transients.removeAll = function (source, toRemove) { + for(var i = 0; i < toRemove.length; i++) { + var index = source.indexOf(toRemove[i]); if (index > -1) { - states.splice(index, 1); + source.splice(index, 1); } } - return states; + return source + } + + self.transients.states = ko.observableArray([]); + self.transients.statesUnavailableForSelection = function (included) { + var result = [], + primaryState = self.geographicInfo.primaryState(), + otherStates = self.geographicInfo.otherStates() || [], + excludedStates = self.geographicInfo.otherExcludedStates() || []; + + if (primaryState) + result.push(primaryState) + if (!included) + result.push.apply(result, otherStates) + else + result.push.apply(result, excludedStates) + return result + } + self.transients.states.statesToIncludeOrExclude = function(include) { + var toRemove = self.transients.statesUnavailableForSelection(include), states = self.transients.states().concat([]); + return self.transients.removeAll(states, toRemove); + }; + self.transients.states.statesToInclude = ko.computed(function() { + return self.transients.states.statesToIncludeOrExclude(true); + }); + self.transients.states.statesToExclude = ko.computed(function() { + return self.transients.states.statesToIncludeOrExclude(false); }); self.transients.electorates = ko.observableArray([]); - self.transients.electorates.filteredElectorates = ko.computed(function() { - var primaryElectorate = self.geographicInfo.primaryElectorate(), electorates = self.transients.electorates().concat([]); - if (primaryElectorate) { - var index = electorates.indexOf(primaryElectorate); - if (index > -1) { - electorates.splice(index, 1); - } - } - - return electorates; + self.transients.electoratesUnavailableForSelection = function (included) { + var result = [], + primaryElectorate = self.geographicInfo.primaryElectorate(), + otherElectorates = self.geographicInfo.otherElectorates() || [], + excludedElectorates = self.geographicInfo.otherExcludedElectorates() || []; + + if (primaryElectorate) + result.push(primaryElectorate) + if (!included) + result.push.apply(result, otherElectorates) + else + result.push.apply(result, excludedElectorates) + return result + } + self.transients.electorates.electoratesToIncludeOrExclude = function(include) { + var toRemove = self.transients.electoratesUnavailableForSelection(include), source = self.transients.electorates().concat([]); + return self.transients.removeAll(source, toRemove); + }; + self.transients.electorates.electoratesToInclude = ko.computed(function() { + return self.transients.electorates.electoratesToIncludeOrExclude(true); + }); + self.transients.electorates.electoratesToExclude = ko.computed(function() { + return self.transients.electorates.electoratesToIncludeOrExclude(false); }); self.loadStatesAndElectorates = function() { @@ -514,11 +557,14 @@ function ProjectViewModel(project) { self.loadGeographicInfo = function () { self.geographicInfo.nationwide(project.geographicInfo.nationwide); self.geographicInfo.statewide(project.geographicInfo.statewide); - self.geographicInfo.isDefault(project.geographicInfo.isDefault); + self.geographicInfo.overridePrimaryElectorate(project.geographicInfo.overridePrimaryElectorate); + self.geographicInfo.overridePrimaryElectorate(project.geographicInfo.overridePrimaryElectorate); self.geographicInfo.primaryState(project.geographicInfo.primaryState); self.geographicInfo.primaryElectorate(project.geographicInfo.primaryElectorate); self.geographicInfo.otherStates(project.geographicInfo.otherStates); self.geographicInfo.otherElectorates(project.geographicInfo.otherElectorates); + self.geographicInfo.otherExcludedStates(project.geographicInfo.otherExcludedStates); + self.geographicInfo.otherExcludedElectorates(project.geographicInfo.otherExcludedElectorates); } self.toJS = function() { diff --git a/grails-app/views/project/_editProject.gsp b/grails-app/views/project/_editProject.gsp index 7de30e7e3..3bc239536 100644 --- a/grails-app/views/project/_editProject.gsp +++ b/grails-app/views/project/_editProject.gsp @@ -293,21 +293,16 @@ - - - -
- - -
- - - + +
+ + +
@@ -315,7 +310,14 @@ - +
+ + +
+
+ + +
@@ -323,7 +325,11 @@ - + +
+ + +
@@ -331,7 +337,14 @@ - +
+ + +
+
+ + +
diff --git a/src/main/scripts/releases/4.2/migrateIsDefaultInGeographicInfo.js b/src/main/scripts/releases/4.2/migrateIsDefaultInGeographicInfo.js new file mode 100644 index 000000000..d20c72222 --- /dev/null +++ b/src/main/scripts/releases/4.2/migrateIsDefaultInGeographicInfo.js @@ -0,0 +1,12 @@ +load( "../../utils/audit.js"); +var count = 0; +db.project.find({isMERIT: true, "geographicInfo.isDefault": true}).forEach(function (project) { + project.geographicInfo.overridePrimaryElectorate = true + project.geographicInfo.overridePrimaryState = true + db.project.updateOne({projectId: project.projectId}, {$set: {geographicInfo: project.geographicInfo}}); + audit(project, project.projectId, 'au.org.ala.ecodata.Project', "system") + print("updated " + project.projectId); + count ++; +}); + +print("total updates " + count); \ No newline at end of file