Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/dev' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
salomon-j committed Mar 28, 2024
2 parents 3e9581a + 7344b6c commit 6d36b24
Show file tree
Hide file tree
Showing 9 changed files with 124 additions and 23 deletions.
79 changes: 67 additions & 12 deletions grails-app/assets/javascripts/meriplan.js
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ function MERIPlan(project, projectService, config) {
self.meriPlan().objectives.rows.push(new GenericRowViewModel());
};
self.addOutcome = function () {
self.meriPlan().objectives.rows1.push(new SingleAssetOutcomeViewModel());
self.meriPlan().objectives.rows1.push(new SingleAssetOutcomeViewModel({}, config));
};
self.removeObjectives = function (row) {
self.meriPlan().objectives.rows.remove(row);
Expand Down Expand Up @@ -424,7 +424,7 @@ function MERIPlan(project, projectService, config) {
self.meriPlan().partnership.removeRow(partnership);
};
self.addSecondaryOutcome = function () {
self.meriPlan().outcomes.secondaryOutcomes.push(new SingleAssetOutcomeViewModel());
self.meriPlan().outcomes.secondaryOutcomes.push(new SingleAssetOutcomeViewModel({}, config));
};
self.removeSecondaryOutcome = function (outcome) {
self.meriPlan().outcomes.secondaryOutcomes.remove(outcome);
Expand Down Expand Up @@ -458,7 +458,7 @@ function MERIPlan(project, projectService, config) {
index++;
code = codePrefix+index;
}
outcomeStatementList.push(new SingleAssetOutcomeViewModel({code:code}));
outcomeStatementList.push(new SingleAssetOutcomeViewModel({code:code}, config));
}
self.addMidTermOutcome = function () {
addOutcomeStatement(self.meriPlan().outcomes.midTermOutcomes, 'MT');
Expand Down Expand Up @@ -917,7 +917,16 @@ function DetailsViewModel(o, project, budgetHeaders, risks, allServices, selecte
self.caseStudy = ko.observable(o.caseStudy ? o.caseStudy : false);
self.keq = new GenericViewModel(o.keq);
self.objectives = new ObjectiveViewModel(o.objectives, config.programObjectives || []); // Used in original MERI plan template
self.outcomes = new OutcomesViewModel(o.outcomes, {outcomes:project.outcomes, priorities:project.priorities}); // Use in new MERI plan template
var outcomesConfig = {
outcomes:project.outcomes,
priorities:project.priorities,
bieUrl: config.bieUrl,
searchBieUrl: config.searchBieUrl,
speciesListUrl: config.speciesListUrl,
speciesImageUrl: config.speciesImageUrl,
speciesProfileUrl: config.speciesProfileUrl
};
self.outcomes = new OutcomesViewModel(o.outcomes, outcomesConfig); // Use in new MERI plan template
self.priorities = new GenericViewModel(o.priorities, ['data1', 'data2', 'data3', 'documentUrl']);
self.implementation = new ImplementationViewModel(o.implementation);
self.partnership = new GenericViewModel(o.partnership, ['data1', 'data2', 'data3', 'otherOrganisationType']);
Expand Down Expand Up @@ -1721,24 +1730,37 @@ function OutcomesViewModel(outcomes, config) {
return priorities;
};

var supportsMultiplePriorities = function(outcomeText, configItemName) {
var supportsConfiguration = function(outcomeText, configItemName) {
var outcome = _.find(config.outcomes, function (outcome) {
return outcome.outcome == outcomeText;
});
return outcome && outcome[configItemName];
}
self.primaryOutcomeSupportsMultiplePriorities = ko.pureComputed(function() {
var outcomeText = self.primaryOutcome.description();
return supportsMultiplePriorities(outcomeText, 'supportsMultiplePrioritiesAsPrimary')
return supportsConfiguration(outcomeText, 'supportsMultiplePrioritiesAsPrimary')
});
self.secondaryOutcomeSupportsMultiplePriorities = function(outcomeText) {
return supportsMultiplePriorities(outcomeText, 'supportsMultiplePrioritiesAsSecondary')
return supportsConfiguration(outcomeText, 'supportsMultiplePrioritiesAsSecondary')
};

self.primaryOutcome = new SingleAssetOutcomeViewModel(outcomes.primaryOutcome);
self.supportsSpeciesSearch = function(outcomeText) {
return supportsConfiguration(outcomeText, 'supportsSpeciesSearch')
};


config.supportsSpeciesSearch = _.find(filterByType(config.outcomes, PRIMARY_OUTCOMES, true), function(outcome) {
return outcome.supportsSpeciesSearch;
});
self.primaryOutcome = new SingleAssetOutcomeViewModel(outcomes.primaryOutcome, config);

config.supportsSpeciesSearch = _.find(filterByType(config.outcomes, SECONDARY_OUTCOMES, true), function(outcome) {
return outcome.supportsSpeciesSearch;
});
self.secondaryOutcomes = ko.observableArray(_.map(outcomes.secondaryOutcomes || [], function (outcome) {
return new SingleAssetOutcomeViewModel(outcome)
return new SingleAssetOutcomeViewModel(outcome, config)
}));
config.supportsSpeciesSearch = false;
self.shortTermOutcomes = ko.observableArray(_.map(outcomes.shortTermOutcomes || [], function (outcome) {
return new SingleAssetOutcomeViewModel(outcome);
}));
Expand Down Expand Up @@ -1812,7 +1834,7 @@ function AssetViewModel(asset) {
self.description = ko.observable(asset.description);
}

function SingleAssetOutcomeViewModel(o) {
function SingleAssetOutcomeViewModel(o, config) {
var self = this;
if (!o) o = {};

Expand All @@ -1834,8 +1856,37 @@ function SingleAssetOutcomeViewModel(o) {
},
owner: self
});

if (config && config.supportsSpeciesSearch) {
var options = {
bieUrl: config.bieUrl,
searchBieUrl: config.searchBieUrl,
speciesListUrl: config.speciesListUrl,
speciesImageUrl: config.speciesImageUrl,
speciesProfileUrl: config.speciesProfileUrl
};

self.speciesAsset = new SpeciesViewModel(o.speciesAsset || {}, options, {});
self.speciesAsset.name.subscribe(function () {
var scientificName = self.speciesAsset.scientificName();
var commonName = self.speciesAsset.commonName();

var assetName;
if (scientificName && commonName) {
assetName = scientificName + ' (' + commonName + ')';
} else if (scientificName) {
assetName = scientificName;
} else {
assetName = commonName;
}
self.asset(assetName);
});
}
self.description.subscribe(function () {
self.assets([]);
if (self.speciesAsset) {
self.speciesAsset.loadData({});
}
});

self.relatedOutcome = ko.observable(o.relatedOutcome);
Expand All @@ -1849,12 +1900,16 @@ function SingleAssetOutcomeViewModel(o) {
!self.relatedOutcome()) {
return null;
}
return {
code:self.code,
var json = {
code: self.code,
description: self.description(),
assets: self.assets(),
relatedOutcome: self.relatedOutcome()
};
if (self.speciesAsset) {
json.speciesAsset = self.speciesAsset.name() ? self.speciesAsset.toJSON() : null
}
return json;
};
};

Expand Down
7 changes: 6 additions & 1 deletion grails-app/assets/javascripts/projects.js
Original file line number Diff line number Diff line change
Expand Up @@ -873,7 +873,12 @@ function ProjectPageViewModel(project, sites, activities, organisations, userRol
meriSubmissionDeclarationSelector: '#meriSubmissionDeclaration',
editProjectStartDate: self.canEditStartDate,
externalIds: self.externalIds,
canModifyMeriPlan: config.canModifyMeriPlan
canModifyMeriPlan: config.canModifyMeriPlan,
bieUrl: config.bieUrl,
searchBieUrl: config.searchBieUrl,
speciesListUrl: config.speciesListUrl,
speciesImageUrl: config.speciesImageUrl,
speciesProfileUrl: config.speciesProfileUrl
});
self.meriPlan = new MERIPlan(project, projectService, meriPlanConfig);

Expand Down
3 changes: 3 additions & 0 deletions grails-app/assets/stylesheets/meriplan.css
Original file line number Diff line number Diff line change
Expand Up @@ -516,4 +516,7 @@ input#changeProjectStartDate {
.meri-plan .meriList {
margin-left: 0;
padding-left: 1rem;
}
.meri-plan .input-group.species-select {
flex-wrap: unset;
}
15 changes: 13 additions & 2 deletions grails-app/views/project/index.gsp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@
reportsHistoryUrl:"${createLink(controller: 'report', action:'reportingHistory')}",
monitoringProtocolsUrl:"${createLink(action:'monitoringProtocolFormCategories', id: project.projectId)}",
requestLabelUrl:"${createLink(action:'requestVoucherBarcodeLabels', id: project.projectId)}",
bieUrl: "${grailsApplication.config.getProperty('bie.baseURL')}",
searchBieUrl:"${createLink(controller:'species', action:'searchBie')}",
speciesListUrl:"${createLink(controller:'proxy', action:'speciesItemsForList')}",
speciesImageUrl:"${createLink(controller:'species', action:'speciesImage')}",
speciesProfileUrl:"${createLink(controller:'species', action:'speciesProfile')}"
},
here = "${createLink(action:'index', id: project.projectId)}";
Expand Down Expand Up @@ -327,7 +332,12 @@ var config = {
config.canModifyMeriPlan = ${projectContent.admin.canModifyMeriPlan};
config.userHoldsMeriPlanLock = ${project.lock?.userId == user?.userId};
config.viewReportUrl = fcConfig.viewReportUrl;
project.mapFeatures = $.parseJSON('${mapFeatures?.encodeAsJavaScript()}');
config.bieUrl = fcConfig.bieUrl;
config.searchBieUrl = fcConfig.searchBieUrl;
config.speciesListUrl = fcConfig.speciesListUrl;
config.speciesImageUrl = fcConfig.speciesImageUrl;
config.speciesProfileUrl = fcConfig.speciesProfileUrl;
project.mapFeatures = $.parseJSON('${mapFeatures?.encodeAsJavaScript()}');
var viewModel = new ProjectPageViewModel(project, project.sites, project.activities || [], organisations, userRoles, config);
viewModel.loadPrograms(programs);
ko.applyBindings(viewModel);
Expand Down Expand Up @@ -514,7 +524,8 @@ var config = {
<asset:javascript src="document.js"/>
<asset:javascript src="reporting.js"/>

<asset:javascript src="forms-knockout-bindings.js"/>
<asset:javascript src="forms-manifest.js"/>
<asset:javascript src="speciesModel.js"/>
<asset:javascript src="leaflet-manifest.js"/>
<asset:javascript src="feature.js"/>
<asset:deferredScripts/>
Expand Down
9 changes: 8 additions & 1 deletion grails-app/views/project/meriPlan/_additionalOutcomes.gsp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,15 @@
</td>
<td class="priority">
<!-- ko if:!details.outcomes.secondaryOutcomeSupportsMultiplePriorities($data.description()) -->

<!-- ko if:!details.outcomes.supportsSpeciesSearch($data.description()) -->
<select data-bind="value:asset, options: details.outcomes.outcomePriorities(description()), optionsCaption: 'Please select', select2:{preserveColumnWidth:48}, disable: $parent.isProjectDetailsLocked()" class="form-control form-control-sm asset" <g:if test="!disablePriorityValidation">data-validation-engine="validate[required]"></g:if></select></select>
<!-- /ko -->
<!-- /ko -->
<!-- ko if:details.outcomes.supportsSpeciesSearch($data.description()) -->
<g:render template="/shared/speciesSelect" model="${[bindingProperty:'speciesAsset']}"/>
<!-- /ko -->

<!-- /ko -->
<!-- ko if:details.outcomes.secondaryOutcomeSupportsMultiplePriorities($data.description()) -->
<g:if test="${renderPrioritiesWithSelect2}">
<select multiple="multiple" class="form-control form-control-sm" data-validation-engine="validate[required]" data-bind="options:details.outcomes.outcomePriorities(description()), multiSelect2:{preserveColumnWidth:48, value:assets, tags:false}, disable: $parent.isProjectDetailsLocked()"></select>
Expand Down
8 changes: 8 additions & 0 deletions grails-app/views/project/meriPlan/_programOutcome.gsp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,16 @@
<td class="priority">
<!-- ko if:!isAgricultureProject() && !details.outcomes.primaryOutcomeSupportsMultiplePriorities() -->

<!-- ko if:!details.outcomes.supportsSpeciesSearch(details.outcomes.primaryOutcome.description()) -->
<select class="form-control form-control-sm asset w-100" data-validation-engine="validate[required]" data-bind="options:details.outcomes.outcomePriorities(details.outcomes.primaryOutcome.description()), optionsCaption: 'Please select', value:details.outcomes.primaryOutcome.asset, select2:{preserveColumnWidth:48}, disable: isProjectDetailsLocked()" >
</select>
<!-- /ko -->
<!-- ko if:details.outcomes.supportsSpeciesSearch(details.outcomes.primaryOutcome.description()) -->

<g:render template="/shared/speciesSelect" model="${[bindingProperty:'details.outcomes.primaryOutcome.speciesAsset']}"/>

<!-- /ko -->

<!-- /ko -->
<!-- ko if:isAgricultureProject() || details.outcomes.primaryOutcomeSupportsMultiplePriorities() -->
<g:if test="${renderPrioritiesWithSelect2}">
Expand Down
6 changes: 6 additions & 0 deletions grails-app/views/shared/_speciesSelect.gsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<div data-bind="with:${bindingProperty}" class="input-group species-select">
<select class="form-control form-control-sm" data-bind="speciesSelect2:$data"></select>
<div class="input-group-append">
<span class="input-group-text" data-bind="visible:name(), popover: {title: transients.speciesTitle, content: transients.speciesInformation}"><i class="fa fa-info-circle"></i></span>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ class ManagementUnitPermissionSpec extends StubbedCasSpec {

def "an admin cannot add a user as a grant manager, but change change an editor to an admin"() {

setup:
setup: "Login as user 1 who is an admin of the 'test_mu' management unit"
String projectId = '1'
loginAsMeritAdmin(browser)
loginAsUser('1', browser)

when:
to ManagementUnitPage, "test_mu"
Expand All @@ -71,19 +71,19 @@ class ManagementUnitPermissionSpec extends StubbedCasSpec {
then:
adminTabPane.permissionAccess.permissions.size() == 3

when: "We try and add a grant manager (user with id = 1001) as a grant manager to the project"
when: "We try and add a grant manager (user with id = 1001) as a grant manager to the MU"
adminTabPane.permissionAccess.addPermission("[email protected]", "caseManager")

then: "we cannot because the 'Grant Manager' option is disabled"
thrown(ElementNotInteractableException)
thrown(Exception) // The type of exception thrown has changed, but the element should be disabled and not clickable

when: "We change user 4 to an admin"
adminTabPane.permissionAccess.findPermissionForUser('4').updateRole('admin')
adminTabPane.permissionAccess.findPermissionForDisplayName('First 4 Last 4').updateRole('admin')
okBootbox()

then:
waitFor {
adminTabPane.permissionAccess.findPermissionForUser('4').roleText == "Admin"
adminTabPane.permissionAccess.findPermissionForDisplayName('First 4 Last 4').roleText == "Admin"
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
"headers": {
"Content-Type": "application/json"
},
"body": "{\"userName\":\"user.{{request.query.userName}}@nowhere.com.au\", \"email\":\"user.{{request.query.userName}}@nowhere.com.au\", \"userId\":\"{{request.query.userName}}\"}"
"jsonBody": {
"userName":"user.{{request.query.userName}}@nowhere.com.au",
"email":"user.{{request.query.userName}}@nowhere.com.au",
"userId":"{{request.query.userName}}",
"firstName": "First {{request.query.userName}}",
"lastName": "Last {{request.query.userName}}"
}
}
}

0 comments on commit 6d36b24

Please sign in to comment.