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 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/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));
No comments:
Post a Comment