Skip to content

Commit 0cab471

Browse files
committed
Progress commit for #3455
1 parent 28caf27 commit 0cab471

File tree

9 files changed

+305
-21
lines changed

9 files changed

+305
-21
lines changed

grails-app/assets/javascripts/document.js

+28-17
Original file line numberDiff line numberDiff line change
@@ -490,9 +490,17 @@ var DocModel = function (doc) {
490490
return imageLocation + "/filetypes/" + iconnameFromFilename(self.filename);
491491
};
492492
};
493-
function DocListViewModel(documents) {
493+
function DocListViewModel(documents, owner, options) {
494494
var self = this;
495-
this.documents = ko.observableArray($.map(documents, function(doc) { return new DocModel(doc)} ));
495+
496+
_.extend(self, new Documents());
497+
self.loadDocuments = function(documents) {
498+
_.each(documents || [], function(document) {
499+
self.documents.push(new DocumentViewModel(document, options.owner, options));
500+
});
501+
};
502+
self.loadDocuments(documents);
503+
496504
}
497505
function iconnameFromFilename(filename) {
498506
if (filename === undefined) { return "blank.png"; }
@@ -562,25 +570,28 @@ var HelpLinksViewModel = function(helpLinks, options) {
562570
autoSaveModel(self, options.documentBulkUpdateUrl, {blockUIOnSave:true, healthCheckUrl:options.healthCheckUrl});
563571
};
564572

565-
function initialiseDocumentTable(containerSelector) {
573+
function initialiseDocumentTable(containerSelector, excludeReportColumn) {
566574
var tableSelector = containerSelector + ' .docs-table';
567-
var table = $(tableSelector).DataTable(
568-
{
569-
"columnDefs": [
570-
{"type": "alt-string", "targets": 0},
571-
{"width":"6em", orderData:[4], "targets": [3]},
572-
{"width":"3em", "targets": [2]},
573-
{"visible":false, "targets": [4]},
574-
{"visible":false, "targets": [5]},
575-
576-
],
577-
"order":[[2, 'desc'], [3, 'desc']],
578-
"dom":
575+
var options = {
576+
"columnDefs": [
577+
{"type": "alt-string", "targets": 0},
578+
{"width":"6em", orderData:[4], "targets": [3]},
579+
{"width":"3em", "targets": [2]},
580+
{"visible":false, "targets": [4]},
581+
{"visible":false, "targets": [5]},
582+
583+
],
584+
"order":[[2, 'desc'], [3, 'desc']],
585+
"dom":
579586
"<'row'<'col-sm-5'l><'col-sm-7'f>r>" +
580587
"<'row'<'col-sm-12't>>" +
581588
"<'row'<'col-sm-6'i><'col-sm-6'p>>"
582589

583-
});
590+
};
591+
if (excludeReportColumn) {
592+
options.columnDefs.push({visible:false, "targets": [2]});
593+
}
594+
var table = $(tableSelector).DataTable(options);
584595

585596
$(tableSelector +" tr").on('click', function(e) {
586597
$(tableSelector + " tr.info").removeClass('info');
@@ -639,7 +650,7 @@ var EditableDocumentsViewModel = function(options) {
639650
console.log("Warning - missing setting: documentUpdateUrl");
640651
}
641652
if (!settings.documentDeleteUrl) {
642-
console.log("Warning - missing setting: documentUpdateUrl");
653+
console.log("Warning - missing setting: documentDeleteUrl");
643654
}
644655
if (!settings.owner) {
645656
console.log("Warning - missing setting: owner")

grails-app/controllers/au/org/ala/merit/DocumentController.groovy

+18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package au.org.ala.merit
22

3+
import au.org.ala.merit.hub.HubSettings
34
import grails.converters.JSON
45
import grails.core.GrailsApplication
56
import groovy.json.JsonSlurper
@@ -164,4 +165,21 @@ class DocumentController {
164165
filename = UriUtils.decode(filename, encoding?:"UTF-8")
165166
new Tuple2(path, filename)
166167
}
168+
169+
@PreAuthorise(accessLevel = "siteAdmin")
170+
def addHubDocumentCategory(String category) {
171+
if (!category) {
172+
response.status = SC_BAD_REQUEST
173+
return
174+
}
175+
HubSettings settings = SettingService.getHubConfig()
176+
if (!settings.helpDocumentCategories) {
177+
settings.helpDocumentCategories = []
178+
}
179+
if (!settings.helpDocumentCategories.contains(category)) {
180+
settings.helpDocumentCategories.add(category)
181+
SettingService.updateHubSettings(settings)
182+
}
183+
respond settings.helpDocumentCategories
184+
}
167185
}

grails-app/controllers/au/org/ala/merit/HomeController.groovy

+12
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ class HomeController {
4141
publicHome()
4242
}
4343

44+
45+
def helpDocuments(String category) {
46+
List documents = documentService.findAllHelpDocuments(category)
47+
[documents:documents]
48+
}
49+
50+
@PreAuthorise(accessLevel = 'siteAdmin')
51+
def editHelpDocuments(String category) {
52+
List documents = documentService.findAllHelpDocuments(category)
53+
[documents:documents, category:category, hubId:SettingService.hubConfig.hubId]
54+
}
55+
4456
/**
4557
* When we press the login button, the CAS service URL will point at this action, which is a protected path
4658
* which ensures the CAS ticket validation filter consumes the service ticket.

grails-app/services/au/org/ala/merit/DocumentService.groovy

+13
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,19 @@ class DocumentService {
5656
return []
5757
}
5858

59+
List findAllHelpDocuments(String category = null) {
60+
String url = "${grailsApplication.config.getProperty('ecodata.baseUrl')}document/search"
61+
Map params = [role:'helpDocument']
62+
if (category) {
63+
params.labels = category
64+
}
65+
def result = webService.doPost(url, params)
66+
if (result.statusCode == SC_OK) {
67+
return result.resp.documents
68+
}
69+
return []
70+
}
71+
5972
def updateDocument(Map doc) {
6073
Map result
6174
if (canEdit(doc)) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<%@ page import="grails.converters.JSON" %>
2+
<!DOCTYPE html>
3+
<html>
4+
<head>
5+
<meta name="layout" content="adminLayout"/>
6+
<title>Import Projects | Admin | MERIT</title>
7+
<script>
8+
var fcConfig = {
9+
serverUrl: "${grailsApplication.config.getProperty('grails.serverURL')}",
10+
createCategoryUrl: "${createLink(action: 'createDocumentCategory')}",
11+
updateCategoryUrl:"${createLink(action:'updateDocumentCategory')}",
12+
displayCategoryUrl: "${createLink(action: 'displayDocumentCategory')}"
13+
},
14+
returnTo = "${params.returnTo}";
15+
</script>
16+
<asset:stylesheet src="common-bs4.css"/>
17+
<asset:stylesheet src="blueimp/fileupload-9.28.0/jquery.fileupload.css"/>
18+
</head>
19+
20+
<body>
21+
<content tag="pageTitle">Load new projects into MERIT</content>
22+
23+
<h2>CSV Project Import</h2>
24+
25+
<p data-bind="visible:!finished() && !finishedPreview()">
26+
<p class="alert alert-dark">
27+
Click <strong><a href="${createLink(action:'meritImportCSVTemplate')}">HERE</a></strong> to download a template to use for MERIT project imports
28+
</p>
29+
30+
31+
<form>
32+
<p>
33+
Select the (cp1252 encoded) CSV file containing the project data. The file will be uploaded automatically.
34+
</p>
35+
<div data-bind="if:update">
36+
<p class="alert alert-warning" >
37+
Please test changes to existing MERIT projects in the staging system before running the update in production.
38+
</p>
39+
</div>
40+
<div class="form-check">
41+
<input id="update" class="form-check-input" type="checkbox" name="update" data-bind="enable:!finished() && !finishedPreview(), checked:update"><label class="form-check-label" for="update">Check here if this upload will replace existing projects</label>
42+
</div>
43+
<div class="form-group">
44+
<button class="btn btn-sm btn-primary fileinput-button" data-bind="enable:!finished() && (!finishedPreview() || finishedPreview() && !success())">
45+
<input id="fileUpload" class="form-control form-control-sm" type="file" accept="text/csv" data-bind="fileUploadNoImage:uploadOptions">
46+
Select file
47+
</button>
48+
</div>
49+
</form>
50+
51+
52+
<div class="results" data-bind="visible:progressSummary()">
53+
54+
55+
<h3> Results </h3>
56+
<!-- ko if:finishedPreview && !success() -->
57+
<div class="alert alert-danger">
58+
<p>One or more errors were encountered processing the file. Please resolve the errors and try again.</p>
59+
</div>
60+
<!-- /ko -->
61+
<div class="row">
62+
63+
<span data-bind="text:progressSummary"></span>
64+
<button class="ml-1 btn btn-sm mb-3" data-bind="click:doImport, visible:finishedPreview() && !finished(), enable:!importing() && success()">Import Projects</button>
65+
66+
<table class="table">
67+
<thead>
68+
<tr>
69+
<th>Grant ID</th><th>External ID</th><th>Success?</th><th>Errors</th><th>Messages</th>
70+
</tr>
71+
</thead>
72+
<tbody>
73+
<!-- ko foreach: { data: progressDetail, as: 'project'} -->
74+
<tr>
75+
<td>
76+
<span data-bind="text:grantId"></span>
77+
<a data-bind="attr:{href:fcConfig.projectUrl+$data.projectId}, visible:$data.projectUrl">(View Project)</a>
78+
</td>
79+
<td data-bind="text:externalId"></td>
80+
<td data-bind="text:success?'Yes':'No'"></td>
81+
<td>
82+
<ul>
83+
<!-- ko foreach: { data: errors, as: 'error'} -->
84+
<li data-bind="text:error"></li>
85+
<!-- /ko -->
86+
</ul>
87+
</td>
88+
<td>
89+
<ul>
90+
<!-- ko foreach: { data: messages, as: 'message'} -->
91+
<li data-bind="text:message"></li>
92+
<!-- /ko -->
93+
</ul>
94+
</td>
95+
96+
</tr>
97+
<!-- /ko -->
98+
</tbody>
99+
100+
</table>
101+
</div>
102+
</div>
103+
</div>
104+
<script id="template-upload" type="text/x-tmpl">{% %}</script>
105+
<script id="template-download" type="text/x-tmpl">{% %}</script>
106+
107+
<asset:javascript src="common-bs4.js"/>
108+
<asset:javascript src="attach-document-no-ui.js"/>
109+
<asset:javascript src="admin.js"/>
110+
111+
<script>
112+
ko.applyBindings(new ProjectImportViewModel(fcConfig));
113+
</script>
114+
</body>
115+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<%@ page import="au.org.ala.merit.SettingPageType" contentType="text/html;charset=UTF-8" %>
2+
<!DOCTYPE HTML>
3+
<html>
4+
<head>
5+
<g:set var="layoutName" value="nrm_bs4"/>
6+
<meta name="layout" content="${layoutName}"/>
7+
<title>Edit help documents | MERIT</title>
8+
<script>
9+
window.fcConfig = {
10+
baseUrl: "${grailsApplication.config.getProperty('grails.serverURL')}",
11+
documentUpdateUrl: "${g.createLink(controller: 'document', action: 'documentUpdate')}",
12+
documentDeleteUrl: "${g.createLink(controller: 'document', action: 'deleteDocument')}",
13+
imageLocation:"${assetPath(src:'/')}"
14+
}
15+
</script>
16+
<asset:stylesheet src="common-bs4.css"/>
17+
%{-- <asset:styleSheet src="document.css"/>--}%
18+
</head>
19+
<body>
20+
<div id="wrapper" class="${containerType}">
21+
<g:render template="/admin/editDocuments" model="${[excludeReport:true, documents:documents, containerId:'help-documents', useExistingModel:false, filterBy:'all']}"/>
22+
</div>
23+
<asset:javascript src="common-bs4.js"/>
24+
<asset:javascript src="document.js"/>
25+
<asset:javascript src="file-upload-manifest.js"/>
26+
27+
<asset:script>
28+
29+
var documents = <fc:modelAsJavascript model="${documents}"/>;
30+
$(function () {
31+
32+
33+
var owner = {hubId:'${hubId}'};
34+
var category = '${category}';
35+
documentRoles = [{id:'helpDocument', name:'Help Document', isPublicRole:true}];
36+
var options = {
37+
roles: ['helpDocument'],
38+
owner: owner,
39+
documentDefaults: {
40+
role: 'helpDocument',
41+
public: true,
42+
labels:[category]
43+
},
44+
modalSelector: '#attachDocument',
45+
documentUpdateUrl: fcConfig.documentUpdateUrl,
46+
documentDeleteUrl: fcConfig.documentDeleteUrl,
47+
imageLocation: fcConfig.imageLocation
48+
};
49+
var documentsViewModel = new EditableDocumentsViewModel(options);
50+
documentsViewModel.loadDocuments(documents);
51+
ko.applyBindings(documentsViewModel, document.getElementById('edit-documents'));
52+
53+
54+
});
55+
56+
</asset:script>
57+
58+
<asset:deferredScripts/>
59+
</body>
60+
61+
</html>
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<%@ page import="au.org.ala.merit.SettingPageType" contentType="text/html;charset=UTF-8" %>
2+
<!DOCTYPE HTML>
3+
<html>
4+
<head>
5+
<g:set var="layoutName" value="nrm_bs4"/>
6+
<meta name="layout" content="${layoutName}"/>
7+
<title>Help documents | MERIT</title>
8+
<script>
9+
window.fcConfig = {
10+
baseUrl: "${grailsApplication.config.getProperty('grails.serverURL')}",
11+
pdfgenUrl: "${createLink(controller: 'resource', action: 'pdfUrl')}",
12+
pdfViewer: "${createLink(controller: 'resource', action: 'viewer')}",
13+
imgViewer: "${createLink(controller: 'resource', action: 'imageviewer')}",
14+
audioViewer: "${createLink(controller: 'resource', action: 'audioviewer')}",
15+
videoViewer: "${createLink(controller: 'resource', action: 'videoviewer')}",
16+
errorViewer: "${createLink(controller: 'resource', action: 'error')}",
17+
}
18+
</script>
19+
<asset:stylesheet src="common-bs4.css"/>
20+
%{-- <asset:styleSheet src="document.css"/>--}%
21+
</head>
22+
<body>
23+
24+
<div id="wrapper" class="${containerType}">
25+
<section aria-label="breadcrumb">
26+
<ol class="breadcrumb">
27+
<li class="breadcrumb-item"><g:link controller="home">Home</g:link></li>
28+
<li class="breadcrumb-item">Help - ${category}</li>
29+
</ol>
30+
</section>
31+
<h3>Help Documents</h3>
32+
33+
<g:render template="/shared/listDocuments" model="${[excludeReportColumn:true, documents:documents, containerId:'help-documents', useExistingModel:false, filterBy:'all', imageUrl:assetPath(src:'/')]}"/>
34+
</div>
35+
<asset:javascript src="common-bs4.js"/>
36+
<asset:javascript src="document.js"/>
37+
<asset:deferredScripts/>
38+
</body>
39+
40+
</html>

0 commit comments

Comments
 (0)