SEOSEO News

Optimizely CMS – Customize your Bulk Upload Confirmation / Blogs / Perficient


When you upload a media file to a specific location, if the file is already existed, you will be noticed by a warning:

Capture

You can either choose “Skip this File” to ignore the replacement, or hit “Replace File” to replace the old existing file.

The issue

Things went well until you did a bulk upload to replace a list of 4 files, but due to wrong naming, 2 of them are new and only 2 of them are existed.

Capture

Now you realized that maybe it was your mistake, you want to cancel the bulk upload, but at this point, there is NO GOING BACK! You have to select 1) Upload all of the 4 files and accept the replacements OR 2) Skip the existing files and continue upload the remaining 2 new files.

To undo the mistake, you have to delete/revert each of the file you have uploaded to that folder. It’s going to be painful if the folder is already large, or the number of files in your bulk upload is not just 4 but dozens.

The solution

It could be nice if we can have another button to cancel the upload so we can have a second chance to carefully review the changes. This is exactly what we did:

Capture

Taking a look at the MultipleFileUploadConfirmation component (the dialog displaying replacement warning), you can see it only have 2 options, skip or replace:

return [
    {
        name: "skipFiles",
        label: single ? resources.single.buttons.skip : resources.multiple.buttons.skip,
        title: null,
        action: function () {
            when(dialog.hide(), function () {
                return dialog.onAction(false);
            });
        }
    },
    {
        name: "replaceFiles",
        label: single ? resources.single.buttons.replace : resources.multiple.buttons.replace,
        settings: { "class": "Salt" },
        title: null,
        action: function () {
            when(dialog.hide(), function () {
                return dialog.onAction(true);
            });
        }
    }
];

We are going to extends the dialog, add another cancel button to scrap out the bulk upload.

Implementation steps

Setup a module initializer

First step is adding a module initializer. This will allows you to intercept to the UI events and create your own configures/customizations. Define your module initializer by following the Official Optimizely Developer Documentation

Create your own Upload Confirmation Dialog which extends the original one

We are creating a Custom Upload Confirmation Dialog based on the original dialog. But we will override the _getActions method (to add a cancel button) and the showConfirmation method (to handle when users select an action). Here is the example code:

define("poc/Widget/CustomMultipleFileUploadConfirmation", [
    // dojo
    "dojo/_base/array",
    "dojo/_base/declare",
    "dojo/_base/lang",

    "dojo/dom-class",

    "dojo/aspect",
    "dojo/Deferred",
    "dojo/when",
    // epi
    "epi/string",

    "epi/shell/widget/dialog/Dialog",

    "epi-cms/widget/ReadOnlyContentList",
    "epi-cms/widget/MultipleFileUploadConfirmation",
    // resources
    "epi/i18n!epi/cms/nls/episerver.cms.widget.uploadmultiplefiles.replaceconfirmdialog"
],

    function (
        // dojo
        array,
        declare,
        lang,

        domClass,

        aspect,
        Deferred,
        when,
        // epi
        epiString,

        Dialog,

        ReadOnlyContentList,
        MultipleFileUploadConfirmation,
        // resources
        resources
    ) {

        return declare([MultipleFileUploadConfirmation], {
            // summary:
            //      Confirmation dialog for multiple file upload widget
            // tags:
            //      internal

            showConfirmation: function (/*Array*/existingContents, /*Array*/uploadingFiles, /*Array*/newFiles) {
                // summary:
                //      Show confirmation dialog to replace/skip the existing contents when uploading file(s) by multiple file upload widget.
                // existingContents: [Array]
                //      Filtered existing content(s) on the server
                // uploadingFiles: [Array]
                //      The uploading file(s) given from multiple file upload widget
                // newFiles: [Array]
                //      Filtered new file(s) that are not existing on the server
                // returns: [dojo.Deferred]
                //      An instance of Array for filtered file list to upload to server.
                //      This list can be the whole original selected file(s) or just the new file(s) that not existed on the server.
                // tags:
                //      public

                var deferred = new Deferred(),
                    dialog = this._getDialog(existingContents.length),
                    content = this._getContentList();

                dialog.set("content", content);
                dialog.set("onAction", function (result) {
                    /*deferred.resolve(result ? uploadingFiles : newFiles);*/
                    switch (result) {
                        case 0:
                            // cancel
                            deferred.resolve([]);
                            break;
                        case 1:
                            // skip existing files
                            deferred.resolve(newFiles);
                            break;
                        case 2:
                            // replace
                            deferred.resolve(uploadingFiles);
                            break;
                        default:
                            deferred.resolve([]);
                            break;
                    }
                });

                when(dialog.show(), function () {
                    content.grid.renderArray(existingContents);
                });

                return deferred;
            },

            // =======================================================================
            // Private functions

            _getActions: function (/*epi/shell/widget/dialog/Dialog*/dialog, /*Boolean*/single) {
                // summary:
                //      Overridden from Dialog base to assemble the action collection
                // dialog: [epi/shell/widget/dialog/Dialog]
                //      Confirmation dialog
                // single: [Boolean]
                //      Indicates that we must show text for single item or multiple items
                // returns:
                //      A collection of action definitions that can be added to the action pane.
                // tags:
                //      private

                return [
                    {
                        name: "cancel",
                        label: "Cancel",
                        title: null,
                        action: function () {
                            when(dialog.hide(), function () {
                                return dialog.onAction(0);
                            });
                        }
                    },
                    {
                        name: "skipFiles",
                        label: single ? resources.single.buttons.skip : resources.multiple.buttons.skip,
                        title: null,
                        action: function () {
                            when(dialog.hide(), function () {
                                return dialog.onAction(1);
                            });
                        }
                    },
                    {
                        name: "replaceFiles",
                        label: single ? resources.single.buttons.replace : resources.multiple.buttons.replace,
                        settings: { "class": "Salt" },
                        title: null,
                        action: function () {
                            when(dialog.hide(), function () {
                                return dialog.onAction(2);
                            });
                        }
                    }
                ];
            }

        });

    });

 

Replace the old dialog with your custom dialog above, using moduleInitializer

define([
    "dojo",
    "dojo/_base/declare",
    "epi/_Module",
    "epi-cms/widget/MultipleFileUpload",
    "poc/Widget/CustomMultipleFileUploadConfirmation"
], function (dojo,
    declare,
    _Module,
    MultipleFileUpload,
    CustomMultipleFileUploadConfirmation
) {
    return declare("poc.moduleInitializer", [_Module], {
        initialize: function () {
            this.inherited(arguments);

            // Do any custom module initialization here

            // Extend postCreate method for MultipleFileUpload
            var originalMultipleFileUpload = MultipleFileUpload.prototype.postCreate;
            MultipleFileUpload.prototype.postCreate = function () {
                // call the original function
                originalMultipleFileUpload.apply(this, arguments);

                this._confirmationDialog = new CustomMultipleFileUploadConfirmation();
            }
        }
    });
});

 

That’s it! Now you have a cancel button for your Bulk Upload Confirmation Dialog. With this methodology you can even extend your custom dialog further to fit a variety of requirements. Happy coding!





Source link

Related Articles

Back to top button
Social media & sharing icons powered by UltimatelySocial
error

Enjoy Our Website? Please share :) Thank you!