AEM 62 - Touch UI Add Zoom in Assets Card View

Goal


Add Zoom functionality in Assets Card view, so the user doesn't need to go into Asset Detail - /assetdetails.html for zoom in/out the asset (needs dynamic media -Dsling.run.modes=dynamicmedia)

For Zooming card thumbnails check this post

Demo | Package Install | GitHub


Bug Fixes

Full screen doesn't work - Package Install


Zoom Quick Action



Asset Zoom



Solution


1) Login to CRXDE Lite, create folder (nt:folder) /apps/experience-aem-asset-zoom

2) Create clientlib (type cq:ClientLibraryFolder/apps/experience-aem-asset-zoom/clientlib and set a property categories of String type to dam.gui.actions.coraldependencies of type String[] with value underscore

3) Create file ( type nt:file ) /apps/experience-aem-asset-zoom/clientlib/js.txt, add the following

                         card-zoom.js

4) Create file ( type nt:file ) /apps/experience-aem-asset-zoom/clientlib/card-zoom.js, add the following code

(function ($, $document) {
    var FOUNDATION_MODE_CHANGE = "foundation-mode-change",
        DAM_ADMIN_CHILD_PAGES = ".cq-damadmin-admin-childpages",
        META_TYPE = "data-foundation-collection-meta-type",
        LAYOUT_CARD_VIEW = "card",
        ASSET_DETAIL = "/libs/dam/gui/content/assetdetails/jcr:content/content/items/assetdetail.html";

    $document.on(FOUNDATION_MODE_CHANGE, function(event){
        _.defer(function(){
            contentLoaded(event);
        });
    });

    function contentLoaded(){
        var $childPage = $(DAM_ADMIN_CHILD_PAGES),
            foundationLayout = $childPage.data("foundation-layout");

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

        var layoutId = foundationLayout.layoutId;

        if(layoutId !== LAYOUT_CARD_VIEW){
            return;
        }

        var $items = $("coral-masonry-item"), $item,
            dialog = getZoomDialog();

        $items.each(function(){
            $item = $(this);

            if($item.find("[" + META_TYPE + "]").attr(META_TYPE) !== "asset"){
                return;
            }

            var $action = getZoomAction(dialog).appendTo($item);

            $item.mouseenter(function(){
                $action.show();
            });

            $item.mouseleave(function(){
                $action.hide();
            })
        });
    }

    function getZoomDialog(){
        var dialog = new Coral.Dialog().set({
            closable: "on",
            header: {
                innerHTML: 'Zoom'
            },
            content: {
                innerHTML: getZoomDialogContent()
            }
        });

        var uiAdjust = { "left" : "0%", "margin-left" : "0px", "max-width" : "100%" };

        dialog.$.find(".coral-Dialog-wrapper").css(uiAdjust);

        return dialog;
    }

    function getZoomDialogContent(){
        var vpWidth = $(window).width() - 30,
            vpHeight = $(window).height() - 110;

        return "<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen width='"
            + vpWidth + "px' height='" + vpHeight + "px' scrolling='no' frameBorder='0'></iframe>";
    }

    function getZoomAction(dialog){
        return $(getHtml()).hide().click(clickHandler);

        function clickHandler(event){
            event.stopPropagation();

            var assetPath = $(this).closest(".foundation-collection-item").data("foundationCollectionItemId");

            dialog.$.find("iframe").attr("src", ASSET_DETAIL + assetPath);

            dialog.show();
        }
    }

    function getHtml(){
        return '<button style="position: absolute;top: 35%;left: 35%;z-index: 10000;cursor: zoom-in;"' +
                    ' class="coral-Button coral-Button--square coral-QuickActions-button">' +
                    '<coral-icon icon="zoomIn"></coral-icon>' +
                '</button>';
    }
})(jQuery, jQuery(document));

No comments:

Post a Comment