Goal
Show Dialog with Paths (Pages, Assets) Referencing Tag(s), before user hits yes and Tag(s) removed, in Touch UI Tagging Console - http://localhost:4502/aem/tags.html
For Classic UI check this post
Demo | Package Install
Product
Extension
Solution
1) Login to CRXDE Lite, create folder (nt:folder) /apps/touchui-show-tag-references
2) Create clientlib (type cq:ClientLibraryFolder) /apps/touchui-show-tag-references/clientlib and set a property categories of String type to cq.tagging.touch.deletetag and dependencies String[] underscore
3) Create file ( type nt:file ) /apps/touchui-show-tag-references/clientlib/js.txt, add the following
tag-references.js
4) Create file ( type nt:file ) /apps/touchui-show-tag-references/clientlib/tag-references.js, add the following code
(function ($, $document) {
//the query to find tag references (pages and assets)
var CHECK_TAGS_SQL_2_QUERY = "SELECT * from [nt:base] AS t WHERE ISDESCENDANTNODE([/content]) AND ( ",
DELETE_TAG_ACTIVATOR = ".cq-tagging-touch-actions-deletetag-activator";
$document.on('foundation-contentloaded', function() {
registerShowRefsAlert();
});
function registerShowRefsAlert(){
$(DELETE_TAG_ACTIVATOR).click(clickHandler);
}
function clickHandler(event){
var $selectedItems = $(".foundation-selections-item"),
query = CHECK_TAGS_SQL_2_QUERY, tagId,
path, paths = [];
$selectedItems.each(function(index, item) {
path = $(item).data("foundation-collection-item-id");
paths.push(path);
tagId = getTagIDFromPath(path);
query = query + "t.[cq:tags] = '" + tagId + "'";
if(index < ($selectedItems.length - 1)){
query = query + " OR ";
}
});
query = query + " )";
//you may want to replace this crxde lite call with a servlet returning query results
query = "/crx/de/query.jsp?type=JCR-SQL2&showResults=true&stmt=" + query;
$.ajax( { url: query, async: false } ).done(function(data){
showAlert(data, paths, event);
});
}
function showAlert(data, paths, event){
if(_.isEmpty(data) || _.isEmpty(data.results)){
return;
}
event.stopPropagation();
var fui = $(window).adaptTo("foundation-ui"),
options = [{
text: "NO"
},{
id: "YES",
text: "YES",
primary: true
}];
function callback(actionId){
if (actionId != "YES") {
return;
}
deleteTags(paths).done(handler);
function handler(){
$(".foundation-content").adaptTo("foundation-content").refresh();
var fui = $(window).adaptTo("foundation-ui"),
options = [{
text: "OK"
}];
fui.prompt("Success", "Tag(s) deleted successfully", "default", options);
}
}
var message = "Selected tag(s) are referenced. Click 'yes' to proceed deleting, 'no' to cancel the operation.";
_.each(data.results, function(result){
message = message + result.path;
});
fui.prompt("Delete Tag", message, "default", options, callback);
}
function getTagIDFromPath(tagPath){
return tagPath.substring("/etc/tags".length + 1).replace("/", ":");
}
function deleteTags(paths) {
return $.ajax({
url: "/bin/tagcommand",
type: "post",
data: {
cmd: "deleteTag",
path: paths,
"_charset_": "utf-8"
}
});
}
}(jQuery, jQuery(document)));