1
0
mirror of https://github.com/sismics/docs.git synced 2025-12-13 01:36:18 +00:00

Closes #205: action: remote tag

This commit is contained in:
Benjamin Gamard
2018-03-13 14:09:39 +01:00
parent 995e45d28f
commit 2678ff4477
11 changed files with 204 additions and 34 deletions

View File

@@ -10,12 +10,11 @@ import com.sismics.docs.core.dao.jpa.RouteModelDao;
import com.sismics.docs.core.dao.jpa.TagDao;
import com.sismics.docs.core.dao.jpa.UserDao;
import com.sismics.docs.core.dao.jpa.criteria.RouteModelCriteria;
import com.sismics.docs.core.dao.jpa.criteria.TagCriteria;
import com.sismics.docs.core.dao.jpa.dto.RouteModelDto;
import com.sismics.docs.core.dao.jpa.dto.TagDto;
import com.sismics.docs.core.model.jpa.Group;
import com.sismics.docs.core.model.jpa.RouteModel;
import com.sismics.docs.core.model.jpa.User;
import com.sismics.docs.core.util.ActionUtil;
import com.sismics.docs.core.util.jpa.SortCriteria;
import com.sismics.docs.rest.constant.BaseFunction;
import com.sismics.rest.exception.ClientException;
@@ -232,14 +231,11 @@ public class RouteModelResource extends BaseResource {
throw new ClientException("ValidationError", actionTypeStr + " is not a valid action type");
}
// Action custom fields
if (actionType == ActionType.ADD_TAG) {
String tagId = action.getString("tag");
ValidationUtil.validateRequired(routeStepTransitionStr, "step.transitions.actions.tag");
List<TagDto> tagDtoList = tagDao.findByCriteria(new TagCriteria().setId(tagId), null);
if (tagDtoList.size() != 1) {
throw new ClientException("ValidationError", tagId + " is not a valid tag");
}
// Validate action
try {
ActionUtil.validateAction(actionType, action);
} catch (Exception e) {
throw new ClientException("ValidationError", e.getMessage());
}
}
}

View File

@@ -84,9 +84,17 @@ angular.module('docs').controller('SettingsWorkflowEdit', function($scope, $dial
*/
$scope.edit = function () {
var promise = null;
// Cleanup the workflow data
var workflow = angular.copy($scope.workflow);
_.each(workflow.steps, function (step) {
_.each(step.transitions, function (transition) {
delete transition.actionType;
});
});
workflow.steps = JSON.stringify(workflow.steps);
if ($scope.isEdit()) {
promise = Restangular
.one('routemodel', $stateParams.id)
@@ -133,33 +141,50 @@ angular.module('docs').controller('SettingsWorkflowEdit', function($scope, $dial
$scope.workflow.steps.splice($scope.workflow.steps.indexOf(step), 1);
};
/**
* Update transitions on a step.
*/
$scope.updateTransitions = function (step) {
if (step.type === 'VALIDATE') {
step.transitions = [{
name: 'VALIDATED',
actions: []
actions: [],
actionType: 'ADD_TAG'
}];
} else if (step.type === 'APPROVE') {
step.transitions = [{
name: 'APPROVED',
actions: []
actions: [],
actionType: 'ADD_TAG'
}, {
name: 'REJECTED',
actions: []
actions: [],
actionType: 'ADD_TAG'
}];
}
};
/**
* Add an action.
*/
$scope.addAction = function (transition) {
if (_.isUndefined(transition.actionType)) {
return;
}
transition.actions.push({
type: 'ADD_TAG'
type: transition.actionType
});
};
/**
* Remove an action.
*/
$scope.removeAction = function (actions, action) {
actions.splice(actions.indexOf(action), 1);
};
// Fetch tags
Restangular.one('tag/list').get().then(function(data) {
$scope.tags = data.tags;
});

View File

@@ -510,7 +510,8 @@
"no_space": "Spaces are not allowed"
},
"action_type": {
"ADD_TAG": "Add this tag"
"ADD_TAG": "Add a tag",
"REMOVE_TAG": "Remove a tag"
},
"pagination": {
"previous": "Previous",

View File

@@ -100,6 +100,11 @@
<option ng-repeat="tag in tags" value="{{ tag.id }}">{{ tag.name }}</option>
</select>
</div>
<div ng-switch-when="REMOVE_TAG">
<select title="{{ 'action_type.REMOVE_TAG' | translate }}" ng-model="action.tag" required class="form-control">
<option ng-repeat="tag in tags" value="{{ tag.id }}">{{ tag.name }}</option>
</select>
</div>
</div>
<p class="text-center">
<a href ng-click="removeAction(transition.actions, action)">
@@ -108,8 +113,9 @@
</p>
</div>
<div class="input-group">
<select title="Action type" class="form-control">
<option name="ADD_TAG">{{ 'action_type.ADD_TAG' | translate }}</option>
<select title="Action type" class="form-control" ng-model="transition.actionType">
<option value="ADD_TAG">{{ 'action_type.ADD_TAG' | translate }}</option>
<option value="REMOVE_TAG">{{ 'action_type.REMOVE_TAG' | translate }}</option>
</select>
<span class="input-group-addon btn" ng-click="addAction(transition)">
<span class="fas fa-plus-circle"></span>

View File

@@ -352,14 +352,14 @@ public class TestRouteResource extends BaseJerseyTest {
}
/**
* Test actions on workflow step.
* Test tag actions on workflow step.
*/
@Test
public void testAction() {
public void testTagActions() {
// Login admin
String adminToken = clientUtil.login("admin", "admin", false);
// Create a tag
// Create an Approved tag
JsonObject json = target().path("/tag").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.put(Entity.form(new Form()
@@ -367,12 +367,20 @@ public class TestRouteResource extends BaseJerseyTest {
.param("color", "#ff0000")), JsonObject.class);
String tagApprovedId = json.getString("id");
// Create a Pending tag
json = target().path("/tag").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.put(Entity.form(new Form()
.param("name", "Approved")
.param("color", "#ff0000")), JsonObject.class);
String tagPendingId = json.getString("id");
// Create a new route model with actions
json = target().path("/routemodel").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.put(Entity.form(new Form()
.param("name", "Workflow action 1")
.param("steps", "[{\"type\":\"APPROVE\",\"transitions\":[{\"name\":\"APPROVED\",\"actions\":[{\"type\":\"ADD_TAG\",\"tag\":\"" + tagApprovedId + "\"}]},{\"name\":\"REJECTED\",\"actions\":[]}],\"target\":{\"name\":\"administrators\",\"type\":\"GROUP\"},\"name\":\"Check the document's metadata\"}]")), JsonObject.class);
.param("steps", "[{\"type\":\"APPROVE\",\"transitions\":[{\"name\":\"APPROVED\",\"actions\":[{\"type\":\"ADD_TAG\",\"tag\":\"" + tagApprovedId + "\"}]},{\"name\":\"REJECTED\",\"actions\":[]}],\"target\":{\"name\":\"administrators\",\"type\":\"GROUP\"},\"name\":\"Check the document's metadata\"},{\"type\":\"VALIDATE\",\"transitions\":[{\"name\":\"VALIDATED\",\"actions\":[{\"type\":\"REMOVE_TAG\",\"tag\":\"" + tagPendingId + "\"}]}],\"target\":{\"name\":\"administrators\",\"type\":\"GROUP\"},\"name\":\"Check the document's metadata\"}]")), JsonObject.class);
String routeModelId = json.getString("id");
// Create a document
@@ -381,6 +389,7 @@ public class TestRouteResource extends BaseJerseyTest {
.put(Entity.form(new Form()
.param("title", "My super title document 1")
.param("description", "My super description for document 1")
.param("tags", tagPendingId)
.param("language", "eng")), JsonObject.class);
String document1Id = json.getString("id");
@@ -398,7 +407,8 @@ public class TestRouteResource extends BaseJerseyTest {
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.get(JsonObject.class);
JsonArray tags = json.getJsonArray("tags");
Assert.assertEquals(0, tags.size());
Assert.assertEquals(1, tags.size());
Assert.assertEquals(tagPendingId, tags.getJsonObject(0).getString("id"));
// Validate the current step with admin
target().path("/route/validate").request()
@@ -407,6 +417,22 @@ public class TestRouteResource extends BaseJerseyTest {
.param("documentId", document1Id)
.param("transition", "APPROVED")), JsonObject.class);
// Check tags on document 1
json = target().path("/document/" + document1Id).request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.get(JsonObject.class);
tags = json.getJsonArray("tags");
Assert.assertEquals(2, tags.size());
Assert.assertEquals(tagApprovedId, tags.getJsonObject(0).getString("id"));
Assert.assertEquals(tagPendingId, tags.getJsonObject(1).getString("id"));
// Validate the current step with admin
target().path("/route/validate").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.post(Entity.form(new Form()
.param("documentId", document1Id)
.param("transition", "VALIDATED")), JsonObject.class);
// Check tags on document 1
json = target().path("/document/" + document1Id).request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
@@ -420,6 +446,7 @@ public class TestRouteResource extends BaseJerseyTest {
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.put(Entity.form(new Form()
.param("title", "My super title document 2")
.param("tags", tagPendingId)
.param("language", "eng")), JsonObject.class);
String document2Id = json.getString("id");
@@ -439,6 +466,21 @@ public class TestRouteResource extends BaseJerseyTest {
.param("documentId", document2Id)
.param("transition", "REJECTED")), JsonObject.class);
// Check tags on document 2
json = target().path("/document/" + document2Id).request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.get(JsonObject.class);
tags = json.getJsonArray("tags");
Assert.assertEquals(1, tags.size());
Assert.assertEquals(tagPendingId, tags.getJsonObject(0).getString("id"));
// Validate the current step with admin
target().path("/route/validate").request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
.post(Entity.form(new Form()
.param("documentId", document2Id)
.param("transition", "VALIDATED")), JsonObject.class);
// Check tags on document 2
json = target().path("/document/" + document2Id).request()
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)