Goal
Show simple Metadata Form in the Upload Dialog of Touch UI Assets Console; With this extension users can add metadata while uploading files
For AEM 63 check this post
Demo | Package Install
Bug Fixes
Support for Metadata Validity - Demo | Package Install
Bug Fix - Metadata Validity
Metadata Schema
Add a new tab to Image metadata schema form (how-to documentation) for showing the metadata entered while uploading Image assets
Metadata Form in Upload Dialog
Metadata Display
Metadata in CRX
Solution
1) Login to CRXDE Lite (http://localhost:4502/crx/de), create folder /apps/eaem-assets-file-upload-with-metadata
2) Metadata form shown in Upload Dialog is Authoring Dialog; Create the dialog /apps/eaem-assets-file-upload-with-metadata/dialog, add metadata form nodes
Dialog 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/foundation/container"> <layout jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/layouts/fixedcolumns" margin="{Boolean}false"/> <items jcr:primaryType="nt:unstructured"> <column jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/container"> <items jcr:primaryType="nt:unstructured"> <title jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/form/textfield" fieldLabel="Title" name="./eaemTitle"/> <alt jcr:primaryType="nt:unstructured" sling:resourceType="granite/ui/components/foundation/form/textfield" fieldDescription="(leave empty to use the title defined above)" fieldLabel="Alt Text" name="./eaemAltText"/> </items> </column> </items> </jcr:root>
3) Create node /apps/eaem-assets-file-upload-with-metadata/clientlib of type cq:ClientLibraryFolder, add String[] property categories with value dam.gui.coral.fileupload, cq.authoring.dialog String[] property dependencies with value underscore
4) Create file (nt:file) /apps/eaem-assets-file-upload-with-metadata/clientlib/js.txt, add
fileupload-with-metadata.js
5) Create file (nt:file) /apps/eaem-assets-file-upload-with-metadata/clientlib/fileupload-with-metadata.js, add the following code
(function($, $document) { var METADATA_DIALOG = "/apps/eaem-assets-file-upload-with-metadata/dialog.html", METADATA_PREFIX = "eaem", ACTION_CHECK_DATA_VALIDITY = "ACTION_CHECK_DATA_VALIDITY", ACTION_POST_METADATA = "ACTION_POST_METADATA", url = document.location.pathname, metadataDialogAdded = false; if( url.indexOf("/assets.html") == 0 ){ handleAssetsConsole(); }else if(url.indexOf(METADATA_DIALOG) == 0){ handleMetadataDialog(); } function handleAssetsConsole(){ $document.on("foundation-contentloaded", handleFileAdditions); } function handleMetadataDialog(){ $document.on("foundation-contentloaded", styleMetadataIframe); } function registerReceiveDataListener(handler) { if (window.addEventListener) { window.addEventListener("message", handler, false); } else if (window.attachEvent) { window.attachEvent("onmessage", handler); } } function styleMetadataIframe(){ $(".cq-dialog-actions").remove(); registerReceiveDataListener(postMetadata); function postMetadata(event){ var message = JSON.parse(event.data); if( (message.action !== ACTION_CHECK_DATA_VALIDITY) && (message.action !== ACTION_POST_METADATA)){ return; } var $dialog = $(".cq-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; } name = name.substr(2); if(name.indexOf(METADATA_PREFIX) !== 0){ return; } if(!_.isEmpty(data[name])){ if(_.isArray(data[name])){ data[name].push(value); }else{ values = []; values.push(data[name]); values.push(value); data[name] = values; data[name + "@TypeHint"] = "String[]"; } }else{ data[name] = value; } }); if(message.action === ACTION_CHECK_DATA_VALIDITY){ sendValidityMessage(isDataInValid); }else{ $.ajax({ type : 'POST', url : message.path, data : data }) } } function sendValidityMessage(isDataInValid){ var message = { action: ACTION_CHECK_DATA_VALIDITY, isDataInValid: isDataInValid }; parent.postMessage(JSON.stringify(message), "*"); } } function handleFileAdditions(){ var $fileUpload = $("coral-chunkfileupload"), $metadataIFrame, $uploadButton, validateUploadButton; $fileUpload.on('coral-fileupload:fileadded', addMetadataDialog); $fileUpload.on('coral-fileupload:loadend', postMetadata); function sendDataMessage(message){ $metadataIFrame[0].contentWindow.postMessage(JSON.stringify(message), "*"); } function addMetadataDialog(){ if(metadataDialogAdded){ return; } metadataDialogAdded = true; _.debounce(addDialog, 500)(); } function addDialog(){ var $dialog = $("coral-dialog-header:contains('Upload')").closest("coral-dialog"), iFrame = '<iframe width="550px" height="450px" src="' + METADATA_DIALOG + '"/>', $dialogContent = $dialog.find("coral-dialog-content"); $metadataIFrame = $(iFrame).appendTo($dialogContent.css("max-height", "600px")); $dialogContent.find("input").css("width", "30rem"); $dialogContent.closest(".coral-Dialog-wrapper").css("top", "27%").css("left", "40%"); addValidateUploadButton($dialog); } function addValidateUploadButton($dialog){ var $footer = $dialog.find("coral-dialog-footer"); $uploadButton = $footer.find("coral-button-label:contains('Upload')").closest("button"); validateUploadButton = new Coral.Button().set({ variant: 'primary' }); validateUploadButton.label.textContent = Granite.I18n.get('Upload'); $footer.append(validateUploadButton); $uploadButton.hide(); validateUploadButton.hide(); validateUploadButton.on('click', function() { checkDataValidity(); }); $metadataIFrame.on('load', function(){ validateUploadButton.show(); }); registerReceiveDataListener(isMetadataValid); } function isMetadataValid(event){ var message = JSON.parse(event.data); if( (message.action !== ACTION_CHECK_DATA_VALIDITY)){ return; } if(message.isDataInValid){ return; } validateUploadButton.hide(); $uploadButton.click(); } function checkDataValidity(){ var message = { action: ACTION_CHECK_DATA_VALIDITY }; sendDataMessage(message); } function postMetadata(event){ var detail = event.originalEvent.detail, folderPath = detail.action.replace(".createasset.html", ""), assetMetadataPath = folderPath + "/" + detail.item._file.name + "/jcr:content/metadata"; var message = { action: ACTION_POST_METADATA, path: assetMetadataPath }; sendDataMessage(message); } } })(jQuery, jQuery(document));
One of the biggest challenges that organizations face today is having inaccurate data and being unresponsive to the needs of the Adobe CQ5 CMS Email List organization.
ReplyDelete