Goal
Add Complete all functionality to Touch UI Inbox, to complete the current step of all selected items with one click
Demo | Package Install | GitHub
Solution
1) Login to CRXDE Lite (http://localhost:4502/crx/de), create folder /apps/eaem-inbox-complete-all
2) Create node /apps/eaem-inbox-complete-all/button/complete-all-selected of type nt:unstructured, with the following properties, for button html
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/endor/actionbar/button"
align="right"
class="button primary"
formId="updateworkitemform"
icon="coral-Icon--checkCircle"
text="Complete all Selected Items"/>
3) Create node /apps/eaem-inbox-complete-all/clientlib of type cq:ClientLibraryFolder, add String property categories with value cq.workflow.gui.inbox, String property dependencies with value underscore
4) Create file (nt:file) /apps/eaem-inbox-complete-all/clientlib/js.txt, add
complete-all-selected.js
5) Create file (nt:file) /apps/eaem-inbox-complete-all/clientlib/complete-all-selected.js, add the following code
(function ($, $document) {
var FOUNDATION_CONTENT_LOADED = "foundation-contentloaded",
FOUNDATION_DATA_MODEL_LOADED = "foundation-model-dataloaded",
UPDATE_TASK_FORM = "#updatetaskform,#updateworkitemform",
COMPLETE_TASK = "[type=submit]",
completeAllAdded = false,
doCompleteAll = false, taskData = {},
fui = $(window).adaptTo("foundation-ui"),
COMPLETE_ALL_BUT_URL = "/apps/eaem-inbox-complete-all/button/complete-all-selected.html";
$document.on(FOUNDATION_CONTENT_LOADED, function(){
var $form = $(UPDATE_TASK_FORM);
if(_.isEmpty($form) || completeAllAdded){
return;
}
completeAllAdded = true;
$.ajax(COMPLETE_ALL_BUT_URL).done(addCompleteAllButton);
$form.on(FOUNDATION_DATA_MODEL_LOADED, completeTasks);
});
function setWidgetValue($field, value){
if(isSelectOne($field)){
setSelectOne($field, value);
}else{
$field.val(value);
}
}
function fillFormData(){
if(_.isEmpty(taskData)){
return;
}
var $form = $(UPDATE_TASK_FORM), $field;
_.each(taskData, function(value, name){
$field = $form.find("[name='" + name + "']");
if(_.isEmpty($field)){
return;
}
setWidgetValue($field, value);
})
}
function completeTasks(){
if(!doCompleteAll) {
return;
}
fillFormData();
$(UPDATE_TASK_FORM).submit();
var store = Granite.UI.Extension.DataStore;
if(!store.hasItems()){
doCompleteAll = false;
fui.clearWait();
}
}
function addCompleteAllButton(html){
doCompleteAll = false;
var $completeTask = $(COMPLETE_TASK),
$completeAll = $(html).insertAfter($completeTask);
$completeTask.closest("div").removeAttr("style");
$completeAll.click(function(){
doCompleteAll = true;
var $form = $(UPDATE_TASK_FORM),
store = Granite.UI.Extension.DataStore;
if(store.getSize() > 1){
fui.wait();
taskData = queryParameters($form.serialize());
}
$form.submit();
})
}
function isSelectOne($field) {
return !_.isEmpty($field) && ($field.prop("type") === "select-one");
}
function setSelectOne($field, value) {
var select = $field.closest(".coral-Select").data("select");
if (select) {
select.setValue(value);
}
}
function queryParameters(searchStr) {
var result = {}, param,
params = (searchStr ? searchStr.split(/\?|\&/) : document.location.search.split(/\?|\&/));
params.forEach( function(it) {
if (_.isEmpty(it)) {
return;
}
param = it.split("=");
result[param[0]] = param[1];
});
return result;
}
}($, $(document)));