AEM 61 - Classic UI Show Site Specific Workflows

Goal


Show Site specific Workflows in the Start Workflow Dialog of Classic UI SiteAdmin console

Demo | Package Install


Set Site Path on Workflow - eaemSitePath

              Set site root path - eaemSitePath for which the specific workflow should be available. Here Request for Activation workflow is shown for pages of Geometrixx Demo 
              Site /content/geometrixx only



Request for Activation available for pages of /content/geometrixx



Request for Activation NOT available for pages of  /content/geometrixx-media



Solution


1) Login to CRXDE Lite, create folder (nt:folder) /apps/classicui-site-specific-workflows

2) Create clientlib (type cq:ClientLibraryFolder/apps/classicui-site-specific-workflows/clientlib and set a property categories of String type to cq.widgets and dependencies value underscore

3) Create file ( type nt:file ) /apps/classicui-site-specific-workflows/clientlib/js.txt, add the following

                         site-workflows.js

4) Create file (type nt:file) /apps/classicui-site-specific-workflows/clientlib/site-workflows.js, add the following code

(function($){
    if(window.location.pathname != "/siteadmin"){
        return;
    }

    var SA_GRID = "cq-siteadmin-grid",
        WORKFLOW_BUT_TEXT = "Workflow...",
        START_WF_DIALOG_ID = "cq-workflowdialog",
        QUERY = "SELECT * FROM [cq:Page] WHERE ISDESCENDANTNODE([/etc/workflow/models]) AND " +
                "([jcr:content/eaemSitePath] = 'PLACEHOLDER' OR [jcr:content/eaemSitePath] IS NULL)";

    var SA_INTERVAL = setInterval(function(){
        var grid = CQ.Ext.getCmp(SA_GRID);

        if(!grid || ( grid.rendered != true)){
            return;
        }

        clearInterval(SA_INTERVAL);

        var toolBar = grid.getTopToolbar();

        try{
            var wButton = toolBar.find("text", WORKFLOW_BUT_TEXT)[0];

            wButton.on('click', filterWorkflows);
        }catch(err){
            console.log("Error adding workflow button listener");
        }
    }, 250);

    function filterWorkflows(){
        var wMgr = CQ.Ext.WindowMgr, winId;

        var W_INTERVAL = setInterval(function () {
            wMgr.each(function (win) {
                winId = win.id;

                if (winId && (winId.indexOf(START_WF_DIALOG_ID) < 0)) {
                    return;
                }

                var modelCombo = CQ.Ext.getCmp(winId + "-model");

                if(modelCombo.eaemInit){
                    return;
                }

                clearInterval(W_INTERVAL);

                modelCombo.eaemInit = true;

                var contentPath = window.location.hash.split("#")[1],
                    //you may want to replace the following query with a servlet returning results
                    query = "/crx/de/query.jsp?type=JCR-SQL2&showResults=true&stmt=" + QUERY.replace('PLACEHOLDER', contentPath);

                $.ajax( { url: query, context: modelCombo } ).done(filter);
            });
        }, 250);

        function filter(data){
            function handler(store, recs){
                var paths = _.pluck(data.results, "path"), modelId;

                _.each(recs, function (rec){
                    modelId = rec.data.wid;
                    modelId = modelId.substring(0, modelId.indexOf("/jcr:content/model"));

                    if(paths.indexOf(modelId) != -1){
                        return;
                    }

                    store.remove(rec);
                })
            }

            this.store.on('load', handler);
        }
    }
}(jQuery));

No comments:

Post a Comment