MDL-58645 Drag and drop onto image questions: responsive support
[moodle.git] / question / type / ddimageortext / amd / build / form.min.js.map
blobd8856e241c8e92f2549897078f9cd0dbae04d4a6
1 {"version":3,"sources":["../src/form.js"],"names":["define","$","dragDrop","dragDropToImageForm","maxBgImageSize","maxDragImageSize","fp","init","filePickers","append","updateVisibilityOfFilePickers","setOptionsForDragItemSelectors","setupEventHandlers","waitForFilePickerToInitialise","file","href","setTimeout","M","util","js_pending","on","loadPreviewImage","one","afterPreviewImageLoaded","attr","bgImg","constrainImageSize","createDropZones","js_complete","img","maxSize","reduceby","Math","max","width","height","css","floor","addClass","dropZoneHolder","empty","bgimageurl","numDrops","form","getFormValue","dropNo","dragNo","group","label","imgUrl","waitForAllDropImagesToBeLoaded","notYetLoadedImages","not","i","imgNode","imageIsLoaded","length","updateDropZones","imgElement","complete","naturalHeight","dropBackgroundPosition","offset","drop","left","parseInt","top","is","html","numGroups","first","find","resizeAllDragsAndDropsInGroup","drops","maxWidth","maxHeight","each","ceil","offsetWidth","offsetHeight","round","e","input","target","closest","hasClass","dragStart","window","numDrags","picker","show","hide","dragItemOptions","toNameWithIndex","name","selector","selectedvalue","val","remove","value","hasOwnProperty","optionnode","isItemUsed","filter","selectNode","info","prepare","start","x","y","dragMove","dragEnd","backgroundImage","backgroundPosition","data","dropPosition","min","setFormValue","indexes","indexString","getEl","elements","el","type","checked","draftItemIdsToName","nameToParentNode","index","filepicker","parentNode","fileAnchor","get","innerHTML","draftitemid"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/*\n * JavaScript to allow dragging options to slots (using mouse down or touch) or tab through slots using keyboard.\n *\n * @module     qtype_ddimageortext/form\n * @package    qtype_ddimageortext\n * @copyright  2018 The Open University\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/dragdrop'], function($, dragDrop) {\n\n    \"use strict\";\n\n    /**\n     * Singleton object to handle progressive enhancement of the\n     * drag-drop onto image question editing form.\n     * @type {Object}\n     */\n    var dragDropToImageForm = {\n        /**\n         * @var {Object} with properties width and height.\n         */\n        maxBgImageSize: null,\n\n        /**\n         * @var {Object} with properties width and height.\n         */\n        maxDragImageSize: null,\n\n        /**\n         * @var {object} for interacting with the file pickers.\n         */\n        fp: null, // Object containing functions associated with the file picker.\n\n        /**\n         * Initialise the form javascript features.\n         *\n         * @param {Object} maxBgImageSize object with two properties: width and height.\n         * @param {Object} maxDragImageSize object with two properties: width and height.\n         */\n        init: function(maxBgImageSize, maxDragImageSize) {\n            dragDropToImageForm.maxBgImageSize = maxBgImageSize;\n            dragDropToImageForm.maxDragImageSize = maxDragImageSize;\n            dragDropToImageForm.fp = dragDropToImageForm.filePickers();\n\n            $('#id_previewareaheader').append(\n                '<div class=\"ddarea que ddimageortext\">' +\n                '  <div class=\"droparea\">' +\n                '    <img class=\"dropbackground\" />' +\n                '    <div class=\"dropzones\"></div>' +\n                '  </div>' +\n                '  <div class=\"dragitems\"></div>' +\n                '</div>');\n\n            dragDropToImageForm.updateVisibilityOfFilePickers();\n            dragDropToImageForm.setOptionsForDragItemSelectors();\n            dragDropToImageForm.setupEventHandlers();\n            dragDropToImageForm.waitForFilePickerToInitialise();\n        },\n\n        /**\n         * Waits for the file-pickers to be sufficiently ready before initialising the preview.\n         */\n        waitForFilePickerToInitialise: function() {\n            if (dragDropToImageForm.fp.file('bgimage').href === null) {\n                // It would be better to use an onload or onchange event rather than this timeout.\n                // Unfortunately attempts to do this early are overwritten by filepicker during its loading.\n                setTimeout(dragDropToImageForm.waitForFilePickerToInitialise, 1000);\n                return;\n            }\n            M.util.js_pending('dragDropToImageForm');\n\n            // From now on, when a new file gets loaded into the filepicker, update the preview.\n            // This is not in the setupEventHandlers section as it needs to be delayed until\n            // after filepicker's javascript has finished.\n            $('form.mform').on('change', '.filepickerhidden', function() {\n                M.util.js_pending('dragDropToImageForm');\n                dragDropToImageForm.loadPreviewImage();\n            });\n\n            dragDropToImageForm.loadPreviewImage();\n        },\n\n        /**\n         * Loads the preview background image.\n         */\n        loadPreviewImage: function() {\n            $('fieldset#id_previewareaheader .dropbackground')\n                .one('load', dragDropToImageForm.afterPreviewImageLoaded)\n                .attr('src', dragDropToImageForm.fp.file('bgimage').href);\n        },\n\n        /**\n         * After the background image is loaded, continue setting up the preview.\n         */\n        afterPreviewImageLoaded: function() {\n            var bgImg = $('fieldset#id_previewareaheader .dropbackground');\n            dragDropToImageForm.constrainImageSize(bgImg, dragDropToImageForm.maxBgImageSize);\n            dragDropToImageForm.createDropZones();\n            M.util.js_complete('dragDropToImageForm');\n        },\n\n        /**\n         * Limits an image display size to the given maximums.\n         *\n         * @param {jQuery} img the image.\n         * @param {Object} maxSize with width and height properties.\n         */\n        constrainImageSize: function(img, maxSize) {\n            var reduceby = Math.max(img.width() / maxSize.width,\n                img.height() / maxSize.height);\n            if (reduceby > 1) {\n                img.css('width', Math.floor(img.width() / reduceby));\n            }\n            img.addClass('constrained');\n        },\n\n        /**\n         * Create, or recreate all the drop zones.\n         */\n        createDropZones: function() {\n            var dropZoneHolder = $('.dropzones');\n            dropZoneHolder.empty();\n\n            var bgimageurl = dragDropToImageForm.fp.file('bgimage').href;\n            if (bgimageurl === null) {\n                return; // There is not currently a valid preview to update.\n            }\n\n            var numDrops = dragDropToImageForm.form.getFormValue('nodropzone', []);\n            for (var dropNo = 0; dropNo < numDrops; dropNo++) {\n                var dragNo = dragDropToImageForm.form.getFormValue('drops', [dropNo, 'choice']);\n                if (dragNo === '0') {\n                    continue;\n                }\n                dragNo = dragNo - 1;\n                var group = dragDropToImageForm.form.getFormValue('drags', [dragNo, 'draggroup']),\n                    label = dragDropToImageForm.form.getFormValue('draglabel', [dragNo]);\n                if ('image' === dragDropToImageForm.form.getFormValue('drags', [dragNo, 'dragitemtype'])) {\n                    var imgUrl = dragDropToImageForm.fp.file('dragitem[' + dragNo + ']').href;\n                    if (imgUrl === null) {\n                        continue;\n                    }\n                    // Althoug these are previews of drops, we also add the class name 'drag',\n                    dropZoneHolder.append('<img class=\"droppreview group' + group + ' drop' + dropNo +\n                            '\" src=\"' + imgUrl + '\" alt=\"' + label + '\" data-drop-no=\"' + dropNo + '\">');\n\n                } else if (label !== '') {\n                    dropZoneHolder.append('<div class=\"droppreview group' + group + ' drop' + dropNo +\n                        '\"  data-drop-no=\"' + dropNo + '\">' + label + '</div>');\n                }\n            }\n\n            dragDropToImageForm.waitForAllDropImagesToBeLoaded();\n        },\n\n        /**\n         * This polls until all the drop-zone images have loaded, and then calls updateDropZones().\n         */\n        waitForAllDropImagesToBeLoaded: function() {\n            var notYetLoadedImages = $('.dropzones img').not(function(i, imgNode) {\n                return dragDropToImageForm.imageIsLoaded(imgNode);\n            });\n\n            if (notYetLoadedImages.length > 0) {\n                setTimeout(function() {\n                    dragDropToImageForm.waitForAllDropImagesToBeLoaded();\n                }, 100);\n                return;\n            }\n\n            dragDropToImageForm.updateDropZones();\n        },\n\n        /**\n         * Check if an image has loaded without errors.\n         *\n         * @param {HTMLImageElement} imgElement an image.\n         * @returns {boolean} true if this image has loaded without errors.\n         */\n        imageIsLoaded: function(imgElement) {\n            return imgElement.complete && imgElement.naturalHeight !== 0;\n        },\n\n        /**\n         * Set the size and position of all the drop zones.\n         */\n        updateDropZones: function() {\n            var bgimageurl = dragDropToImageForm.fp.file('bgimage').href;\n            if (bgimageurl === null) {\n                return; // There is not currently a valid preview to update.\n            }\n\n            var dropBackgroundPosition = $('fieldset#id_previewareaheader .dropbackground').offset(),\n                numDrops = dragDropToImageForm.form.getFormValue('nodropzone', []);\n\n            // Move each drop to the right position and update the text.\n            for (var dropNo = 0; dropNo < numDrops; dropNo++) {\n                var drop = $('.dropzones .drop' + dropNo);\n                if (drop.length === 0) {\n                    continue;\n                }\n                var dragNo = dragDropToImageForm.form.getFormValue('drops', [dropNo, 'choice']) - 1;\n\n                drop.offset({\n                    left: dropBackgroundPosition.left +\n                            parseInt(dragDropToImageForm.form.getFormValue('drops', [dropNo, 'xleft'])),\n                    top: dropBackgroundPosition.top +\n                            parseInt(dragDropToImageForm.form.getFormValue('drops', [dropNo, 'ytop']))\n                });\n\n                var label = dragDropToImageForm.form.getFormValue('draglabel', [dragNo]);\n                if (drop.is('img')) {\n                    drop.attr('alt', label);\n                } else {\n                    drop.html(label);\n                }\n            }\n\n            // Resize them to the same size.\n            $('.dropzones .droppreview').css('padding', '0');\n            var numGroups = $('select.draggroup').first().find('option').length;\n            for (var group = 1; group <= numGroups; group++) {\n                dragDropToImageForm.resizeAllDragsAndDropsInGroup(group);\n            }\n        },\n\n        /**\n         * In a given group, set all the drags and drops to be the same size.\n         *\n         * @param {int} group the group number.\n         */\n        resizeAllDragsAndDropsInGroup: function(group) {\n            var drops = $('.dropzones .droppreview.group' + group),\n                maxWidth = 0,\n                maxHeight = 0;\n\n            // Find the maximum size of any drag in this groups.\n            drops.each(function(i, drop) {\n                maxWidth = Math.max(maxWidth, Math.ceil(drop.offsetWidth));\n                maxHeight = Math.max(maxHeight, Math.ceil(drop.offsetHeight));\n            });\n\n            // The size we will want to set is a bit bigger than this.\n            maxWidth += 10;\n            maxHeight += 10;\n\n            // Set each drag home to that size.\n            drops.each(function(i, drop) {\n                var left = Math.round((maxWidth - drop.offsetWidth) / 2),\n                    top = Math.floor((maxHeight - drop.offsetHeight) / 2);\n                // Set top and left padding so the item is centred.\n                $(drop).css({\n                    'padding-left': left + 'px',\n                    'padding-right': (maxWidth - drop.offsetWidth - left) + 'px',\n                    'padding-top': top + 'px',\n                    'padding-bottom': (maxHeight - drop.offsetHeight - top) + 'px'\n                });\n            });\n        },\n\n        /**\n         * Events linked to form actions.\n         */\n        setupEventHandlers: function() {\n            // Changes to settings in the draggable items section.\n            $('fieldset#id_draggableitemheader')\n                .on('change input', 'input, select', function(e) {\n                    var input = $(e.target).closest('select, input');\n                    if (input.hasClass('dragitemtype')) {\n                        dragDropToImageForm.updateVisibilityOfFilePickers();\n                    }\n\n                    dragDropToImageForm.setOptionsForDragItemSelectors();\n\n                    if (input.is('.dragitemtype, .draggroup')) {\n                        dragDropToImageForm.createDropZones();\n                    } else if (input.is('.draglabel')) {\n                        dragDropToImageForm.updateDropZones();\n                    }\n                });\n\n            // Changes to Drop zones section: left, top and drag item.\n            $('fieldset#id_dropzoneheader').on('change input', 'input, select', function(e) {\n                var input = $(e.target).closest('select, input');\n                if (input.is('select')) {\n                    dragDropToImageForm.createDropZones();\n                } else {\n                    dragDropToImageForm.updateDropZones();\n                }\n            });\n\n            // Moving drop zones in the preview.\n            $('fieldset#id_previewareaheader').on('mousedown touchstart', '.droppreview', function(e) {\n                dragDropToImageForm.dragStart(e);\n            });\n\n            $(window).on('resize', function() {\n                dragDropToImageForm.updateDropZones();\n            });\n        },\n\n        /**\n         * Update all the drag item filepickers, so they are only shown for\n         */\n        updateVisibilityOfFilePickers: function() {\n            var numDrags = dragDropToImageForm.form.getFormValue('noitems', []);\n            for (var dragNo = 0; dragNo < numDrags; dragNo++) {\n                var picker = $('input#id_dragitem_' + dragNo).closest('.fitem_ffilepicker');\n                if ('image' === dragDropToImageForm.form.getFormValue('drags', [dragNo, 'dragitemtype'])) {\n                    picker.show();\n                } else {\n                    picker.hide();\n                }\n            }\n        },\n\n\n        setOptionsForDragItemSelectors: function() {\n            var dragItemOptions = {'0': ''},\n                numDrags = dragDropToImageForm.form.getFormValue('noitems', []),\n                numDrops = dragDropToImageForm.form.getFormValue('nodropzone', []);\n\n            // Work out the list of options.\n            for (var dragNo = 0; dragNo < numDrags; dragNo++) {\n                var label = dragDropToImageForm.form.getFormValue('draglabel', [dragNo]);\n                var file = dragDropToImageForm.fp.file(dragDropToImageForm.form.toNameWithIndex('dragitem', [dragNo]));\n                if ('image' === dragDropToImageForm.form.getFormValue('drags', [dragNo, 'dragitemtype']) && file.name !== null) {\n                    dragItemOptions[dragNo + 1] = (dragNo + 1) + '. ' + label + ' (' + file.name + ')';\n                } else if (label !== '') {\n                    dragItemOptions[dragNo + 1] = (dragNo + 1) + '. ' + label;\n                }\n            }\n\n            // Initialise each select.\n            for (var dropNo = 0; dropNo < numDrops; dropNo++) {\n                var selector = $('#id_drops_' + dropNo + '_choice');\n\n                var selectedvalue = selector.val();\n                selector.find('option').remove();\n                for (var value in dragItemOptions) {\n                    if (!dragItemOptions.hasOwnProperty(value)) {\n                        continue;\n                    }\n                    selector.append('<option value=\"' + value + '\">' + dragItemOptions[value] + '</option>');\n                    var optionnode = selector.find('option[value=\"' + value + '\"]');\n                    if (parseInt(value) === parseInt(selectedvalue)) {\n                        optionnode.attr('selected', true);\n                    } else if (dragDropToImageForm.isItemUsed(parseInt(value))) {\n                        optionnode.attr('disabled', true);\n                    }\n                }\n            }\n        },\n\n        /**\n         * Checks if the specified drag option is already used somewhere.\n         *\n         * @param {Number} value of the drag item to check\n         * @return {Boolean} true if item is allocated to dropzone\n         */\n        isItemUsed: function(value) {\n            if (value === 0) {\n                return false; // None option can always be selected.\n            }\n\n            if (dragDropToImageForm.form.getFormValue('drags', [value - 1, 'infinite'])) {\n                return false; // Infinite, so can't be used up.\n            }\n\n            return $('fieldset#id_dropzoneheader select').filter(function(i, selectNode) {\n                return parseInt($(selectNode).val()) === value;\n            }).length !== 0;\n        },\n\n        /**\n         * Handles when a dropzone in dragged in the preview.\n         * @param {Object} e Event object\n         */\n        dragStart: function(e) {\n            var drop = $(e.target).closest('.droppreview');\n\n            var info = dragDrop.prepare(e);\n            if (!info.start) {\n                return;\n            }\n\n            dragDrop.start(e, drop, function(x, y, drop) {\n                dragDropToImageForm.dragMove(drop);\n            }, function() {\n                dragDropToImageForm.dragEnd();\n            });\n        },\n\n        /**\n         * Handles update while a drop is being dragged.\n         *\n         * @param {jQuery} drop the drop preview being moved.\n         */\n        dragMove: function(drop) {\n            var backgroundImage = $('fieldset#id_previewareaheader .dropbackground'),\n                backgroundPosition = backgroundImage.offset(),\n                dropNo = drop.data('dropNo'),\n                dropPosition = drop.offset(),\n                left = Math.round(dropPosition.left - backgroundPosition.left),\n                top = Math.round(dropPosition.top - backgroundPosition.top);\n\n            // Constrain coordinates to be inside the background.\n            // The -10 here matches the +10 in resizeAllDragsAndDropsInGroup().\n            left = Math.max(0, Math.min(left, backgroundImage.width() - drop.width() - 10));\n            top = Math.max(0, Math.min(top, backgroundImage.height() - drop.height() - 10));\n\n            // Update the form.\n            dragDropToImageForm.form.setFormValue('drops', [dropNo, 'xleft'], left);\n            dragDropToImageForm.form.setFormValue('drops', [dropNo, 'ytop'], top);\n        },\n\n        /**\n         * Handles when the drag ends.\n         */\n        dragEnd: function() {\n            // Redraw, in case the position was constrained.\n            dragDropToImageForm.updateDropZones();\n        },\n\n        /**\n         * Low level operations on form.\n         */\n        form: {\n            toNameWithIndex: function(name, indexes) {\n                var indexString = name;\n                for (var i = 0; i < indexes.length; i++) {\n                    indexString = indexString + '[' + indexes[i] + ']';\n                }\n                return indexString;\n            },\n\n            getEl: function(name, indexes) {\n                var form = $('form.mform')[0];\n                return form.elements[this.toNameWithIndex(name, indexes)];\n            },\n\n            /**\n             * Helper to get the value of a form elements with name like \"drops[0][xleft]\".\n             *\n             * @param {String} name the base name, e.g. 'drops'.\n             * @param {String[]} indexes the indexes, e.g. ['0', 'xleft'].\n             * @return {String} the value of that field.\n             */\n            getFormValue: function(name, indexes) {\n                var el = this.getEl(name, indexes);\n                if (!el.type) {\n                    el = el[el.length - 1];\n                }\n                if (el.type === 'checkbox') {\n                    return el.checked;\n                } else {\n                    return el.value;\n                }\n            },\n\n            /**\n             * Helper to get the value of a form elements with name like \"drops[0][xleft]\".\n             *\n             * @param {String} name the base name, e.g. 'drops'.\n             * @param {String[]} indexes the indexes, e.g. ['0', 'xleft'].\n             * @param {String|Number} value the value to set.\n             */\n            setFormValue: function(name, indexes, value) {\n                var el = this.getEl(name, indexes);\n                if (el.type === 'checkbox') {\n                    el.checked = value;\n                } else {\n                    el.value = value;\n                }\n            }\n        },\n\n        /**\n         * Utility to get the file name and url from the filepicker.\n         * @returns {Object} object containing functions {file, name}\n         */\n        filePickers: function() {\n            var draftItemIdsToName;\n            var nameToParentNode;\n\n            if (draftItemIdsToName === undefined) {\n                draftItemIdsToName = {};\n                nameToParentNode = {};\n                var fp = $('form.mform input.filepickerhidden');\n                fp.each(function(index, filepicker) {\n                    draftItemIdsToName[filepicker.value] = filepicker.name;\n                    nameToParentNode[filepicker.name] = filepicker.parentNode;\n                });\n            }\n\n            return {\n                file: function(name) {\n                    var parentNode = $(nameToParentNode[name]);\n                    var fileAnchor = parentNode.find('div.filepicker-filelist a');\n                    if (fileAnchor.length) {\n                        return {href: fileAnchor.get(0).href, name: fileAnchor.get(0).innerHTML};\n                    } else {\n                        return {href: null, name: null};\n                    }\n                },\n\n                name: function(draftitemid) {\n                    return draftItemIdsToName[draftitemid];\n                }\n            };\n        }\n    };\n\n    /**\n     * @alias module:qtype_ddimageortext/form\n     */\n    return {\n        /**\n         * Initialise the form JavaScript features.\n         *\n         * @param {Object} maxBgImageSize object with two properties: width and height.\n         * @param {Object} maxDragImageSize object with two properties: width and height.\n         */\n        init: dragDropToImageForm.init\n    };\n});\n"],"file":"form.min.js"}