Goal
This post is on extendingcomponent drop overlay placeholders to show custom text (and background color) instead of component name (jcr:title)
Foundation Text component (/libs/foundation/components/text) was modified for demonstration only (on Geometrixx pages), ideally the foundation components should never be altered...
Demo | Package Install
Configure Placeholder text
eaemPlaceholderText - Custom text to be shown instead of component name
eaemPlaceholderBGColor - Placeholder overlay background color
Placeholder on Page
Solution
1) Login to CRXDE Lite, create folder (nt:folder) /apps/touchui-configure-components-placeholder
2) Create clientlib (type cq:ClientLibraryFolder) /apps/touchui-configure-components-placeholder/clientlib and set property categories of String[] type to cq.authoring.dialog and dependencies to underscore
3) Create file ( type nt:file ) /apps/touchui-configure-components-placeholder/clientlib/js.txt, add the following
configure-placeholder.js
4) Create file ( type nt:file ) /apps/touchui-configure-components-placeholder/clientlib/configure-placeholder.js, add the following code
(function ($, $document, gAuthor) {
var PLACEHOLDER_TEXT = "eaemPlaceholderText",
PLACEHOLDER_BG_COLOR = "eaemPlaceholderBGColor",
PLACE_HOLDER = "cq-Overlay--placeholder",
configCache = {},
//look for configured placeholders only on these components
LOOK_FOR_PLACEHOLDER_COMPONENTS = [
"/libs/foundation/components/text",
"/libs/foundation/components/textimage"
];
$document.on('cq-layer-activated', addPlaceholder);
$document.on('cq-inspectable-added', componentAdded);
function componentAdded(event){
var LM = gAuthor.layerManager;
if (LM.getCurrentLayer() != "Edit") {
return;
}
var editable = event.inspectable;
//placeholder overlay gets added after triggering cq-inspectable-added event
//add a setTimeout workaround
setTimeout(function(){
configurePlaceholder(editable);
}, 500)
}
function addPlaceholder(event){
if(event.layer !== "Edit"){
return;
}
_.each(gAuthor.edit.findEditables(), configurePlaceholder);
}
function prefixLib(type){
type = type.trim();
if(type.indexOf("/") !== 0){
type = "/libs/" + type;
}
return type;
}
function configurePlaceholder(editable){
if(!isAllowedForPlaceholderConfig(editable)){
return;
}
var parent = editable.getParent(),
$overlay = $(parent.overlay.dom),
$placeholder = $overlay.find("[data-path='" + editable.path + "']");
if(!$placeholder.hasClass(PLACE_HOLDER)){
return;
}
var type = prefixLib(editable.type);
if(_.isEmpty(configCache[type])){
$.ajax( type + ".json" ).done(configure);
}else{
configure(configCache[type]);
}
function configure(data){
if(_.isEmpty(data)){
return;
}
configCache[type] = data;
var color;
if(!_.isEmpty(data[PLACEHOLDER_TEXT])){
$placeholder.attr("data-text", data[PLACEHOLDER_TEXT]);
}
if(!_.isEmpty(data[PLACEHOLDER_BG_COLOR])){
$placeholder.css("background-color", data[PLACEHOLDER_BG_COLOR]);
}
}
}
function isAllowedForPlaceholderConfig(editable){
return editable && editable.getParent()
&& editable.getParent().overlay
&& (LOOK_FOR_PLACEHOLDER_COMPONENTS.indexOf(prefixLib(editable.type)) !== -1)
}
})(jQuery, jQuery(document), Granite.author);