Saturday, July 28, 2018
AEM 6 3 1 0 Show Custom Banners in Card List Column Views of Touch UI
AEM 6 3 1 0 Show Custom Banners in Card List Column Views of Touch UI
Goal
Show custom banners in all 3 views - Card, List, Column, when assets size crosses a certain limit eg. the following logic adds red banner if size > 50mb and amber banner if size > 4mb
Demo | Package Install | Github
Card View
List View
Column View
Solution
1) Login to CRXDE Lite (http://localhost:4502/crx/de), create folder /apps/eaem-touchui-assets-banners
2) Create node /apps/eaem-touchui-assets-banners/clientlib of type cq:ClientLibraryFolder, add String[] property categories value [dam.gui.actions.coral] , String[] property dependencies with value underscore
3) Create file (nt:file) /apps/eaem-touchui-assets-banners/clientlib/js.txt, add
banners.js
4) Create file (nt:file) /apps/eaem-touchui-assets-banners/clientlib/banners.js, add the following code
(function ($, $document) {
var FOUNDATION_CONTENT_LOADED = "foundation-contentloaded",
FOUNDATION_MODE_CHANGE = "foundation-mode-change",
FOUNDATION_COLLECTION_ID = "foundation-collection-id",
LAYOUT_COL_VIEW = "column",
LAYOUT_LIST_VIEW = "list",
LAYOUT_CARD_VIEW = "card",
COLUMN_VIEW = "coral-columnview",
EVENT_COLUMNVIEW_CHANGE = "coral-columnview:change",
FOUNDATION_COLLECTION_ITEM_ID = "foundation-collection-item-id",
CORAL_COLUMNVIEW_PREVIEW = "coral-columnview-preview",
CORAL_COLUMNVIEW_PREVIEW_ASSET = "coral-columnview-preview-asset",
EAEM_BANNER_CLASS = "eaem-banner",
EAEM_BANNER = ".eaem-banner",
FOUNDATION_COLLECTION_ITEM_TITLE = ".foundation-collection-item-title",
MED_SIZE_LIMIT = "4194304", //4mb
LARGE_SIZE_LIMIT = "52428800", //50mb
colViewListenerAdded = false,
DAM_ADMIN_CHILD_PAGES = ".cq-damadmin-admin-childpages";
$document.on(FOUNDATION_CONTENT_LOADED, checkFileSizes);
$document.on(FOUNDATION_MODE_CHANGE, function(){
colViewListenerAdded = false;
checkFileSizes();
});
function checkFileSizes(){
var folderPath = $(DAM_ADMIN_CHILD_PAGES).data(FOUNDATION_COLLECTION_ID);
if(_.isEmpty(folderPath)){
return;
}
$.ajax(folderPath + ".3.json").done(showLargeFileSizeBanners);
}
function showLargeFileSizeBanners(pathsObj){
if(isColumnView()){
handleColumnView();
}
if(_.isEmpty(pathsObj)){
return;
}
if(isCardView()){
addCardViewBanner(pathsObj);
}else if(isListView()){
addListViewBanner(pathsObj)
}
}
function handleColumnView(){
var $columnView = $(COLUMN_VIEW);
if(colViewListenerAdded){
return;
}
colViewListenerAdded = true;
$columnView.on(EVENT_COLUMNVIEW_CHANGE, handleColumnItemSelection);
}
function handleColumnItemSelection(event){
var detail = event.originalEvent.detail,
$asset = $(detail.selection[0]),
assetPath = $asset.data(FOUNDATION_COLLECTION_ITEM_ID);
if(_.isEmpty(assetPath)){
return;
}
$.ajax(assetPath + ".2.json").done(addColumnViewBanner);
}
function addColumnViewBanner(assetObj){
getUIWidget(CORAL_COLUMNVIEW_PREVIEW).then(handler);
function handler($colPreview){
var $assetPreview = $colPreview.find(CORAL_COLUMNVIEW_PREVIEW_ASSET);
$assetPreview.find(EAEM_BANNER).remove();
$assetPreview.prepend(getBannerMissingLinksHtmlColumnView(assetObj));
}
}
function getBannerMissingLinksHtmlColumnView(assetObj){
var size = nestedPluck(assetObj,"jcr:content/metadata/dam:size");
if(!size || (nestedPluck(assetObj,"jcr:content/dam:assetState") == "processing")){
return;
}
var ct = getColorText(size);
if(!ct.color){
return;
}
return "<coral-tag style=background-color: " + ct.color + ";z-index: 9999; width: 100% class=" + EAEM_BANNER_CLASS + ">" +
"<i class=coral-Icon coral-Icon--bell coral-Icon--sizeXS style=margin-right: 10px></i>" +
ct.text +
"</coral-tag>";
}
function getBannerMissingLinksHtml(assetObj){
var size = nestedPluck(assetObj,"jcr:content/metadata/dam:size"), color, text;
if(!size || (nestedPluck(assetObj,"jcr:content/dam:assetState") == "processing")){
return;
}
var ct = getColorText(size);
if(!ct.color){
return;
}
return "<coral-alert style=background-color:" + ct.color + " class=" + EAEM_BANNER_CLASS + ">" +
"<coral-alert-content>" + ct.text + "</coral-alert-content>" +
"</coral-alert>";
}
function getColorText(size){
size = parseFloat(size);
var color, text;
if(size > LARGE_SIZE_LIMIT){
color = "#ff7f7f";
text = "LARGE > 50 MB";
}else if(size > MED_SIZE_LIMIT){
color = "#FFBF00";
text = "MEDIUM > 4 MB";
}
return{
color: color,
text: text
}
}
function addListViewBanner(pathsObj){
var $container = $(DAM_ADMIN_CHILD_PAGES), $item, clazz, assetPath, ct, size,
folderPath = $container.data(FOUNDATION_COLLECTION_ID);
_.each(pathsObj, function(assetObj, assetName){
if(_.isString(assetObj) && isJCRProperty(assetName)){
return;
}
assetPath = folderPath + "/" + assetName;
$item = $container.find("[data-" + FOUNDATION_COLLECTION_ITEM_ID + "=" + assetPath + "]");
if(!_.isEmpty($item.find(EAEM_BANNER))){
return;
}
size = nestedPluck(assetObj,"jcr:content/metadata/dam:size");
ct = getColorText(size);
if(!ct.color){
return
}
$item.find("td").css("background-color" , ct.color).addClass(EAEM_BANNER_CLASS);
$item.find(FOUNDATION_COLLECTION_ITEM_TITLE).prepend(getListViewMissingLinksHtml());
});
}
function getListViewMissingLinksHtml(){
return "<i class=coral-Icon coral-Icon--bell coral-Icon--sizeXS style=margin-right: 10px></i>";
}
function addCardViewBanner(pathsObj){
var $container = $(DAM_ADMIN_CHILD_PAGES), $item, assetPath,
folderPath = $container.data(FOUNDATION_COLLECTION_ID);
_.each(pathsObj, function(assetObj, assetName){
if(_.isString(assetObj) && isJCRProperty(assetName)){
return;
}
assetPath = folderPath + "/" + assetName;
$item = $container.find("[data-" + FOUNDATION_COLLECTION_ITEM_ID + "=" + assetPath + "]");
if(_.isEmpty($item)){
return;
}
if(!_.isEmpty($item.find(EAEM_BANNER))){
return;
}
$item.find("coral-card-info").append(getBannerMissingLinksHtml(assetObj));
});
}
function isColumnView(){
return ( getAssetsConsoleLayout() === LAYOUT_COL_VIEW );
}
function isListView(){
return ( getAssetsConsoleLayout() === LAYOUT_LIST_VIEW );
}
function isCardView(){
return (getAssetsConsoleLayout() === LAYOUT_CARD_VIEW);
}
function getAssetsConsoleLayout(){
var $childPage = $(DAM_ADMIN_CHILD_PAGES),
foundationLayout = $childPage.data("foundation-layout");
if(_.isEmpty(foundationLayout)){
return "";
}
return foundationLayout.layoutId;
}
function getUIWidget(selector){
if(_.isEmpty(selector)){
return;
}
var deferred = $.Deferred();
var INTERVAL = setInterval(function(){
var $widget = $(selector);
if(_.isEmpty($widget)){
return;
}
clearInterval(INTERVAL);
deferred.resolve($widget);
}, 250);
return deferred.promise();
}
function startsWith(val, start){
return val && start && (val.indexOf(start) === 0);
}
function isJCRProperty(property){
return (startsWith(property, "jcr:") || startsWith(property, "sling:"));
}
function nestedPluck(object, key) {
if (!_.isObject(object) || _.isEmpty(object) || _.isEmpty(key)) {
return [];
}
if (key.indexOf("/") === -1) {
return object[key];
}
var nestedKeys = _.reject(key.split("/"), function(token) {
return token.trim() === "";
}), nestedObjectOrValue = object;
_.each(nestedKeys, function(nKey) {
if(_.isUndefined(nestedObjectOrValue)){
return;
}
if(_.isUndefined(nestedObjectOrValue[nKey])){
nestedObjectOrValue = undefined;
return;
}
nestedObjectOrValue = nestedObjectOrValue[nKey];
});
return nestedObjectOrValue;
}
}($, $(document)));