Thursday, June 28, 2018

AEM 63 Add Custom Properties to DAM folders

AEM 63 Add Custom Properties to DAM folders


Goal


Add custom properties to AEM DAM folders....

Demo | Package Install | Github


Extension



Saved in CRX



Solution


1) Login to CRXDE Lite (http://localhost:4502/crx/de), create folder /apps/eaem-touchui-custom-folder-properties

2)  Create the custom folder properties dialog /apps/eaem-touchui-custom-folder-properties/dialog with following xml

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root
jcr_primaryType="nt:unstructured"
sling_resourceType="granite/ui/components/coral/foundation/container">
<layout
jcr_primaryType="nt:unstructured"
sling_resourceType="granite/ui/components/coral/foundation/layouts/fixedcolumns"
margin="{Boolean}false"/>
<items jcr_primaryType="nt:unstructured">
<column
jcr_primaryType="nt:unstructured"
sling_resourceType="granite/ui/components/coral/foundation/container">
<items jcr_primaryType="nt:unstructured">
<webTitle
jcr_primaryType="nt:unstructured"
sling_resourceType="granite/ui/components/coral/foundation/form/textfield"
fieldDescription="Enter Title"
fieldLabel="Web Title"
name="./eaemWebTitle"
required="{Boolean}true"/>
<webDesc
jcr_primaryType="nt:unstructured"
sling_resourceType="granite/ui/components/coral/foundation/form/textarea"
fieldDescription="Enter Description"
fieldLabel="Web Description"
name="./eaemWebDesc"
required="{Boolean}true"/>
</items>
</column>
</items>
</jcr:root>


3) Create node /apps/eaem-touchui-custom-folder-properties/clientlib of type cq:ClientLibraryFolder, add String[] property categories value [cq.gui.damadmin.foldershare.coral, cq.authoring.dialog.all] , String[] property dependencies with value lodash

4) Create file (nt:file) /apps/eaem-touchui-custom-folder-properties/clientlib/js.txt, add

                        folder-properties.js

5) Create file (nt:file) /apps/eaem-touchui-custom-folder-properties/clientlib/folder-properties.js, add the following code

(function($, $document) {
var FOLDER_SHARE_WIZARD = "/mnt/overlay/dam/gui/content/assets/foldersharewizard.html",
CUSTOM_DIALOG = "/apps/eaem-touchui-custom-folder-properties/dialog",
EAEM_GET_ADDN_PROPERTIES = "EAEM_GET_ADDN_PROPERTIES",
url = document.location.pathname, $customTab;

if( url.indexOf(FOLDER_SHARE_WIZARD) == 0 ){
handleAssetsConsole();
}else if(url.indexOf(CUSTOM_DIALOG) == 0){
handlePropertiesDialog();
}

function handleAssetsConsole(){
$document.on("foundation-contentloaded", addProperties);
}

function addProperties(){
var cuiTabView = $("coral-tabview");

if(_.isEmpty(cuiTabView)){
return;
}

cuiTabView = cuiTabView[0];

$customTab = $(getCustomTab()).appendTo(cuiTabView.$.children("coral-tablist"));

var $panel = $(getCustomPanel()).appendTo(cuiTabView.$.children("coral-panelstack")),
$iFrame = $panel.find("iframe");

$customTab.on("click",function(){
if(!_.isEmpty($iFrame.attr("src"))){
return;
}

$iFrame.attr("src", CUSTOM_DIALOG + ".html?folder=" + ($("form")).attr("action"));
});

addDummySubmit($iFrame);
}

function addDummySubmit($iFrame){
var $submit = $("button[type=submit]"), $dummySubmit;

$dummySubmit = $("<button variant=primary is=coral-button>Save</button>").insertAfter($submit);

$submit.hide();

$dummySubmit.click(handler);

function handler(event){
event.preventDefault();

var message = {
action: EAEM_GET_ADDN_PROPERTIES
};

$iFrame[0].contentWindow.postMessage(JSON.stringify(message), "*");
}

registerReceiveDataListener(addAddnPropertiesToForm);
}

function addAddnPropertiesToForm(event){
var message = JSON.parse(event.data);

if( message.action !== EAEM_GET_ADDN_PROPERTIES ){
return;
}

$customTab.find("coral-tab-label").css("color", message.isDataInValid ? "#e14132" : "#707070");

if(message.isDataInValid){
return;
}

var $form = $("form"), $submit = $("button[type=submit]");

$submit.click();

$.post( $form.attr("action") + "/jcr:content", message.data );
}

function handlePropertiesDialog(){
$(function(){
_.defer(styleCustomDialogIFrame);
});

registerReceiveDataListener(postAddnProperties);
}

function styleCustomDialogIFrame() {
var $dialog = $("coral-dialog");

if (_.isEmpty($dialog)) {
return;
}

$dialog.css("overflow", "hidden");

$dialog[0].open = true;

$dialog.find(".coral-Dialog-header").remove();

Coral.commons.ready(coralReady);

function coralReady() {
var top = ($(window).width() - 1140) + "px",
left = ($(window).height() - 1155) + "px";

$dialog.find(".coral-Dialog-wrapper").css("margin", top + " 0 0 " + left)
.css("background-color", "#f5f5f5");

$.ajax(queryParameters()["folder"] + "/jcr:content.json").done(function(data){
var $fields = $dialog.find("[name^=./]"), $field, name;

$fields.each(function (index, field) {
$field = $(field);
$field.val(data[$field.attr("name").substr(2)] || );
})
});
}
}

function postAddnProperties(event){
var message = JSON.parse(event.data);

if( message.action !== EAEM_GET_ADDN_PROPERTIES ){
return;
}

var $dialog = $("coral-dialog"),
$fields = $dialog.find("[name^=./]"),
data = {}, $field, $fValidation, name, value, values,
isDataInValid = false;

$fields.each(function(index, field){
$field = $(field);
name = $field.attr("name");
value = $field.val();

$fValidation = $field.adaptTo("foundation-validation");

if($fValidation && !$fValidation.checkValidity()){
isDataInValid = true;
}

$field.updateErrorUI();

if(_.isEmpty(value)){
return;
}

data[name.substr(2)] = value;
});

message = {
action: EAEM_GET_ADDN_PROPERTIES,
data: data,
isDataInValid: isDataInValid
};

parent.postMessage(JSON.stringify(message), "*");
}

function getCustomTab(){
var title = "Custom";

$.ajax( { url: CUSTOM_DIALOG + ".json", async: false}).done(function(data){
title = data["jcr:title"];
});

return <coral-tab> +
<coral-tab-label> + title + </coral-tab-label> +
</coral-tab>;
}

function getCustomPanel(){
var iFrame = <iframe width="750px" height="750px" seamless="seamless" frameborder="0" />;

return <coral-panel> +
<div style="margin-top: 5px"> + iFrame + </div> +
</coral-panel>;
}

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;
}

function registerReceiveDataListener(handler) {
if (window.addEventListener) {
window.addEventListener("message", handler, false);
} else if (window.attachEvent) {
window.attachEvent("onmessage", handler);
}
}
})(jQuery, jQuery(document));




visit link download