diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8c9f54ab..cb508c3d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,22 +7,23 @@ until the next release.
## Features
- Added docker support to the project. GCA-Web can now also be run using docker containers.
- The latest buids can be found at [dockerhub](https://hub.docker.com/r/gnode/gca/builds).
+ The latest builds can be found at [dockerhub](https://hub.docker.com/r/gnode/gca/builds).
- Added a "Favourite Abstracts" feature to the page. Viewed abstracts can now be
marked and a list of favoured abstracts can be separately accessed.
- Login behavior has been changed to support page redirecting to the original page after
a login has occurred. See issue #361 for details.
- Due to previously added features like "Schedule" or "Location" the navigation bar
has been restructured to a two row display to accommodate all new features.
+ See also issue #446 for details.
- Various smaller changes in behavior have been made to the conference administration page.
- See issues #341 and #437 for details.
+ See issues #341, #426, #427 and #437 for details.
- Various smaller changes in behavior have been made to the abstract submission page.
- See issues #201, #338, #339, #397 and #437 for details.
+ See issues #201, #288, #338, #339, #397, #437 and #443 for details.
## Fixes
- JavaScript code files have been sanitized. Unsanitized code lead to premature stop of
JavaScript execution in more strict browsers like IE and Edge. See #445 for details.
-- Various fixes have been applied to the abstract submission. See #444 and #439 for details.
+- Various fixes have been applied to the abstract submission. See #438, #439 and #444 for details.
- Various fixes have been applied to the conference administration. See #317, #425, #439 and #444 for details
- The site now displays pages within the GCA-Web scope on notAuthenticated and notAuthorized
access. See #444 for details.
diff --git a/app/assets/javascripts/editor.js b/app/assets/javascripts/editor.js
index fb1ebcf1..f47e263d 100644
--- a/app/assets/javascripts/editor.js
+++ b/app/assets/javascripts/editor.js
@@ -71,9 +71,8 @@ function (ko, models, tools, msg, validate, owned, astate) {
var checkTitle = /.*\$.*\$.*/;
if (self.editedAbstract() && self.editedAbstract().title() && checkTitle.test(self.editedAbstract().title())) {
return "Please avoid using LaTeX code in the abstract title";
- } else {
- return "";
}
+ return "";
},
self
);
@@ -197,6 +196,20 @@ function (ko, models, tools, msg, validate, owned, astate) {
// Suppress error, if conference has no defined topics
self.checkRemoveTopics(result.warnings);
var nwarn = result.warnings.length;
+
+ // Return result Ok, if no warnings are left after preference and
+ // topics warnings have been suppressed.
+ if (nwarn !== null && nwarn !== undefined && nwarn === 0) {
+ return {
+ ok: true,
+ isError: false,
+ badgeLevel: "btn-success",
+ badgeText: "Ok",
+ items: [],
+ handler: function() {}
+ };
+ }
+
return {
ok: false,
isError: false,
@@ -440,6 +453,9 @@ function (ko, models, tools, msg, validate, owned, astate) {
};
self.doSaveAbstract = function (abstract) {
+ // Clean slate for new messages
+ self.clearMessage();
+
if (!(abstract instanceof models.ObservableAbstract)) {
abstract = self.abstract();
}
@@ -506,8 +522,6 @@ function (ko, models, tools, msg, validate, owned, astate) {
if (firstSave) {
self.showHelp();
- } else {
- self.clearMessage();
}
}
@@ -694,6 +708,9 @@ function (ko, models, tools, msg, validate, owned, astate) {
self.doWithdrawAbstract = function () {
self.doChangeState("Withdrawn");
+
+ // Cleanup any leftover messages
+ self.clearMessage();
};
self.action = ko.computed(
@@ -795,7 +812,7 @@ function (ko, models, tools, msg, validate, owned, astate) {
"
Nothing will be stored on the server before the abstract is saved for" +
" the first time, so it is ok to play around and explore this editor." +
"After entering at least the abstract title, click the Save button" +
- " to store the abstract on the server. Subsequent changes will the be " +
+ " to store the abstract on the server. Subsequent changes will then be " +
" saved automatically." +
"The 'Validation' field above indicates if there are issues with the" +
" required content of the abstract. Clicking on the issues button will " +
@@ -807,6 +824,7 @@ function (ko, models, tools, msg, validate, owned, astate) {
self.setWarning("Abstract unlocked",
"" +
"- Autosave is again enabled, changes will be stored directly on the server.
" +
+ "- This abstract is not submitted yet.
" +
"- Abstract must be re-submitted before the deadline. If the abstract is not submitted, " +
" it will not be considered for the conference.
" +
"
"
@@ -816,6 +834,7 @@ function (ko, models, tools, msg, validate, owned, astate) {
"Abstract is saved",
"" +
"- Autosave is enabled, i.e. changes are stored automatically on the server.
" +
+ "- This abstract is not submitted yet.
" +
"- Once the Validation field shows 'Ok', you can click the " +
" Submit button to submit it. Submitted abstracts can" +
" be modified until the deadline.
" +
@@ -835,7 +854,8 @@ function (ko, models, tools, msg, validate, owned, astate) {
" Please note that abstract submission does not replace conference registration!
" +
"All abstract submitters also have to register for the conference.
" +
"To register please go to: " + self.conference().link + ""
+ self.conference().link + "\"> " +
+ self.conference().link + ""
);
}
};
diff --git a/app/assets/javascripts/lib/models.js b/app/assets/javascripts/lib/models.js
index ec0befd3..8723b9d1 100644
--- a/app/assets/javascripts/lib/models.js
+++ b/app/assets/javascripts/lib/models.js
@@ -1136,21 +1136,22 @@ define(["lib/tools", "lib/accessors", "moment", "knockout"], function(tools, ac
// Post process doi. Remove any leading doi link parts that hinder rendering later on.
var doiValue = model.doi();
-
- // First remove leading http or https
- doiValue = doiValue.replace(/^https:\/\//, "").replace(/http:\/\//, "");
-
- // Then search and replace DOI variant hierarchical URL parts
- var checkA = /^dx.doi.org\//;
- var checkB = /^doi.org\//;
- var checkC = /^doi:/;
-
- if (checkA.test(doiValue)) {
- model.doi(doiValue.replace(checkA, ""));
- } else if (checkB.test(doiValue)) {
- model.doi(doiValue.replace(checkB, ""));
- } else if (checkC.test(doiValue)) {
- model.doi(doiValue.replace(checkC, ""));
+ if (doiValue !== null && doiValue !== undefined) {
+ // First remove leading http or https
+ doiValue = doiValue.replace(/^https:\/\//, "").replace(/http:\/\//, "");
+
+ // Then search and replace DOI variant hierarchical URL parts
+ var checkA = /^dx.doi.org\//;
+ var checkB = /^doi.org\//;
+ var checkC = /^doi:/;
+
+ if (checkA.test(doiValue)) {
+ model.doi(doiValue.replace(checkA, ""));
+ } else if (checkB.test(doiValue)) {
+ model.doi(doiValue.replace(checkB, ""));
+ } else if (checkC.test(doiValue)) {
+ model.doi(doiValue.replace(checkC, ""));
+ }
}
obj.references.push(model.toObject());
diff --git a/app/service/AbstractService.scala b/app/service/AbstractService.scala
index 8c3b07a7..1096a44c 100644
--- a/app/service/AbstractService.scala
+++ b/app/service/AbstractService.scala
@@ -380,8 +380,8 @@ class AbstractService(figPath: String) extends PermissionsBase {
if (accountChecked == null)
throw new EntityNotFoundException("Unable to find account with uuid = " + account.uuid)
- val isOwner = abstrChecked.owners.contains(accountChecked)
- val isConfOwner = abstrChecked.conference.owners.contains(accountChecked)
+ val isOwner = abstrChecked.isOwner(accountChecked)
+ val isConfOwner = abstrChecked.conference.isOwner(accountChecked)
val isAdmin = accountChecked.isAdmin
if (! (isOwner || isConfOwner || isAdmin))
throw new IllegalAccessException("No permissions for abstract with uuid = " + abstr.uuid)
@@ -441,6 +441,7 @@ class AbstractService(figPath: String) extends PermissionsBase {
}
get(abstrUpdated.uuid)
}
+
/**
* Remove a favourite user from an abstract.
*
@@ -457,7 +458,6 @@ class AbstractService(figPath: String) extends PermissionsBase {
get(abstrUpdated.uuid)
}
-
/**
* Delete an abstract.
* This is only permitted if the account is one of the owners.
@@ -479,8 +479,8 @@ class AbstractService(figPath: String) extends PermissionsBase {
if (abstrChecked == null)
throw new EntityNotFoundException("Unable to find abstract with uuid = " + id)
- val isOwner = abstrChecked.owners.contains(accountChecked)
- val isConfOwner = abstrChecked.conference.owners.contains(accountChecked)
+ val isOwner = abstrChecked.isOwner(accountChecked)
+ val isConfOwner = abstrChecked.conference.isOwner(accountChecked)
val isAdmin = accountChecked.isAdmin
if (! (isOwner || isConfOwner || isAdmin))
throw new IllegalAccessException("No permissions for abstract with uuid = " + id)
diff --git a/app/views/signup.scala.html b/app/views/signup.scala.html
index 925b433b..77de8964 100644
--- a/app/views/signup.scala.html
+++ b/app/views/signup.scala.html
@@ -17,11 +17,17 @@
@password(form("password"), "Password", icon = "key")
}
-
-}
\ No newline at end of file
+}