From deca8028d95af48c2ae3450ddad449b8a0a47b8f Mon Sep 17 00:00:00 2001 From: Mihail Geshoski Date: Wed, 10 Jun 2020 12:08:13 +0800 Subject: [PATCH] MDL-66601 atto_image: Set the max-height of the image selection dialogue --- .../atto/plugins/image/yui/build/button/js/button.min.js | 2 ++ .../atto/plugins/image/yui/build/button/js/button.min.js.map | 1 + .../moodle-atto_image-button-debug.js | 4 +++- .../moodle-atto_image-button/moodle-atto_image-button-min.js | 4 ++-- .../moodle-atto_image-button/moodle-atto_image-button.js | 4 +++- lib/editor/atto/plugins/image/yui/src/button/js/button.js | 4 +++- 6 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 lib/editor/atto/plugins/image/yui/build/button/js/button.min.js create mode 100644 lib/editor/atto/plugins/image/yui/build/button/js/button.min.js.map diff --git a/lib/editor/atto/plugins/image/yui/build/button/js/button.min.js b/lib/editor/atto/plugins/image/yui/build/button/js/button.min.js new file mode 100644 index 00000000000..997d3ac2242 --- /dev/null +++ b/lib/editor/atto/plugins/image/yui/build/button/js/button.min.js @@ -0,0 +1,2 @@ +var CSS={RESPONSIVE:"img-responsive",INPUTALIGNMENT:"atto_image_alignment",INPUTALT:"atto_image_altentry",INPUTHEIGHT:"atto_image_heightentry",INPUTSUBMIT:"atto_image_urlentrysubmit",INPUTURL:"atto_image_urlentry",INPUTSIZE:"atto_image_size",INPUTWIDTH:"atto_image_widthentry",IMAGEALTWARNING:"atto_image_altwarning",IMAGEBROWSER:"openimagebrowser",IMAGEPRESENTATION:"atto_image_presentation",INPUTCONSTRAIN:"atto_image_constrain",INPUTCUSTOMSTYLE:"atto_image_customstyle",IMAGEPREVIEW:"atto_image_preview",IMAGEPREVIEWBOX:"atto_image_preview_box",ALIGNSETTINGS:"atto_image_button"},SELECTORS={INPUTURL:"."+CSS.INPUTURL},ALIGNMENTS=[{name:"verticalAlign",str:"alignment_top",value:"text-top",margin:"0 0.5em"},{name:"verticalAlign",str:"alignment_middle",value:"middle",margin:"0 0.5em"},{name:"verticalAlign",str:"alignment_bottom",value:"text-bottom",margin:"0 0.5em",isDefault:!0},{name:"float",str:"alignment_left",value:"left",margin:"0 0.5em 0 0"},{name:"float",str:"alignment_right",value:"right",margin:"0 0 0 0.5em"}],REGEX={ISPERCENT:/\d+%/},COMPONENTNAME="atto_image",TEMPLATE="
{{#if showFilepicker}}
{{else}}
{{/if}}
{{get_string \"presentationoraltrequired\" component}}
x

\"\"
",IMAGETEMPLATE="\"{{alt}}\"";Y.namespace("M.atto_image").Button=Y.Base.create("button",Y.M.editor_atto.EditorPlugin,[],{_currentSelection:null,_selectedImage:null,_form:null,_rawImageDimensions:null,initializer:function initializer(){this.addButton({icon:"e/insert_edit_image",callback:this._displayDialogue,tags:"img",tagMatchRequiresAll:!1});this.editor.delegate("dblclick",this._displayDialogue,"img",this);this.editor.delegate("click",this._handleClick,"img",this);this.editor.on("drop",this._handleDragDrop,this);this.editor.on("dragover",function(a){a.preventDefault()},this);this.editor.on("dragenter",function(a){a.preventDefault()},this)},_handleDragDrop:function _handleDragDrop(a){var b=this,c=this.get("host"),d=Y.Handlebars.compile(IMAGETEMPLATE);c.saveSelection();a=a._event;var f=a.dataTransfer&&a.dataTransfer.files&&a.dataTransfer.files.length;if(f&&/^image\//.test(a.dataTransfer.files[0].type)){var g=c.get("filepickeroptions").image,h=g.savepath===void 0?"/":g.savepath,j=new FormData,k=0,l="",m=new XMLHttpRequest,n="",o=Object.keys(g.repositories);a.preventDefault();a.stopPropagation();j.append("repo_upload_file",a.dataTransfer.files[0]);j.append("itemid",g.itemid);for(var p=0;p");c.setStyle("margin",b.margin);if(a.getStyle("margin")!==c.getStyle("margin")){return!1}Y.log("Legacy alignment found and removed.","info","atto_image-button");a.addClass(this._getAlignmentClass(b.value));a.setStyle(b.name,null);a.setStyle("margin",null);return!0},this);return a},_getAlignmentClass:function _getAlignmentClass(a){return CSS.ALIGNSETTINGS+"_"+a},_updateWarning:function _updateWarning(){var a=this._form,b=!0,c=a.one("."+CSS.INPUTALT).get("value"),d=a.one("."+CSS.IMAGEPRESENTATION).get("checked");if(""===c&&!d){a.one("."+CSS.IMAGEALTWARNING).setStyle("display","block");a.one("."+CSS.INPUTALT).setAttribute("aria-invalid",!0);a.one("."+CSS.IMAGEPRESENTATION).setAttribute("aria-invalid",!0);b=!0}else{a.one("."+CSS.IMAGEALTWARNING).setStyle("display","none");a.one("."+CSS.INPUTALT).setAttribute("aria-invalid",!1);a.one("."+CSS.IMAGEPRESENTATION).setAttribute("aria-invalid",!1);b=!1}this.getDialogue().centerDialogue();return b}}); +//# sourceMappingURL=button.min.js.map diff --git a/lib/editor/atto/plugins/image/yui/build/button/js/button.min.js.map b/lib/editor/atto/plugins/image/yui/build/button/js/button.min.js.map new file mode 100644 index 00000000000..a1628c894ed --- /dev/null +++ b/lib/editor/atto/plugins/image/yui/build/button/js/button.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../../src/button/js/button.js"],"names":["CSS","RESPONSIVE","INPUTALIGNMENT","INPUTALT","INPUTHEIGHT","INPUTSUBMIT","INPUTURL","INPUTSIZE","INPUTWIDTH","IMAGEALTWARNING","IMAGEBROWSER","IMAGEPRESENTATION","INPUTCONSTRAIN","INPUTCUSTOMSTYLE","IMAGEPREVIEW","IMAGEPREVIEWBOX","ALIGNSETTINGS","SELECTORS","ALIGNMENTS","name","str","value","margin","isDefault","REGEX","ISPERCENT","COMPONENTNAME","TEMPLATE","IMAGETEMPLATE","Y","namespace","Button","Base","create","M","editor_atto","EditorPlugin","_currentSelection","_selectedImage","_form","_rawImageDimensions","initializer","addButton","icon","callback","_displayDialogue","tags","tagMatchRequiresAll","editor","delegate","_handleClick","on","_handleDragDrop","e","preventDefault","self","host","get","template","Handlebars","compile","saveSelection","_event","handlesDataTransfer","dataTransfer","files","length","test","type","options","image","savepath","formData","FormData","timestamp","uploadid","xhr","XMLHttpRequest","imagehtml","keys","Object","repositories","stopPropagation","append","itemid","i","id","env","cfg","sesskey","client_id","context","Date","getTime","Math","round","random","focus","restoreSelection","url","util","image_url","alt","get_string","insertContentAtFocusPoint","markUpdated","onreadystatechange","placeholder","one","result","file","newhtml","newimage","readyState","status","JSON","parse","responseText","error","remove","core","ajaxException","event","newfile","presentation","Node","replace","appendChild","use","alert","message","open","wwwroot","send","target","selection","getSelectionFromNode","getSelection","setSelection","dialogue","getDialogue","headerContent","width","focusAfterHide","focusOnShowSelector","setStyle","set","_getDialogueContent","show","_loadPreviewImage","Image","onerror","preview","setStyles","centerDialogue","onload","input","currentwidth","currentheight","widthRatio","heightRatio","height","setAttribute","src","match","parseInt","_autoAdjustSize","canShowFilepicker","content","elementid","component","showFilepicker","alignments","_applyImageProperties","_urlChanged","_updateWarning","_setImage","_filepickerCallback","forceHeight","keyField","keyFieldType","subField","subFieldType","constrainField","keyFieldValue","subFieldValue","imagePreview","rawPercentage","rawSize","_temporaryValue","params","form","properties","_getSelectedImageProperties","img","some","alignment","align","customstyle","images","getSelectedNodes","style","filter","size","_removeLegacyAlignment","item","getAttribute","_getAlignmentPropeties","complete","defaultAlignment","classname","_getAlignmentClass","hasClass","log","constrain","classlist","push","isNaN","join","hide","imageNode","getStyle","normalisedNode","addClass","state"],"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 .\n\n/*\n * @package atto_image\n * @copyright 2013 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * @module moodle-atto_image_alignment-button\n */\n\n/**\n * Atto image selection tool.\n *\n * @namespace M.atto_image\n * @class Button\n * @extends M.editor_atto.EditorPlugin\n */\n\nvar CSS = {\n RESPONSIVE: 'img-responsive',\n INPUTALIGNMENT: 'atto_image_alignment',\n INPUTALT: 'atto_image_altentry',\n INPUTHEIGHT: 'atto_image_heightentry',\n INPUTSUBMIT: 'atto_image_urlentrysubmit',\n INPUTURL: 'atto_image_urlentry',\n INPUTSIZE: 'atto_image_size',\n INPUTWIDTH: 'atto_image_widthentry',\n IMAGEALTWARNING: 'atto_image_altwarning',\n IMAGEBROWSER: 'openimagebrowser',\n IMAGEPRESENTATION: 'atto_image_presentation',\n INPUTCONSTRAIN: 'atto_image_constrain',\n INPUTCUSTOMSTYLE: 'atto_image_customstyle',\n IMAGEPREVIEW: 'atto_image_preview',\n IMAGEPREVIEWBOX: 'atto_image_preview_box',\n ALIGNSETTINGS: 'atto_image_button'\n },\n SELECTORS = {\n INPUTURL: '.' + CSS.INPUTURL\n },\n ALIGNMENTS = [\n // Vertical alignment.\n {\n name: 'verticalAlign',\n str: 'alignment_top',\n value: 'text-top',\n margin: '0 0.5em'\n }, {\n name: 'verticalAlign',\n str: 'alignment_middle',\n value: 'middle',\n margin: '0 0.5em'\n }, {\n name: 'verticalAlign',\n str: 'alignment_bottom',\n value: 'text-bottom',\n margin: '0 0.5em',\n isDefault: true\n },\n\n // Floats.\n {\n name: 'float',\n str: 'alignment_left',\n value: 'left',\n margin: '0 0.5em 0 0'\n }, {\n name: 'float',\n str: 'alignment_right',\n value: 'right',\n margin: '0 0 0 0.5em'\n }\n ],\n\n REGEX = {\n ISPERCENT: /\\d+%/\n },\n\n COMPONENTNAME = 'atto_image',\n\n TEMPLATE = '' +\n '
' +\n\n // Add the repository browser button.\n '{{#if showFilepicker}}' +\n '
' +\n '' +\n '
' +\n '' +\n '' +\n '' +\n '' +\n '
' +\n '
' +\n '{{else}}' +\n '
' +\n '' +\n '' +\n '
' +\n '{{/if}}' +\n\n // Add the Alt box.\n '
' +\n '{{get_string \"presentationoraltrequired\" component}}' +\n '
' +\n '
' +\n '' +\n '' +\n\n // Add the presentation select box.\n '
' +\n '' +\n '' +\n '
' +\n '
' +\n\n // Add the size entry boxes.\n '
' +\n '' +\n '
' +\n '' +\n ' x' +\n\n // Add the height entry box.\n '' +\n '' +\n\n // Add the constrain checkbox.\n '
' +\n '' +\n '' +\n '
' +\n '
' +\n '
' +\n\n // Add the alignment selector.\n '
' +\n '' +\n '' +\n '
' +\n // Hidden input to store custom styles.\n '' +\n '
' +\n\n // Add the image preview.\n '
' +\n '
' +\n '\"\"' +\n '
' +\n\n // Add the submit button and close the form.\n '' +\n '
' +\n '
',\n\n IMAGETEMPLATE = '' +\n '\"{{alt}}\"';\n\nY.namespace('M.atto_image').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], {\n /**\n * A reference to the current selection at the time that the dialogue\n * was opened.\n *\n * @property _currentSelection\n * @type Range\n * @private\n */\n _currentSelection: null,\n\n /**\n * The most recently selected image.\n *\n * @param _selectedImage\n * @type Node\n * @private\n */\n _selectedImage: null,\n\n /**\n * A reference to the currently open form.\n *\n * @param _form\n * @type Node\n * @private\n */\n _form: null,\n\n /**\n * The dimensions of the raw image before we manipulate it.\n *\n * @param _rawImageDimensions\n * @type Object\n * @private\n */\n _rawImageDimensions: null,\n\n initializer: function() {\n\n this.addButton({\n icon: 'e/insert_edit_image',\n callback: this._displayDialogue,\n tags: 'img',\n tagMatchRequiresAll: false\n });\n this.editor.delegate('dblclick', this._displayDialogue, 'img', this);\n this.editor.delegate('click', this._handleClick, 'img', this);\n this.editor.on('drop', this._handleDragDrop, this);\n\n // e.preventDefault needed to stop the default event from clobbering the desired behaviour in some browsers.\n this.editor.on('dragover', function(e) {\n e.preventDefault();\n }, this);\n this.editor.on('dragenter', function(e) {\n e.preventDefault();\n }, this);\n },\n\n /**\n * Handle a drag and drop event with an image.\n *\n * @method _handleDragDrop\n * @param {EventFacade} e\n * @return mixed\n * @private\n */\n _handleDragDrop: function(e) {\n\n var self = this,\n host = this.get('host'),\n template = Y.Handlebars.compile(IMAGETEMPLATE);\n\n host.saveSelection();\n e = e._event;\n\n // Only handle the event if an image file was dropped in.\n var handlesDataTransfer = (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length);\n if (handlesDataTransfer && /^image\\//.test(e.dataTransfer.files[0].type)) {\n\n var options = host.get('filepickeroptions').image,\n savepath = (options.savepath === undefined) ? '/' : options.savepath,\n formData = new FormData(),\n timestamp = 0,\n uploadid = \"\",\n xhr = new XMLHttpRequest(),\n imagehtml = \"\",\n keys = Object.keys(options.repositories);\n\n e.preventDefault();\n e.stopPropagation();\n formData.append('repo_upload_file', e.dataTransfer.files[0]);\n formData.append('itemid', options.itemid);\n\n // List of repositories is an object rather than an array. This makes iteration more awkward.\n for (var i = 0; i < keys.length; i++) {\n if (options.repositories[keys[i]].type === 'upload') {\n formData.append('repo_id', options.repositories[keys[i]].id);\n break;\n }\n }\n formData.append('env', options.env);\n formData.append('sesskey', M.cfg.sesskey);\n formData.append('client_id', options.client_id);\n formData.append('savepath', savepath);\n formData.append('ctx_id', options.context.id);\n\n // Insert spinner as a placeholder.\n timestamp = new Date().getTime();\n uploadid = 'moodleimage_' + Math.round(Math.random() * 100000) + '-' + timestamp;\n host.focus();\n host.restoreSelection();\n imagehtml = template({\n url: M.util.image_url(\"i/loading_small\", 'moodle'),\n alt: M.util.get_string('uploading', COMPONENTNAME),\n id: uploadid\n });\n host.insertContentAtFocusPoint(imagehtml);\n self.markUpdated();\n\n // Kick off a XMLHttpRequest.\n xhr.onreadystatechange = function() {\n var placeholder = self.editor.one('#' + uploadid),\n result,\n file,\n newhtml,\n newimage;\n\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n result = JSON.parse(xhr.responseText);\n if (result) {\n if (result.error) {\n if (placeholder) {\n placeholder.remove(true);\n }\n return new M.core.ajaxException(result);\n }\n\n file = result;\n if (result.event && result.event === 'fileexists') {\n // A file with this name is already in use here - rename to avoid conflict.\n // Chances are, it's a different image (stored in a different folder on the user's computer).\n // If the user wants to reuse an existing image, they can copy/paste it within the editor.\n file = result.newfile;\n }\n\n // Replace placeholder with actual image.\n newhtml = template({\n url: file.url,\n presentation: true\n });\n newimage = Y.Node.create(newhtml);\n if (placeholder) {\n placeholder.replace(newimage);\n } else {\n self.editor.appendChild(newimage);\n }\n self.markUpdated();\n }\n } else {\n Y.use('moodle-core-notification-alert', function() {\n new M.core.alert({message: M.util.get_string('servererror', 'moodle')});\n });\n if (placeholder) {\n placeholder.remove(true);\n }\n }\n }\n };\n xhr.open(\"POST\", M.cfg.wwwroot + '/repository/repository_ajax.php?action=upload', true);\n xhr.send(formData);\n return false;\n }\n\n},\n\n /**\n * Handle a click on an image.\n *\n * @method _handleClick\n * @param {EventFacade} e\n * @private\n */\n _handleClick: function(e) {\n var image = e.target;\n\n var selection = this.get('host').getSelectionFromNode(image);\n if (this.get('host').getSelection() !== selection) {\n this.get('host').setSelection(selection);\n }\n },\n\n /**\n * Display the image editing tool.\n *\n * @method _displayDialogue\n * @private\n */\n _displayDialogue: function() {\n // Store the current selection.\n this._currentSelection = this.get('host').getSelection();\n if (this._currentSelection === false) {\n return;\n }\n\n // Reset the image dimensions.\n this._rawImageDimensions = null;\n\n var dialogue = this.getDialogue({\n headerContent: M.util.get_string('imageproperties', COMPONENTNAME),\n width: 'auto',\n focusAfterHide: true,\n focusOnShowSelector: SELECTORS.INPUTURL\n });\n // Set a maximum width for the dialog. This will prevent the dialog width to extend beyond the screen width\n // in cases when the uploaded image has larger width.\n dialogue.get('boundingBox').setStyle('maxWidth', '90%');\n // Set the dialogue content, and then show the dialogue.\n dialogue.set('bodyContent', this._getDialogueContent())\n .show();\n },\n\n /**\n * Set the inputs for width and height if they are not set, and calculate\n * if the constrain checkbox should be checked or not.\n *\n * @method _loadPreviewImage\n * @param {String} url\n * @private\n */\n _loadPreviewImage: function(url) {\n var image = new Image();\n var self = this;\n\n image.onerror = function() {\n var preview = self._form.one('.' + CSS.IMAGEPREVIEW);\n preview.setStyles({\n 'display': 'none'\n });\n\n // Centre the dialogue when clearing the image preview.\n self.getDialogue().centerDialogue();\n };\n\n image.onload = function() {\n var input, currentwidth, currentheight, widthRatio, heightRatio;\n\n self._rawImageDimensions = {\n width: this.width,\n height: this.height\n };\n\n input = self._form.one('.' + CSS.INPUTWIDTH);\n currentwidth = input.get('value');\n if (currentwidth === '') {\n input.set('value', this.width);\n currentwidth = \"\" + this.width;\n }\n input = self._form.one('.' + CSS.INPUTHEIGHT);\n currentheight = input.get('value');\n if (currentheight === '') {\n input.set('value', this.height);\n currentheight = \"\" + this.height;\n }\n input = self._form.one('.' + CSS.IMAGEPREVIEW);\n input.setAttribute('src', this.src);\n input.setStyles({\n 'display': 'inline'\n });\n\n input = self._form.one('.' + CSS.INPUTCONSTRAIN);\n if (currentwidth.match(REGEX.ISPERCENT) && currentheight.match(REGEX.ISPERCENT)) {\n input.set('checked', currentwidth === currentheight);\n } else {\n if (this.width === 0) {\n this.width = 1;\n }\n if (this.height === 0) {\n this.height = 1;\n }\n // This is the same as comparing to 3 decimal places.\n widthRatio = Math.round(1000 * parseInt(currentwidth, 10) / this.width);\n heightRatio = Math.round(1000 * parseInt(currentheight, 10) / this.height);\n input.set('checked', widthRatio === heightRatio);\n }\n\n // Apply the image sizing.\n self._autoAdjustSize(self);\n\n // Centre the dialogue once the preview image has loaded.\n self.getDialogue().centerDialogue();\n };\n\n image.src = url;\n },\n\n /**\n * Return the dialogue content for the tool, attaching any required\n * events.\n *\n * @method _getDialogueContent\n * @return {Node} The content to place in the dialogue.\n * @private\n */\n _getDialogueContent: function() {\n var template = Y.Handlebars.compile(TEMPLATE),\n canShowFilepicker = this.get('host').canShowFilepicker('image'),\n content = Y.Node.create(template({\n elementid: this.get('host').get('elementid'),\n CSS: CSS,\n component: COMPONENTNAME,\n showFilepicker: canShowFilepicker,\n alignments: ALIGNMENTS\n }));\n\n this._form = content;\n\n // Configure the view of the current image.\n this._applyImageProperties(this._form);\n\n this._form.one('.' + CSS.INPUTURL).on('blur', this._urlChanged, this);\n this._form.one('.' + CSS.IMAGEPRESENTATION).on('change', this._updateWarning, this);\n this._form.one('.' + CSS.INPUTALT).on('change', this._updateWarning, this);\n this._form.one('.' + CSS.INPUTWIDTH).on('blur', this._autoAdjustSize, this);\n this._form.one('.' + CSS.INPUTHEIGHT).on('blur', this._autoAdjustSize, this, true);\n this._form.one('.' + CSS.INPUTCONSTRAIN).on('change', function(event) {\n if (event.target.get('checked')) {\n this._autoAdjustSize(event);\n }\n }, this);\n this._form.one('.' + CSS.INPUTURL).on('blur', this._urlChanged, this);\n this._form.one('.' + CSS.INPUTSUBMIT).on('click', this._setImage, this);\n\n if (canShowFilepicker) {\n this._form.one('.' + CSS.IMAGEBROWSER).on('click', function() {\n this.get('host').showFilepicker('image', this._filepickerCallback, this);\n }, this);\n }\n\n return content;\n },\n\n _autoAdjustSize: function(e, forceHeight) {\n forceHeight = forceHeight || false;\n\n var keyField = this._form.one('.' + CSS.INPUTWIDTH),\n keyFieldType = 'width',\n subField = this._form.one('.' + CSS.INPUTHEIGHT),\n subFieldType = 'height',\n constrainField = this._form.one('.' + CSS.INPUTCONSTRAIN),\n keyFieldValue = keyField.get('value'),\n subFieldValue = subField.get('value'),\n imagePreview = this._form.one('.' + CSS.IMAGEPREVIEW),\n rawPercentage,\n rawSize;\n\n // If we do not know the image size, do not do anything.\n if (!this._rawImageDimensions) {\n return;\n }\n\n // Set the width back to default if it is empty.\n if (keyFieldValue === '') {\n keyFieldValue = this._rawImageDimensions[keyFieldType];\n keyField.set('value', keyFieldValue);\n keyFieldValue = keyField.get('value');\n }\n\n // Clear the existing preview sizes.\n imagePreview.setStyles({\n width: null,\n height: null\n });\n\n // Now update with the new values.\n if (!constrainField.get('checked')) {\n // We are not keeping the image proportion - update the preview accordingly.\n\n // Width.\n if (keyFieldValue.match(REGEX.ISPERCENT)) {\n rawPercentage = parseInt(keyFieldValue, 10);\n rawSize = this._rawImageDimensions.width / 100 * rawPercentage;\n imagePreview.setStyle('width', rawSize + 'px');\n } else {\n imagePreview.setStyle('width', keyFieldValue + 'px');\n }\n\n // Height.\n if (subFieldValue.match(REGEX.ISPERCENT)) {\n rawPercentage = parseInt(subFieldValue, 10);\n rawSize = this._rawImageDimensions.height / 100 * rawPercentage;\n imagePreview.setStyle('height', rawSize + 'px');\n } else {\n imagePreview.setStyle('height', subFieldValue + 'px');\n }\n } else {\n // We are keeping the image in proportion.\n if (forceHeight) {\n // By default we update based on width. Swap the key and sub fields around to achieve a height-based scale.\n var _temporaryValue;\n _temporaryValue = keyField;\n keyField = subField;\n subField = _temporaryValue;\n\n _temporaryValue = keyFieldType;\n keyFieldType = subFieldType;\n subFieldType = _temporaryValue;\n\n _temporaryValue = keyFieldValue;\n keyFieldValue = subFieldValue;\n subFieldValue = _temporaryValue;\n }\n\n if (keyFieldValue.match(REGEX.ISPERCENT)) {\n // This is a percentage based change. Copy it verbatim.\n subFieldValue = keyFieldValue;\n\n // Set the width to the calculated pixel width.\n rawPercentage = parseInt(keyFieldValue, 10);\n rawSize = this._rawImageDimensions.width / 100 * rawPercentage;\n\n // And apply the width/height to the container.\n imagePreview.setStyle('width', rawSize);\n rawSize = this._rawImageDimensions.height / 100 * rawPercentage;\n imagePreview.setStyle('height', rawSize);\n } else {\n // Calculate the scaled subFieldValue from the keyFieldValue.\n subFieldValue = Math.round((keyFieldValue / this._rawImageDimensions[keyFieldType]) *\n this._rawImageDimensions[subFieldType]);\n\n if (forceHeight) {\n imagePreview.setStyles({\n 'width': subFieldValue,\n 'height': keyFieldValue\n });\n } else {\n imagePreview.setStyles({\n 'width': keyFieldValue,\n 'height': subFieldValue\n });\n }\n }\n\n // Update the subField's value within the form to reflect the changes.\n subField.set('value', subFieldValue);\n }\n },\n\n /**\n * Update the dialogue after an image was selected in the File Picker.\n *\n * @method _filepickerCallback\n * @param {object} params The parameters provided by the filepicker\n * containing information about the image.\n * @private\n */\n _filepickerCallback: function(params) {\n if (params.url !== '') {\n var input = this._form.one('.' + CSS.INPUTURL);\n input.set('value', params.url);\n\n // Auto set the width and height.\n this._form.one('.' + CSS.INPUTWIDTH).set('value', '');\n this._form.one('.' + CSS.INPUTHEIGHT).set('value', '');\n\n // Load the preview image.\n this._loadPreviewImage(params.url);\n }\n },\n\n /**\n * Applies properties of an existing image to the image dialogue for editing.\n *\n * @method _applyImageProperties\n * @param {Node} form\n * @private\n */\n _applyImageProperties: function(form) {\n var properties = this._getSelectedImageProperties(),\n img = form.one('.' + CSS.IMAGEPREVIEW);\n\n if (properties === false) {\n img.setStyle('display', 'none');\n // Set the default alignment.\n ALIGNMENTS.some(function(alignment) {\n if (alignment.isDefault) {\n form.one('.' + CSS.INPUTALIGNMENT).set('value', alignment.value);\n return true;\n }\n\n return false;\n }, this);\n\n return;\n }\n\n if (properties.align) {\n form.one('.' + CSS.INPUTALIGNMENT).set('value', properties.align);\n }\n if (properties.customstyle) {\n form.one('.' + CSS.INPUTCUSTOMSTYLE).set('value', properties.customstyle);\n }\n if (properties.width) {\n form.one('.' + CSS.INPUTWIDTH).set('value', properties.width);\n }\n if (properties.height) {\n form.one('.' + CSS.INPUTHEIGHT).set('value', properties.height);\n }\n if (properties.alt) {\n form.one('.' + CSS.INPUTALT).set('value', properties.alt);\n }\n if (properties.src) {\n form.one('.' + CSS.INPUTURL).set('value', properties.src);\n this._loadPreviewImage(properties.src);\n }\n if (properties.presentation) {\n form.one('.' + CSS.IMAGEPRESENTATION).set('checked', 'checked');\n }\n\n // Update the image preview based on the form properties.\n this._autoAdjustSize();\n },\n\n /**\n * Gets the properties of the currently selected image.\n *\n * The first image only if multiple images are selected.\n *\n * @method _getSelectedImageProperties\n * @return {object}\n * @private\n */\n _getSelectedImageProperties: function() {\n var properties = {\n src: null,\n alt: null,\n width: null,\n height: null,\n align: '',\n presentation: false\n },\n\n // Get the current selection.\n images = this.get('host').getSelectedNodes(),\n width,\n height,\n style,\n image;\n\n if (images) {\n images = images.filter('img');\n }\n\n if (images && images.size()) {\n image = this._removeLegacyAlignment(images.item(0));\n this._selectedImage = image;\n\n style = image.getAttribute('style');\n properties.customstyle = style;\n\n width = image.getAttribute('width');\n if (!width.match(REGEX.ISPERCENT)) {\n width = parseInt(width, 10);\n }\n height = image.getAttribute('height');\n if (!height.match(REGEX.ISPERCENT)) {\n height = parseInt(height, 10);\n }\n\n if (width !== 0) {\n properties.width = width;\n }\n if (height !== 0) {\n properties.height = height;\n }\n this._getAlignmentPropeties(image, properties);\n properties.src = image.getAttribute('src');\n properties.alt = image.getAttribute('alt') || '';\n properties.presentation = (image.get('role') === 'presentation');\n return properties;\n }\n\n // No image selected - clean up.\n this._selectedImage = null;\n return false;\n },\n\n /**\n * Sets the alignment of a properties object.\n *\n * @method _getAlignmentPropeties\n * @param {Node} image The image that the alignment properties should be found for\n * @param {Object} properties The properties object that is created in _getSelectedImageProperties()\n * @private\n */\n _getAlignmentPropeties: function(image, properties) {\n var complete = false,\n defaultAlignment;\n\n // Check for an alignment value.\n complete = ALIGNMENTS.some(function(alignment) {\n var classname = this._getAlignmentClass(alignment.value);\n if (image.hasClass(classname)) {\n properties.align = alignment.value;\n Y.log('Found alignment ' + alignment.value, 'debug', 'atto_image-button');\n\n return true;\n }\n\n if (alignment.isDefault) {\n defaultAlignment = alignment.value;\n }\n\n return false;\n }, this);\n\n if (!complete && defaultAlignment) {\n properties.align = defaultAlignment;\n }\n },\n\n /**\n * Update the form when the URL was changed. This includes updating the\n * height, width, and image preview.\n *\n * @method _urlChanged\n * @private\n */\n _urlChanged: function() {\n var input = this._form.one('.' + CSS.INPUTURL);\n\n if (input.get('value') !== '') {\n // Load the preview image.\n this._loadPreviewImage(input.get('value'));\n }\n },\n\n /**\n * Update the image in the contenteditable.\n *\n * @method _setImage\n * @param {EventFacade} e\n * @private\n */\n _setImage: function(e) {\n var form = this._form,\n url = form.one('.' + CSS.INPUTURL).get('value'),\n alt = form.one('.' + CSS.INPUTALT).get('value'),\n width = form.one('.' + CSS.INPUTWIDTH).get('value'),\n height = form.one('.' + CSS.INPUTHEIGHT).get('value'),\n alignment = this._getAlignmentClass(form.one('.' + CSS.INPUTALIGNMENT).get('value')),\n presentation = form.one('.' + CSS.IMAGEPRESENTATION).get('checked'),\n constrain = form.one('.' + CSS.INPUTCONSTRAIN).get('checked'),\n imagehtml,\n customstyle = form.one('.' + CSS.INPUTCUSTOMSTYLE).get('value'),\n classlist = [],\n host = this.get('host');\n\n e.preventDefault();\n\n // Check if there are any accessibility issues.\n if (this._updateWarning()) {\n return;\n }\n\n // Focus on the editor in preparation for inserting the image.\n host.focus();\n if (url !== '') {\n if (this._selectedImage) {\n host.setSelection(host.getSelectionFromNode(this._selectedImage));\n } else {\n host.setSelection(this._currentSelection);\n }\n\n if (constrain) {\n classlist.push(CSS.RESPONSIVE);\n }\n\n // Add the alignment class for the image.\n classlist.push(alignment);\n\n if (!width.match(REGEX.ISPERCENT) && isNaN(parseInt(width, 10))) {\n form.one('.' + CSS.INPUTWIDTH).focus();\n return;\n }\n if (!height.match(REGEX.ISPERCENT) && isNaN(parseInt(height, 10))) {\n form.one('.' + CSS.INPUTHEIGHT).focus();\n return;\n }\n\n var template = Y.Handlebars.compile(IMAGETEMPLATE);\n imagehtml = template({\n url: url,\n alt: alt,\n width: width,\n height: height,\n presentation: presentation,\n customstyle: customstyle,\n classlist: classlist.join(' ')\n });\n\n this.get('host').insertContentAtFocusPoint(imagehtml);\n\n this.markUpdated();\n }\n\n this.getDialogue({\n focusAfterHide: null\n }).hide();\n\n },\n\n /**\n * Removes any legacy styles added by previous versions of the atto image button.\n *\n * @method _removeLegacyAlignment\n * @param {Y.Node} imageNode\n * @return {Y.Node}\n * @private\n */\n _removeLegacyAlignment: function(imageNode) {\n if (!imageNode.getStyle('margin')) {\n // There is no margin therefore this cannot match any known alignments.\n return imageNode;\n }\n\n ALIGNMENTS.some(function(alignment) {\n if (imageNode.getStyle(alignment.name) !== alignment.value) {\n // The name/value do not match. Skip.\n return false;\n }\n\n var normalisedNode = Y.Node.create('
');\n normalisedNode.setStyle('margin', alignment.margin);\n if (imageNode.getStyle('margin') !== normalisedNode.getStyle('margin')) {\n // The margin does not match.\n return false;\n }\n\n Y.log('Legacy alignment found and removed.', 'info', 'atto_image-button');\n imageNode.addClass(this._getAlignmentClass(alignment.value));\n imageNode.setStyle(alignment.name, null);\n imageNode.setStyle('margin', null);\n\n return true;\n }, this);\n\n return imageNode;\n },\n\n _getAlignmentClass: function(alignment) {\n return CSS.ALIGNSETTINGS + '_' + alignment;\n },\n\n /**\n * Update the alt text warning live.\n *\n * @method _updateWarning\n * @return {boolean} whether a warning should be displayed.\n * @private\n */\n _updateWarning: function() {\n var form = this._form,\n state = true,\n alt = form.one('.' + CSS.INPUTALT).get('value'),\n presentation = form.one('.' + CSS.IMAGEPRESENTATION).get('checked');\n if (alt === '' && !presentation) {\n form.one('.' + CSS.IMAGEALTWARNING).setStyle('display', 'block');\n form.one('.' + CSS.INPUTALT).setAttribute('aria-invalid', true);\n form.one('.' + CSS.IMAGEPRESENTATION).setAttribute('aria-invalid', true);\n state = true;\n } else {\n form.one('.' + CSS.IMAGEALTWARNING).setStyle('display', 'none');\n form.one('.' + CSS.INPUTALT).setAttribute('aria-invalid', false);\n form.one('.' + CSS.IMAGEPRESENTATION).setAttribute('aria-invalid', false);\n state = false;\n }\n this.getDialogue().centerDialogue();\n return state;\n }\n});\n"],"file":"button.min.js"} \ No newline at end of file diff --git a/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-debug.js b/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-debug.js index 6e9752ffc49..e2d53f967b1 100644 --- a/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-debug.js +++ b/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-debug.js @@ -410,7 +410,9 @@ Y.namespace('M.atto_image').Button = Y.Base.create('button', Y.M.editor_atto.Edi focusAfterHide: true, focusOnShowSelector: SELECTORS.INPUTURL }); - + // Set a maximum width for the dialog. This will prevent the dialog width to extend beyond the screen width + // in cases when the uploaded image has larger width. + dialogue.get('boundingBox').setStyle('maxWidth', '90%'); // Set the dialogue content, and then show the dialogue. dialogue.set('bodyContent', this._getDialogueContent()) .show(); diff --git a/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-min.js b/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-min.js index 94511b8d106..1a22f164060 100644 --- a/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-min.js +++ b/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button-min.js @@ -1,3 +1,3 @@ YUI.add("moodle-atto_image-button",function(e,t){var n={RESPONSIVE:"img-responsive",INPUTALIGNMENT:"atto_image_alignment",INPUTALT:"atto_image_altentry",INPUTHEIGHT:"atto_image_heightentry",INPUTSUBMIT:"atto_image_urlentrysubmit",INPUTURL:"atto_image_urlentry",INPUTSIZE:"atto_image_size",INPUTWIDTH:"atto_image_widthentry",IMAGEALTWARNING:"atto_image_altwarning",IMAGEBROWSER:"openimagebrowser",IMAGEPRESENTATION:"atto_image_presentation",INPUTCONSTRAIN:"atto_image_constrain",INPUTCUSTOMSTYLE:"atto_image_customstyle",IMAGEPREVIEW:"atto_image_preview",IMAGEPREVIEWBOX:"atto_image_preview_box",ALIGNSETTINGS:"atto_image_button"},r={INPUTURL:"."+n.INPUTURL},i=[{name:"verticalAlign",str:"alignment_top",value:"text-top",margin:"0 0.5em"},{name:"verticalAlign",str:"alignment_middle",value:"middle",margin:"0 0.5em"},{name:"verticalAlign",str:"alignment_bottom",value:"text-bottom",margin:"0 0.5em",isDefault:!0},{name:"float",str:"alignment_left",value:"left",margin:"0 0.5em 0 0"},{name:"float",str:"alignment_right",value:"right",margin:"0 0 0 0.5em"}],s={ISPERCENT:/\d+%/},o="atto_image",u='
{{#if showFilepicker}}
{{else}}
{{/if}}
x

',a='{{alt}}';e.namespace("M.atto_image").Button=e.Base.create("button",e.M.editor_atto.EditorPlugin,[],{_currentSelection:null,_selectedImage:null,_form:null,_rawImageDimensions:null,initializer:function(){this.addButton({icon:"e/insert_edit_image",callback:this._displayDialogue,tags:"img",tagMatchRequiresAll:!1}),this.editor.delegate("dblclick",this._displayDialogue,"img",this),this.editor.delegate("click",this._handleClick,"img",this),this.editor.on("drop",this._handleDragDrop,this),this.editor.on("dragover",function(e){e.preventDefault()},this),this.editor.on("dragenter",function(e){e.preventDefault()},this)},_handleDragDrop:function(t){var n=this,r=this.get("host"),i=e.Handlebars.compile(a);r.saveSelection(),t=t._event;var s=t.dataTransfer&&t.dataTransfer.files&&t.dataTransfer.files.length;if(s&&/^image\//.test(t.dataTransfer.files[0].type)){var u=r.get("filepickeroptions").image,f=u.savepath===undefined?"/":u.savepath,l=new FormData,c=0,h="",p=new XMLHttpRequest,d="",v=Object.keys(u.repositories);t.preventDefault(),t.stopPropagation(),l.append("repo_upload_file",t.dataTransfer.files[0]),l.append("itemid",u.itemid);for(var m=0;m");return r.setStyle("margin",n.margin),t.getStyle("margin")!==r.getStyle("margin")?!1:(t.addClass(this._getAlignmentClass(n.value)),t.setStyle(n.name,null),t.setStyle("margin",null),!0)},this),t):t},_getAlignmentClass:function(e){return n.ALIGNSETTINGS+"_"+e},_updateWarning:function(){var e=this._form,t=!0,r=e.one("."+n.INPUTALT).get("value"),i=e.one("."+n.IMAGEPRESENTATION).get("checked");return r===""&&!i?(e.one("."+n.IMAGEALTWARNING).setStyle("display","block"),e.one("."+n.INPUTALT).setAttribute("aria-invalid",!0),e.one("."+n.IMAGEPRESENTATION).setAttribute("aria-invalid",!0),t=!0):(e.one("."+n.IMAGEALTWARNING).setStyle("display","none"),e.one("."+n.INPUTALT).setAttribute("aria-invalid",!1),e.one("."+n.IMAGEPRESENTATION).setAttribute("aria-invalid",!1),t=!1),this.getDialogue().centerDialogue(),t}})},"@VERSION@",{requires:["moodle-editor_atto-plugin"]}); +,p.onreadystatechange=function(){var t=n.editor.one("#"+h),r,s,o,u;if(p.readyState===4)if(p.status===200){r=JSON.parse(p.responseText);if(r){if(r.error)return t&&t.remove(!0),new M.core.ajaxException(r);s=r,r.event&&r.event==="fileexists"&&(s=r.newfile),o=i({url:s.url,presentation:!0}),u=e.Node.create(o),t?t.replace(u):n.editor.appendChild(u),n.markUpdated()}}else e.use("moodle-core-notification-alert",function(){new M.core.alert({message:M.util.get_string("servererror","moodle")})}),t&&t.remove(!0)},p.open("POST",M.cfg.wwwroot+"/repository/repository_ajax.php?action=upload",!0),p.send(l),!1}},_handleClick:function(e){var t=e.target,n=this.get("host").getSelectionFromNode(t);this.get("host").getSelection()!==n&&this.get("host").setSelection(n)},_displayDialogue:function(){this._currentSelection=this.get("host").getSelection();if(this._currentSelection===!1)return;this._rawImageDimensions=null;var e=this.getDialogue({headerContent:M.util.get_string("imageproperties",o),width:"auto",focusAfterHide:!0,focusOnShowSelector:r.INPUTURL});e.get("boundingBox").setStyle("maxWidth","90%"),e.set("bodyContent",this._getDialogueContent()).show()},_loadPreviewImage:function(e){var t=new Image,r=this;t.onerror=function(){var e=r._form.one("."+n.IMAGEPREVIEW);e.setStyles({display:"none"}),r.getDialogue().centerDialogue()},t.onload=function(){var e,t,i,o,u;r._rawImageDimensions={width:this.width,height:this.height},e=r._form.one("."+n.INPUTWIDTH),t=e.get("value"),t===""&&(e.set("value",this.width),t=""+this.width),e=r._form.one("."+n.INPUTHEIGHT),i=e.get("value"),i===""&&(e.set("value",this.height),i=""+this.height),e=r._form.one("."+n.IMAGEPREVIEW),e.setAttribute("src",this.src),e.setStyles({display:"inline"}),e=r._form.one("."+n.INPUTCONSTRAIN),t.match(s.ISPERCENT)&&i.match(s.ISPERCENT)?e.set("checked",t===i):(this.width===0&&(this.width=1),this.height===0&&(this.height=1),o=Math.round(1e3*parseInt(t,10)/this.width),u=Math.round(1e3*parseInt(i,10)/this.height),e.set("checked",o===u)),r._autoAdjustSize(r),r.getDialogue().centerDialogue()},t.src=e},_getDialogueContent:function(){var t=e.Handlebars.compile(u),r=this.get("host").canShowFilepicker("image"),s=e.Node.create(t({elementid:this.get("host").get("elementid"),CSS:n,component:o,showFilepicker:r,alignments:i}));return this._form=s,this._applyImageProperties(this._form),this._form.one("."+n.INPUTURL).on("blur",this._urlChanged,this),this._form.one("."+n.IMAGEPRESENTATION).on("change",this._updateWarning,this),this._form.one("."+n.INPUTALT).on("change",this._updateWarning,this),this._form.one("."+n.INPUTWIDTH).on("blur",this._autoAdjustSize,this),this._form.one("."+n.INPUTHEIGHT).on("blur",this._autoAdjustSize,this,!0),this._form.one("."+n.INPUTCONSTRAIN).on("change",function(e){e.target.get("checked")&&this._autoAdjustSize(e)},this),this._form.one("."+n.INPUTURL).on("blur",this._urlChanged,this),this._form.one("."+n.INPUTSUBMIT).on("click",this._setImage,this),r&&this._form.one("."+n.IMAGEBROWSER).on("click",function(){this.get("host").showFilepicker("image",this._filepickerCallback,this)},this),s},_autoAdjustSize:function(e,t){t=t||!1;var r=this._form.one("."+n.INPUTWIDTH),i="width",o=this._form.one("."+n.INPUTHEIGHT),u="height",a=this._form.one("."+n.INPUTCONSTRAIN),f=r.get("value"),l=o.get("value"),c=this._form.one("."+n.IMAGEPREVIEW),h,p;if(!this._rawImageDimensions)return;f===""&&(f=this._rawImageDimensions[i],r.set("value",f),f=r.get("value")),c.setStyles({width:null,height:null});if(!a.get("checked"))f.match(s.ISPERCENT)?(h=parseInt(f,10),p=this._rawImageDimensions.width/100*h,c.setStyle("width",p+"px")):c.setStyle("width",f+"px"),l.match(s.ISPERCENT)?(h=parseInt(l,10),p=this._rawImageDimensions.height/100*h,c.setStyle("height",p+"px")):c.setStyle("height",l+"px");else{if(t){var d;d=r,r=o,o=d,d=i,i=u,u=d,d=f,f=l,l=d}f.match(s.ISPERCENT)?(l=f,h=parseInt(f,10),p=this._rawImageDimensions.width/100*h,c.setStyle("width",p),p=this._rawImageDimensions.height/100*h,c.setStyle("height",p)):(l=Math.round(f/this._rawImageDimensions[i]*this._rawImageDimensions[u]),t?c.setStyles({width:l,height:f}):c.setStyles({width:f,height:l})),o.set("value",l)}},_filepickerCallback:function(e){if(e.url!==""){var t=this._form.one("."+n.INPUTURL);t.set("value",e.url),this._form.one("."+n.INPUTWIDTH).set("value",""),this._form.one("."+n.INPUTHEIGHT).set("value",""),this._loadPreviewImage(e.url)}},_applyImageProperties:function(e){var t=this._getSelectedImageProperties(),r=e.one("."+n.IMAGEPREVIEW);if(t===!1){r.setStyle("display","none"),i.some(function(t){return t.isDefault?(e.one("."+n.INPUTALIGNMENT).set("value",t.value),!0):!1},this);return}t.align&&e.one("."+n.INPUTALIGNMENT).set("value",t.align),t.customstyle&&e.one("."+n.INPUTCUSTOMSTYLE).set("value",t.customstyle),t.width&&e.one("."+n.INPUTWIDTH).set("value",t.width),t.height&&e.one("."+n.INPUTHEIGHT).set("value",t.height),t.alt&&e.one("."+n.INPUTALT).set("value",t.alt),t.src&&(e.one("."+n.INPUTURL).set("value",t.src),this._loadPreviewImage(t.src)),t.presentation&&e.one("."+n.IMAGEPRESENTATION).set("checked","checked"),this._autoAdjustSize()},_getSelectedImageProperties:function(){var e={src:null,alt:null,width:null,height:null,align:"",presentation:!1},t=this.get("host").getSelectedNodes(),n,r,i,o;return t&&(t=t.filter("img")),t&&t.size()?(o=this._removeLegacyAlignment(t.item(0)),this._selectedImage=o,i=o.getAttribute("style"),e.customstyle=i,n=o.getAttribute("width"),n.match(s.ISPERCENT)||(n=parseInt(n,10)),r=o.getAttribute("height"),r.match(s.ISPERCENT)||(r=parseInt(r,10)),n!==0&&(e.width=n),r!==0&&(e.height=r),this._getAlignmentPropeties(o,e),e.src=o.getAttribute("src"),e.alt=o.getAttribute("alt")||"",e.presentation=o.get("role")==="presentation",e):(this._selectedImage=null,!1)},_getAlignmentPropeties:function(e,t){var n=!1,r;n=i.some(function(n){var i=this._getAlignmentClass(n.value);return e.hasClass(i)?(t.align=n.value,!0):(n.isDefault&&(r=n.value),!1)},this),!n&&r&&(t.align=r)},_urlChanged:function(){var e=this +._form.one("."+n.INPUTURL);e.get("value")!==""&&this._loadPreviewImage(e.get("value"))},_setImage:function(t){var r=this._form,i=r.one("."+n.INPUTURL).get("value"),o=r.one("."+n.INPUTALT).get("value"),u=r.one("."+n.INPUTWIDTH).get("value"),f=r.one("."+n.INPUTHEIGHT).get("value"),l=this._getAlignmentClass(r.one("."+n.INPUTALIGNMENT).get("value")),c=r.one("."+n.IMAGEPRESENTATION).get("checked"),h=r.one("."+n.INPUTCONSTRAIN).get("checked"),p,d=r.one("."+n.INPUTCUSTOMSTYLE).get("value"),v=[],m=this.get("host");t.preventDefault();if(this._updateWarning())return;m.focus();if(i!==""){this._selectedImage?m.setSelection(m.getSelectionFromNode(this._selectedImage)):m.setSelection(this._currentSelection),h&&v.push(n.RESPONSIVE),v.push(l);if(!u.match(s.ISPERCENT)&&isNaN(parseInt(u,10))){r.one("."+n.INPUTWIDTH).focus();return}if(!f.match(s.ISPERCENT)&&isNaN(parseInt(f,10))){r.one("."+n.INPUTHEIGHT).focus();return}var g=e.Handlebars.compile(a);p=g({url:i,alt:o,width:u,height:f,presentation:c,customstyle:d,classlist:v.join(" ")}),this.get("host").insertContentAtFocusPoint(p),this.markUpdated()}this.getDialogue({focusAfterHide:null}).hide()},_removeLegacyAlignment:function(t){return t.getStyle("margin")?(i.some(function(n){if(t.getStyle(n.name)!==n.value)return!1;var r=e.Node.create("
");return r.setStyle("margin",n.margin),t.getStyle("margin")!==r.getStyle("margin")?!1:(t.addClass(this._getAlignmentClass(n.value)),t.setStyle(n.name,null),t.setStyle("margin",null),!0)},this),t):t},_getAlignmentClass:function(e){return n.ALIGNSETTINGS+"_"+e},_updateWarning:function(){var e=this._form,t=!0,r=e.one("."+n.INPUTALT).get("value"),i=e.one("."+n.IMAGEPRESENTATION).get("checked");return r===""&&!i?(e.one("."+n.IMAGEALTWARNING).setStyle("display","block"),e.one("."+n.INPUTALT).setAttribute("aria-invalid",!0),e.one("."+n.IMAGEPRESENTATION).setAttribute("aria-invalid",!0),t=!0):(e.one("."+n.IMAGEALTWARNING).setStyle("display","none"),e.one("."+n.INPUTALT).setAttribute("aria-invalid",!1),e.one("."+n.IMAGEPRESENTATION).setAttribute("aria-invalid",!1),t=!1),this.getDialogue().centerDialogue(),t}})},"@VERSION@",{requires:["moodle-editor_atto-plugin"]}); diff --git a/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button.js b/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button.js index 93e07c3dd42..d5eb6419f4d 100644 --- a/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button.js +++ b/lib/editor/atto/plugins/image/yui/build/moodle-atto_image-button/moodle-atto_image-button.js @@ -410,7 +410,9 @@ Y.namespace('M.atto_image').Button = Y.Base.create('button', Y.M.editor_atto.Edi focusAfterHide: true, focusOnShowSelector: SELECTORS.INPUTURL }); - + // Set a maximum width for the dialog. This will prevent the dialog width to extend beyond the screen width + // in cases when the uploaded image has larger width. + dialogue.get('boundingBox').setStyle('maxWidth', '90%'); // Set the dialogue content, and then show the dialogue. dialogue.set('bodyContent', this._getDialogueContent()) .show(); diff --git a/lib/editor/atto/plugins/image/yui/src/button/js/button.js b/lib/editor/atto/plugins/image/yui/src/button/js/button.js index 0289f06f195..f473b337549 100644 --- a/lib/editor/atto/plugins/image/yui/src/button/js/button.js +++ b/lib/editor/atto/plugins/image/yui/src/button/js/button.js @@ -408,7 +408,9 @@ Y.namespace('M.atto_image').Button = Y.Base.create('button', Y.M.editor_atto.Edi focusAfterHide: true, focusOnShowSelector: SELECTORS.INPUTURL }); - + // Set a maximum width for the dialog. This will prevent the dialog width to extend beyond the screen width + // in cases when the uploaded image has larger width. + dialogue.get('boundingBox').setStyle('maxWidth', '90%'); // Set the dialogue content, and then show the dialogue. dialogue.set('bodyContent', this._getDialogueContent()) .show();