Goal
Extend Classic UI Create Page Dialog to restrict user from creating pages with same title in a path. Create button is disabled when user opens the dialog and enabled only when user enters a unique title
Demo | Package Install
Solution
1) Login to CRXDE Lite (http://localhost:4502/crx/de) and create folder /apps/classic-ui-no-page-duplication
2) Create node /apps/classic-ui-no-page-duplication/clientlib of type cq:ClientLibraryFolder and add a String property categories with value cq.widgets
3) Create file (nt:file) /apps/classic-ui-no-page-duplication/clientlib/js.txt and add
check-page-name.js
4) Create file (nt:file) /apps/classic-ui-no-page-duplication/clientlib/check-page-name.js and add the following code.
(function(){
//the original create page dialog fn
var cqCreatePageDialog = CQ.wcm.Page.getCreatePageDialog;
//override ootb function
CQ.wcm.Page.getCreatePageDialog = function(parentPath){
//create dialog by executing the product function
var dialog = cqCreatePageDialog(parentPath);
try{
//disable create until page title gets validated
var createButton = dialog.buttons[0];
createButton.setDisabled(true);
//make necessary UI changes to the dialog created above
var panel = dialog.findBy(function(comp){
return comp["jcr:primaryType"] == "cq:Panel";
}, dialog);
if(!panel || !panel.length){
return;
}
panel = panel[0];
//get title field
var titleField = panel.findBy(function(comp){
return comp["fieldLabel"] == "Title";
}, panel);
if(!titleField || !titleField.length){
return;
}
titleField = titleField[0];
titleField.on('change', function(t, nvalue){
//when user enters title, search CRX if a title with same wording exists
$.ajax({
type: "GET",
url: "/bin/querybuilder.json",
data: {
"path": parentPath,
"0_property": "jcr:title",
"0_property.value": nvalue
}
}).done(function(data){
if(data && data.hits && data.hits.length > 0){
CQ.Ext.Msg.alert("Error", "Page " + nvalue + " exists in path " + parentPath);
return;
}
//not a duplicate, enable create button
createButton.setDisabled(false);
})
})
}catch(err){
console.log("Error executing CQ.wcm.Page.getCreatePageDialog override");
}
return dialog;
}
})();