{"version":3,"file":"kendo.imageeditor.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendoimageeditor","js","this","$","undefined$1","kendo","window","extend","Class","NS","paneStyles","round","f","Math","Pane","init","imageeditor","that","currentPaneTool","destroy","element","addClass","open","commonMessages","options","messages","common","paneWrapper","append","formWidget","ui","Form","formSettings","buttonsTemplate","html","renderButton","confirm","icon","themeColor","cancel","bindButtonEvents","show","buttons","find","_clickHandler","_click","bind","on","ev","action","target","closest","data","toolbar","trigger","console","error","refresh","off","hide","CropPane","fn","call","buildCropModel","canvasUI","model","_model","toJSON","executeCommand","command","cropMessages","panes","crop","aspectRatioItems","aspectRatioDS","key","push","value","text","formData","change","onChange","items","type","label","title","layout","grid","cols","gutter","aspectRatio","field","editor","editorOptions","dataValueField","dataTextField","dataSource","colSpan","orientation","_orientationEditor","width","attributes","style","format","max","min","height","lockAspectRatio","container","_orientationWidget","appendTo","kendoButtonGroup","portrait","selected","landscape","select","sender","wrapper","set","canvas","getCanvasElement","top","left","canvasContainer","cropOverlay","cropElement","handle","handles","zoomLevel","getZoomLevel","i","length","handleElm","attr","_initResizeHandle","_canvasUI","borderWidth","parseInt","css","backgroundImage","_image","src","backgroundSize","backgroundClip","backgroundPosition","kendoDraggable","ignore","drag","_adjustTopLeft","offsetTop","y","delta","offsetLeft","x","newModel","$target","oldModel","adjustments","correctedLeft","correctedTop","indexOf","offsetWidth","offsetHeight","compare","compareModel","maxWidth","maxHeight","originalRatio","gcd","_gcd","tempModel","newSize","_calcSize","force","size","isPortrait","ratios","split","map","wRatio","hRatio","expectedRatio","realRatio","sizeByRatio","a","b","remove","ResizePane","buildResizeModel","originalWidth","originalHeight","measure","resizeMessages","resize","encoded","pixels","percents","measureW","measureH","ratio","aspectRatioLocked","resetNumericsTo","_preventChange","widthNumeric","heightNumeric","isPercent","setOptions","ImageEditorPane","jQuery","imageeditorNS","Command","OpenPaneImageEditorCommand","exec","pane","first","ZoomImageEditorCommand","zoomStep","spacing","newHeight","imgHeight","currentZoom","zoomInOut","isNaN","_processStringValue","parseFloat","_canvas","_zoomLevel","initialZoom","expectedHeight","canvasWrapper","CropImageEditorCommand","ctx","getCurrent2dContext","croppedImage","getImageData","clearRect","putImageData","drawImage","toDataURL","done","image","drawCanvas","fail","ResizeImageEditorCommand","getCurrentImage","UndoImageEditorCommand","undoStack","pop","redoStack","RedoImageEditorCommand","SaveImageEditorCommand","saveAs","dataURI","OpenImageEditorCommand","upload","_upload","input","kendoUpload","onSelect","onError","multiple","validation","allowedExtensions","getKendoUpload","click","file","files","rawFile","reader","FileReader","addEventListener","result","_initUndoRedoStack","_toggleTools","readAsDataURL","ImageEditorCommand","commands","isPlainObject","Widget","outerHeight","_outerHeight","ERROR","IMAGELOADED","IMAGERENDERED","EXECUTE","CANVAS_TEMPLATE","imageEditorStyles","ImageEditor","_wrapper","_renderHeader","_contentWrapper","_keyHandler","imageUrl","_drawCanvas","notify","name","imageLabel","fileName","save","undo","redo","zoomIn","zoomOut","zoomDropdown","zoomActualSize","zoomFitToScreen","events","defaultTools","showText","toggleCondition","separator","separator1","overflow","component","componentOptions","placeholder","valuePrimitive","template","htmlEncode","commandOn","optionLabel","dataBound","e","list","_resizeHandler","onResize","header","_initToolbar","_tabIndex","toolbarElement","toolbarOptions","tools","Object","keys","parentMessages","ToolBar","toggleTools","_toolbarClick","val","contentWrapper","toolbarHeight","prevent","ctrlKey","keyCode","preventDefault","canRedo","canUndo","hasImage","canExport","enable","deferred","Deferred","Image","onload","progress","resolve","onerror","reject","arguments","promise","getContext","_ctx","args","commandName","commandOptions","plugin"],"sources":["kendo.imageeditor.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('kendo.dropdownlist.js'), require('kendo.toolbar.js'), require('kendo.core.js'), require('kendo.form.js'), require('kendo.html.button.js'), require('kendo.buttongroup.js'), require('kendo.draganddrop.js'), require('kendo.upload.js')) :\n typeof define === 'function' && define.amd ? define(['kendo.dropdownlist', 'kendo.toolbar', 'kendo.core', 'kendo.form', 'kendo.html.button', 'kendo.buttongroup', 'kendo.draganddrop', 'kendo.upload'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendoimageeditor = global.kendoimageeditor || {}, global.kendoimageeditor.js = factory()));\n})(this, (function () {\n (function($, undefined$1) {\n var kendo = window.kendo,\n extend = $.extend,\n Class = kendo.Class,\n\n NS = \".k-imageeditor-pane\",\n\n CLICK = \"click\";\n\n var paneStyles = {\n form: \"k-imageeditor-pane-form\",\n button: \"k-imageeditor-pane-button\",\n confirmButton: \"k-imageeditor-pane-confirm-button\",\n cropOverlay: \"k-imageeditor-crop-overlay\",\n crop: \"k-imageeditor-crop\",\n resizeHandle: \"k-resize-handle\",\n resizeHandlePrefix: \"k-resize-\"\n };\n\n var round = function(f) {\n return Math.round(f * 1000) / 1000;\n };\n\n var Pane = Class.extend({\n init: function(imageeditor) {\n var that = this;\n\n that.imageeditor = imageeditor;\n\n if (that.imageeditor.currentPaneTool) {\n that.imageeditor.currentPaneTool.destroy();\n }\n\n that.element = $(\"
\").addClass(paneStyles.form);\n },\n open: function() {\n var that = this,\n imageeditor = that.imageeditor,\n commonMessages = imageeditor.options.messages.common;\n\n imageeditor.paneWrapper.append(that.element);\n that.formWidget = new kendo.ui.Form(that.element, extend(that.formSettings(), {\n buttonsTemplate: () =>\n kendo.html.renderButton(``, {\n icon: 'check',\n themeColor: 'primary'\n }) +\n kendo.html.renderButton(``, {\n icon: 'cancel-outline'\n })\n }));\n\n that.bindButtonEvents();\n imageeditor.paneWrapper.show();\n imageeditor.currentPaneTool = that;\n },\n bindButtonEvents: function() {\n var that = this,\n formWidget = that.formWidget,\n buttons = formWidget.element.find(\".\" + paneStyles.button);\n\n that._clickHandler = that._click.bind(that);\n\n buttons.on(CLICK + NS, that._clickHandler);\n },\n _click: function(ev) {\n var that = this,\n target = $(ev.target).closest(\".\" + paneStyles.button),\n action = target.data(\"action\");\n\n if (that[action]) {\n that[action]();\n }\n },\n cancel: function() {\n this.imageeditor.toolbar.element.find(\"[tabindex=0]\").trigger(\"focus\");\n this.destroy();\n },\n confirm: function() {\n window.console.error(\"Pane's confirm method is not implemented!\");\n this.destroy();\n },\n refresh: function() {\n },\n destroy: function() {\n var that = this,\n imageeditor = that.imageeditor;\n\n that.formWidget.element.find(\".\" + paneStyles.button).off(NS);\n that.formWidget.destroy();\n imageeditor.paneWrapper.html(\"\");\n imageeditor.paneWrapper.hide();\n delete imageeditor.currentPaneTool;\n }\n });\n\n var CropPane = Pane.extend({\n init: function(imageeditor) {\n var that = this;\n Pane.fn.init.call(that, imageeditor);\n that.buildCropModel();\n that.canvasUI();\n },\n confirm: function() {\n var that = this,\n model = that.formWidget._model.toJSON();\n\n that.destroy();\n\n that.imageeditor.executeCommand({ command: \"CropImageEditorCommand\", options: model });\n },\n formSettings: function() {\n var that = this,\n cropMessages = that.imageeditor.options.messages.panes.crop,\n commonMessages = that.imageeditor.options.messages.common,\n aspectRatioItems = cropMessages.aspectRatioItems,\n aspectRatioDS = [];\n\n if (aspectRatioItems) {\n for (var key in aspectRatioItems) {\n aspectRatioDS.push({ value: key, text: aspectRatioItems[key] });\n }\n } else {\n aspectRatioDS = [\n { value: \"originalRatio\", text: \"Original ratio\" },\n { value: \"1:1\", text: \"1:1 (Square)\" },\n { value: \"4:5\", text: \"4:5 (8:10)\" },\n { value: \"5:7\", text: \"5:7\" },\n { value: \"2:3\", text: \"2:3 (4:6)\" },\n { value: \"16:9\", text: \"16:9\" }\n ];\n }\n\n return {\n formData: that._model,\n change: that.onChange.bind(that),\n items: [{\n type: \"group\",\n label: cropMessages.title || \"Crop Image\",\n layout: \"grid\",\n grid: { cols: 2, gutter: \"0 8px\" },\n items: [{\n label: cropMessages.aspectRatio || \"Aspect ratio:\",\n field: \"aspectRatio\",\n editor: \"DropDownList\",\n editorOptions: {\n dataValueField: \"value\",\n dataTextField: \"text\",\n dataSource: aspectRatioDS\n },\n colSpan: 2\n }, {\n label: cropMessages.orientation,\n field: \"orientation\",\n editor: that._orientationEditor.bind(that),\n colSpan: 2\n }, {\n label: commonMessages.width || \"Width:\",\n field: \"width\",\n attributes: { style: \"max-width: 100px;\" },\n editor: \"NumericTextBox\",\n editorOptions: {\n format: \"n0\",\n max: that._model.width,\n min: 0\n },\n colSpan: 1\n }, {\n label: commonMessages.height || \"Height:\",\n field: \"height\",\n attributes: { style: \"max-width: 100px;\" },\n editor: \"NumericTextBox\",\n editorOptions: {\n format: \"n0\",\n max: that._model.height,\n min: 0\n },\n colSpan: 1\n }, {\n label: commonMessages.lockAspectRatio || \"Lock aspect ratio\",\n field: \"lockAspectRatio\",\n colSpan: 2\n }\n ]\n }]\n };\n },\n _orientationEditor: function(container, options) {\n var that = this,\n cropMessages = that.imageeditor.options.messages.panes.crop,\n value = options.model[options.field];\n\n that._orientationWidget = $(\"
\")\n .appendTo(container)\n .kendoButtonGroup({\n items: [\n { text: cropMessages.portrait || \"Portrait\", attributes: { \"data-value\": \"portrait\" }, selected: value === \"portrait\" },\n { text: cropMessages.landscape || \"Landscape\", attributes: { \"data-value\": \"landscape\" }, selected: value === \"landscape\" }\n ],\n select: function(ev) {\n var value = ev.sender.wrapper.find(\".k-selected\").data(\"value\");\n options.model.set(options.field, value);\n }\n }).data(\"kendoButtonGroup\");\n },\n buildCropModel: function() {\n var that = this,\n imageeditor = that.imageeditor,\n canvas = imageeditor.getCanvasElement(),\n width = canvas.width,\n height = canvas.height;\n\n that._model = {\n top: 0,\n left: 0,\n aspectRatio: \"originalRatio\",\n width: width,\n height: height,\n orientation: (width - height < 0) ? \"portrait\" : \"landscape\",\n lockAspectRatio: true\n };\n },\n canvasUI: function() {\n var that = this,\n imageeditor = that.imageeditor,\n canvasContainer = that.imageeditor.canvasContainer,\n cropOverlay = $(\"
\").addClass(paneStyles.cropOverlay),\n cropElement = $(\"
\").addClass(paneStyles.crop),\n handle = \"\",\n handles = [ \"nw\", \"n\", \"ne\", \"w\", \"e\", \"sw\", \"s\", \"se\" ],\n zoomLevel = imageeditor.getZoomLevel();\n\n for (var i = 0; i < handles.length; i++) {\n var handleElm = $(handle)\n .addClass(paneStyles.resizeHandlePrefix + handles[i])\n .attr(\"data-orientation\", handles[i]);\n\n that._initResizeHandle(handleElm);\n\n cropElement.append(handleElm);\n }\n\n that.cropElement = cropElement;\n\n that._canvasUI = cropOverlay\n .append(cropElement)\n .appendTo(canvasContainer);\n\n var width = Math.round(that._model.width * zoomLevel);\n var height = Math.round(that._model.height * zoomLevel);\n var borderWidth = parseInt(that.cropElement.css(\"border-top-width\"), 10);\n\n that.cropElement.css({\n width: width,\n height: height,\n backgroundImage: \"url('\" + imageeditor._image.src + \"')\",\n backgroundSize: kendo.format(\"{0}px {1}px\", width, height),\n backgroundClip: \"content-box\",\n backgroundPosition: kendo.format(\"-{0}px -{0}px\", borderWidth)\n });\n\n that.cropElement.kendoDraggable({\n ignore: \".\" + paneStyles.resizeHandle,\n drag: function(ev) {\n that._adjustTopLeft(ev.target.offsetTop + ev.y.delta, ev.target.offsetLeft + ev.x.delta);\n }\n });\n },\n refresh: function() {\n var that = this,\n newModel = that.formWidget._model,\n zoomLevel = that.imageeditor.getZoomLevel(),\n width = Math.round(newModel.width * zoomLevel),\n height = Math.round(newModel.height * zoomLevel),\n top = Math.round(newModel.top * zoomLevel),\n left = Math.round(newModel.left * zoomLevel),\n borderWidth = parseInt(that.cropElement.css(\"border-top-width\"), 10);\n\n that.cropElement.css({\n top: top,\n left: left,\n width: width,\n height: height,\n backgroundSize: kendo.format(\"{0}px {1}px\", that._model.width * zoomLevel, that._model.height * zoomLevel),\n backgroundPosition: kendo.format(\"-{0}px -{1}px\", left + borderWidth, top + borderWidth)\n });\n },\n _initResizeHandle: function(handle) {\n var that = this;\n\n handle.kendoDraggable({\n drag: function(ev) {\n var $target = $(ev.sender.element),\n newModel = that.formWidget._model,\n oldModel = that._model,\n orientation = $target.data(\"orientation\"),\n adjustments = {},\n zoomLevel = that.imageeditor.getZoomLevel(),\n correctedLeft = newModel.left * zoomLevel,\n correctedTop = newModel.top * zoomLevel;\n\n if (orientation.indexOf(\"w\") >= 0) {\n adjustments.left = that.cropElement[0].offsetLeft + ev.x.delta;\n adjustments.width = that.cropElement[0].offsetWidth - ev.x.delta;\n } else if (orientation.indexOf(\"e\") >= 0) {\n adjustments.width = that.cropElement[0].offsetWidth + ev.x.delta;\n }\n\n if (orientation.indexOf(\"n\") >= 0) {\n adjustments.top = that.cropElement[0].offsetTop + ev.y.delta;\n adjustments.height = that.cropElement[0].offsetHeight - ev.y.delta;\n } else if (orientation.indexOf(\"s\") >= 0) {\n adjustments.height = that.cropElement[0].offsetHeight + ev.y.delta;\n }\n\n if (adjustments.width && ((adjustments.left || correctedLeft) + adjustments.width <= oldModel.width * zoomLevel)) {\n newModel.set(\"width\", Math.round(adjustments.width / zoomLevel));\n }\n\n if (adjustments.height && ((adjustments.top || correctedTop) + adjustments.height <= oldModel.height * zoomLevel)) {\n newModel.set(\"height\", Math.round(adjustments.height / zoomLevel));\n }\n\n if (adjustments.top || adjustments.left) {\n that._adjustTopLeft(adjustments.top, adjustments.left);\n }\n }\n });\n },\n _adjustTopLeft: function(top, left, compare) {\n var that = this,\n compareModel = compare || that.formWidget._model,\n newModel = that.formWidget._model,\n oldModel = that._model,\n zoomLevel = that.imageeditor.getZoomLevel();\n\n if (top >= 0 && (top / zoomLevel) + compareModel.height <= oldModel.height) {\n newModel.set(\"top\", Math.round(top / zoomLevel));\n }\n\n if (left >= 0 && (left / zoomLevel) + compareModel.width <= oldModel.width) {\n newModel.set(\"left\", Math.round(left / zoomLevel));\n }\n },\n onChange: function(ev) {\n var that = this,\n zoomLevel = that.imageeditor.getZoomLevel(),\n newModel = ev.sender._model,\n oldModel = that._model,\n maxWidth = oldModel.width,\n maxHeight = oldModel.height,\n originalRatio = oldModel.width + \":\" + oldModel.height,\n gcd = that._gcd(oldModel.width, oldModel.height);\n\n originalRatio = oldModel.width / gcd + \":\" + oldModel.height / gcd;\n\n if (ev.field === \"aspectRatio\" && ev.value === \"originalRatio\") {\n newModel.set(\"top\", 0);\n newModel.set(\"left\", 0);\n newModel.set(\"orientation\", oldModel.orientation);\n newModel.set(\"width\", oldModel.width);\n newModel.set(\"height\", oldModel.height);\n } else if (ev.field === \"orientation\") {\n var tempModel = extend({}, newModel, {\n width: newModel.height,\n height: newModel.width\n });\n\n var newSize = that._calcSize(tempModel, originalRatio, maxWidth, maxHeight);\n\n newModel.set(\"width\", newSize.width);\n newModel.set(\"height\", newSize.height);\n that._orientationWidget.select(ev.value === \"portrait\" ? 0 : 1);\n } else if (newModel.lockAspectRatio) {\n var force = ev.field;\n var size = that._calcSize(newModel, originalRatio, maxWidth, maxHeight, force);\n newModel.set(\"width\", size.width);\n newModel.set(\"height\", size.height);\n }\n\n var width = Math.round(newModel.width * zoomLevel);\n var height = Math.round(newModel.height * zoomLevel);\n var top = Math.round(newModel.top * zoomLevel);\n var left = Math.round(newModel.left * zoomLevel);\n var borderWidth = parseInt(that.cropElement.css(\"border-top-width\"), 10);\n\n that.cropElement.css({\n top: top,\n left: left,\n width: width,\n height: height,\n backgroundPosition: kendo.format(\"-{0}px -{1}px\", left + borderWidth, top + borderWidth)\n });\n },\n _calcSize: function(model, originalRatio, maxWidth, maxHeight, force) {\n var width = Math.min(model.width, maxWidth),\n height = Math.min(model.height, maxHeight),\n isPortrait = model.orientation === \"portrait\",\n ratios = model.aspectRatio;\n\n if (ratios.indexOf(\":\") < 0) {\n ratios = originalRatio;\n }\n\n ratios = ratios.split(\":\").map(function(value) {\n return parseInt(value, 10);\n });\n\n var wRatio = isPortrait ? Math.min(ratios[0], ratios[1]) : Math.max(ratios[0], ratios[1]);\n var hRatio = !isPortrait ? Math.min(ratios[0], ratios[1]) : Math.max(ratios[0], ratios[1]);\n var expectedRatio = round(wRatio / hRatio);\n var realRatio = round(width / height);\n\n var sizeByRatio = {\n width: Math.round(height * expectedRatio),\n height: Math.round(width / expectedRatio)\n };\n\n if (force === \"width\") {\n return {\n width: width,\n height: sizeByRatio.height\n };\n }\n\n if (force === \"height\") {\n return {\n width: sizeByRatio.width,\n height: height\n };\n }\n\n if (realRatio > expectedRatio) {\n width = sizeByRatio.width;\n } else if (realRatio < expectedRatio) {\n height = sizeByRatio.height;\n }\n\n return {\n width: width,\n height: height\n };\n },\n _gcd: function(a, b) {\n return (b === 0) ? a : this._gcd (b, a % b);\n },\n destroy: function() {\n kendo.destroy(this._canvasUI);\n this._canvasUI.remove();\n Pane.fn.destroy.call(this);\n }\n });\n\n var ResizePane = Pane.extend({\n init: function(imageeditor) {\n Pane.fn.init.call(this, imageeditor);\n this.buildResizeModel();\n },\n confirm: function() {\n var that = this,\n originalWidth = that._model.width,\n originalHeight = that._model.height,\n model = that.formWidget._model.toJSON();\n\n if (model.measure === \"percents\") {\n model.width = originalWidth * (model.width / 100);\n model.height = originalHeight * (model.height / 100);\n }\n\n that.imageeditor.executeCommand({ command: \"ResizeImageEditorCommand\", options: model });\n that.destroy();\n },\n formSettings: function() {\n var that = this,\n resizeMessages = that.imageeditor.options.messages.panes.resize,\n commonMessages = that.imageeditor.options.messages.common;\n\n return {\n formData: that._model,\n change: that.onChange.bind(that),\n items: [{\n type: \"group\",\n label: resizeMessages.title || \"Resize image\",\n layout: \"grid\",\n grid: { cols: 2, gutter: \"0 8px\" },\n items: [{\n label: commonMessages.width || \"Width:\",\n field: \"width\",\n attributes: { style: \"max-width: 100px;\" },\n editor: \"NumericTextBox\",\n editorOptions: {\n format: \"n0\",\n min: 0\n },\n colSpan: 1\n }, {\n field: \"measureW\",\n editor: \"DropDownList\",\n attributes: { style: \"max-width: 100px;\" },\n label: { text: \" \", encoded: false },\n editorOptions: {\n dataTextField: \"text\",\n dataValueField: \"value\",\n dataSource: [\n { text: resizeMessages.pixels || \"Pixels\", value: \"pixels\" },\n { text: resizeMessages.percents || \"Percents\", value: \"percents\" }\n ]\n },\n colSpan: 1\n }, {\n label: commonMessages.height || \"Height:\",\n field: \"height\",\n attributes: { style: \"max-width: 100px;\" },\n editor: \"NumericTextBox\",\n editorOptions: {\n format: \"n0\",\n min: 0\n },\n colSpan: 1\n }, {\n field: \"measureH\",\n label: { text: \" \", encoded: false },\n attributes: { style: \"max-width: 100px;\" },\n editor: \"DropDownList\",\n editorOptions: {\n dataTextField: \"text\",\n dataValueField: \"value\",\n dataSource: [\n { text: resizeMessages.pixels || \"Pixels\", value: \"pixels\" },\n { text: resizeMessages.percents || \"Percents\", value: \"percents\" }\n ]\n },\n colSpan: 1\n }, {\n label: commonMessages.lockAspectRatio || \"Lock aspect ratio\",\n field: \"lockAspectRatio\",\n colSpan: 2\n }]\n }]\n };\n },\n buildResizeModel: function() {\n var that = this,\n imageeditor = that.imageeditor,\n canvas = imageeditor.getCanvasElement(),\n width = canvas.width,\n height = canvas.height;\n\n that._model = {\n width: width,\n height: height,\n measure: \"pixels\",\n measureW: \"pixels\",\n measureH: \"pixels\",\n lockAspectRatio: true,\n ratio: round(width / height)\n };\n },\n onChange: function(ev) {\n var that = this,\n newModel = ev.sender._model,\n aspectRatioLocked = newModel.lockAspectRatio;\n\n if (ev.field === \"measureW\" || ev.field === \"measureH\") {\n newModel.set(\"measureW\", ev.value);\n newModel.set(\"measureH\", ev.value);\n newModel.set(\"measure\", ev.value);\n } else if (ev.field === \"measure\") {\n that.resetNumericsTo(ev.value);\n } else if (ev.field === \"width\" && aspectRatioLocked && !that._preventChange) {\n newModel.set(\"height\", newModel.width / newModel.ratio);\n } else if (ev.field === \"height\" && aspectRatioLocked && !that._preventChange) {\n newModel.set(\"width\", newModel.height * newModel.ratio);\n }\n\n newModel.set(\"ratio\", round(newModel.width / newModel.height));\n },\n resetNumericsTo: function(type) {\n var that = this,\n originalWidth = that._model.width,\n originalHeight = that._model.height,\n formWidget = that.formWidget,\n model = formWidget._model,\n widthNumeric = formWidget.element.find(\"[name=width]\").data(\"kendoNumericTextBox\"),\n heightNumeric = formWidget.element.find(\"[name=height]\").data(\"kendoNumericTextBox\"),\n isPercent = type === \"percents\",\n options = {\n percents: {\n format: \"#\\\\\\%\"\n },\n pixels: {\n format: \"n0\"\n }\n };\n\n\n widthNumeric.setOptions(options[type]);\n heightNumeric.setOptions(options[type]);\n\n that._preventChange = true;\n model.set(\"width\", isPercent ? (originalWidth / widthNumeric.value()) * 100 : originalWidth * (widthNumeric.value() / 100));\n model.set(\"height\", isPercent ? (originalHeight / heightNumeric.value()) * 100 : originalHeight * (heightNumeric.value() / 100));\n that._preventChange = false;\n }\n });\n\n extend(kendo.ui, {\n imageeditor: {\n ImageEditorPane: Pane,\n panes: {\n crop: CropPane,\n resize: ResizePane\n }\n }\n });\n })(window.kendo.jQuery);\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n imageeditorNS = kendo.ui.imageeditor,\n extend = $.extend,\n Class = kendo.Class;\n\n var Command = Class.extend({\n init: function(options) {\n this.options = extend({}, options, this.options);\n this.imageeditor = options.imageeditor;\n }\n });\n\n var OpenPaneImageEditorCommand = Command.extend({\n init: function(options) {\n Command.fn.init.call(this, options);\n },\n exec: function() {\n var that = this,\n imageeditor = that.imageeditor,\n pane = new imageeditorNS.panes[that.options.value](imageeditor);\n\n pane.open();\n pane.element.find(\":kendoFocusable\").first().trigger(\"focus\");\n }\n });\n\n var ZoomImageEditorCommand = Command.extend({\n options: {\n zoomStep: 0.05,\n spacing: 20\n },\n init: function(options) {\n Command.fn.init.call(this, options);\n },\n exec: function() {\n var that = this,\n options = that.options,\n value = options.value,\n imageeditor = that.imageeditor,\n imgHeight = imageeditor._image.height,\n currentZoom = imageeditor.getZoomLevel(),\n newHeight = imgHeight,\n zoomInOut = value === \"zoomIn\" || value === \"zoomOut\";\n\n if (!isNaN(value)) {\n value = parseFloat(value);\n } else if (typeof value === \"string\") {\n value = that._processStringValue(value, currentZoom);\n }\n\n newHeight = Math.round(imgHeight * value);\n\n if (newHeight > 0) {\n $(imageeditor._canvas).css(\"height\", newHeight);\n imageeditor._zoomLevel = value;\n }\n\n if (imageeditor.currentPaneTool) {\n imageeditor.currentPaneTool.refresh();\n }\n\n if (zoomInOut) {\n imageeditor.toolbar.element.find(\"[tabindex=0]\").trigger(\"focus\");\n }\n },\n _processStringValue: function(value, initialZoom) {\n var that = this,\n options = that.options,\n imageeditor = that.imageeditor,\n imgHeight = imageeditor._image.height,\n expectedHeight = imageeditor.canvasWrapper.height() - options.spacing,\n zoomStep = options.zoomStep;\n\n switch (value) {\n case \"zoomIn\":\n return initialZoom + zoomStep;\n case \"zoomOut\":\n return initialZoom - zoomStep;\n case \"fitToScreen\":\n return Math.round((expectedHeight / imgHeight) * 100) / 100;\n default:\n return 1;\n }\n }\n });\n\n var CropImageEditorCommand = Command.extend({\n init: function(options) {\n Command.fn.init.call(this, options);\n },\n exec: function() {\n var that = this,\n options = that.options,\n imageeditor = that.imageeditor,\n canvas = imageeditor.getCanvasElement(),\n ctx = imageeditor.getCurrent2dContext(),\n croppedImage = ctx.getImageData(options.left, options.top, options.width, options.height);\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n canvas.width = options.width;\n canvas.height = options.height;\n ctx.putImageData(croppedImage, 0, 0);\n\n imageeditor.drawImage(canvas.toDataURL()).done(function(image) {\n imageeditor.drawCanvas(image);\n imageeditor.toolbar.element.find(\"[tabindex=0]\").trigger(\"focus\");\n }).fail(function(ev) {\n imageeditor.trigger(\"error\", ev);\n });\n }\n });\n\n var ResizeImageEditorCommand = Command.extend({\n init: function(options) {\n Command.fn.init.call(this, options);\n },\n exec: function() {\n var that = this,\n options = that.options,\n imageeditor = that.imageeditor,\n canvas = imageeditor.getCanvasElement(),\n ctx = imageeditor.getCurrent2dContext(),\n image = imageeditor.getCurrentImage();\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n canvas.width = options.width;\n canvas.height = options.height;\n ctx.drawImage(image, 0, 0, options.width, options.height);\n\n imageeditor.drawImage(canvas.toDataURL()).done(function(image) {\n imageeditor.drawCanvas(image);\n imageeditor.toolbar.element.find(\"[tabindex=0]\").trigger(\"focus\");\n }).fail(function(ev) {\n imageeditor.trigger(\"error\", ev);\n });\n }\n });\n\n var UndoImageEditorCommand = Command.extend({\n exec: function() {\n var that = this,\n imageeditor = that.imageeditor,\n canvas = imageeditor.getCanvasElement(),\n ctx = imageeditor.getCurrent2dContext(),\n image = imageeditor.undoStack.pop();\n\n if (image) {\n imageeditor.redoStack.push(imageeditor.getCurrentImage());\n delete imageeditor._image;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n canvas.width = image.width;\n canvas.height = image.height;\n ctx.drawImage(image, 0, 0, image.width, image.height);\n\n imageeditor.drawImage(canvas.toDataURL()).done(function(image) {\n imageeditor.drawCanvas(image);\n imageeditor.toolbar.element.find(\"[tabindex=0]\").trigger(\"focus\");\n }).fail(function(ev) {\n imageeditor.trigger(\"error\", ev);\n });\n }\n }\n });\n\n var RedoImageEditorCommand = Command.extend({\n exec: function() {\n var that = this,\n imageeditor = that.imageeditor,\n canvas = imageeditor.getCanvasElement(),\n ctx = imageeditor.getCurrent2dContext(),\n image = imageeditor.redoStack.pop();\n\n if (image) {\n imageeditor.undoStack.push(imageeditor.getCurrentImage());\n delete imageeditor._image;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n canvas.width = image.width;\n canvas.height = image.height;\n ctx.drawImage(image, 0, 0, image.width, image.height);\n\n imageeditor.drawImage(canvas.toDataURL()).done(function(image) {\n imageeditor.drawCanvas(image);\n imageeditor.toolbar.element.find(\"[tabindex=0]\").trigger(\"focus\");\n }).fail(function(ev) {\n imageeditor.trigger(\"error\", ev);\n });\n }\n }\n });\n\n var SaveImageEditorCommand = Command.extend({\n exec: function() {\n var that = this,\n imageeditor = that.imageeditor,\n canvas = imageeditor.getCanvasElement();\n\n kendo.saveAs(extend({}, imageeditor.options.saveAs, {\n dataURI: canvas.toDataURL()\n }));\n\n imageeditor.toolbar.element.find(\"[data-command=SaveImageEditorCommand]\").trigger(\"focus\");\n }\n });\n\n var OpenImageEditorCommand = Command.extend({\n exec: function() {\n var that = this,\n imageeditor = that.imageeditor,\n upload = imageeditor._upload;\n\n if (!upload) {\n var input = $(\"\");\n input.kendoUpload({\n select: that.onSelect.bind(that),\n error: that.onError.bind(that),\n multiple: false,\n validation: {\n allowedExtensions: [\".jpg\", \".jpeg\", \".gif\", \".png\", \".bmp\", \".tiff\", \".webp\"]\n }\n });\n\n imageeditor._upload = upload = input.getKendoUpload();\n\n }\n\n upload.element.click();\n },\n onSelect: function(ev) {\n var that = this,\n imageeditor = that.imageeditor,\n file = ev.files[0].rawFile,\n reader = new FileReader();\n\n reader.addEventListener(\"load\", function() {\n imageeditor.drawImage(reader.result).done(function(image) {\n if (!imageeditor.trigger(\"imageLoaded\", { image: image })) {\n imageeditor.drawCanvas(image);\n imageeditor._initUndoRedoStack();\n imageeditor._toggleTools();\n }\n }).fail(function(ev) {\n imageeditor.trigger(\"error\", ev);\n });\n }, false);\n\n\n if (file) {\n reader.readAsDataURL(file);\n }\n\n },\n onError: function(ev) {\n var that = this,\n imageeditor = that.imageeditor;\n\n imageeditor.trigger(\"error\", ev);\n }\n });\n\n extend(kendo.ui.imageeditor, {\n ImageEditorCommand: Command,\n commands: {\n OpenPaneImageEditorCommand: OpenPaneImageEditorCommand,\n ZoomImageEditorCommand: ZoomImageEditorCommand,\n CropImageEditorCommand: CropImageEditorCommand,\n ResizeImageEditorCommand: ResizeImageEditorCommand,\n UndoImageEditorCommand: UndoImageEditorCommand,\n RedoImageEditorCommand: RedoImageEditorCommand,\n SaveImageEditorCommand: SaveImageEditorCommand,\n OpenImageEditorCommand: OpenImageEditorCommand\n }\n });\n\n })(window.kendo.jQuery);\n\n var __meta__ = {\n id: \"imageeditor\",\n name: \"ImageEditor\",\n category: \"web\",\n depends: [\"core\", \"toolbar\", \"dropdownlist\"]\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n extend = $.extend,\n isPlainObject = $.isPlainObject,\n Widget = kendo.ui.Widget,\n ui = kendo.ui,\n\n NS = \".kendoImageEditor\",\n\n outerHeight = kendo._outerHeight,\n\n ERROR = \"error\",\n IMAGELOADED = \"imageLoaded\",\n IMAGERENDERED = \"imageRendered\",\n EXECUTE = \"execute\",\n\n CLICK = \"click\",\n TOGGLE = \"toggle\",\n CHANGE = \"change\",\n\n CANVAS_TEMPLATE = (label) => `Canvas element`;\n\n var imageEditorStyles = {\n wrapper: \"k-widget k-imageeditor\",\n header: \"k-imageeditor-header\",\n toolbar: \"k-imageeditor-toolbar\",\n paneWrapper: \"k-imageeditor-action-pane\",\n contentWrapper: \"k-imageeditor-content\",\n canvasWrapper: \"k-imageeditor-canvas-container\",\n canvasContainer: \"k-imageeditor-canvas\"\n };\n\n var ImageEditor = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n options = $.extend(true, {}, options);\n\n that._wrapper();\n that._renderHeader();\n that._contentWrapper();\n that._keyHandler();\n\n if (options.imageUrl) {\n that._drawCanvas();\n }\n\n that._initUndoRedoStack();\n that._toggleTools();\n\n kendo.notify(that);\n },\n\n options: {\n name: 'ImageEditor',\n width: \"100%\",\n height: 570,\n imageUrl: \"\",\n imageLabel: \"\",\n toolbar: {\n },\n saveAs: {\n fileName: \"image.png\"\n },\n messages: {\n toolbar: {\n open: \"Open Image\",\n save: \"Save Image\",\n undo: \"Undo\",\n redo: \"Redo\",\n crop: \"Crop\",\n resize: \"Resize\",\n zoomIn: \"Zoom In\",\n zoomOut: \"Zoom Out\",\n zoomDropdown: \"Zoom options\",\n zoomActualSize: \"Show actual size\",\n zoomFitToScreen: \"Fit to screen\"\n },\n panes: {\n crop: {\n title: \"Crop Image\",\n aspectRatio: \"Aspect Ratio:\",\n aspectRatioItems: {\n \"originalRatio\": \"Original ratio\",\n \"1:1\": \"1:1 (Square)\",\n \"4:5\": \"4:5 (8:10)\",\n \"5:7\": \"5:7\",\n \"2:3\": \"2:3 (4:6)\",\n \"16:9\": \"16:9\"\n },\n orientation: \"Orientation:\",\n portrait: \"Portrait\",\n landscape: \"Landscape\"\n },\n resize: {\n title: \"Resize image\",\n pixels: \"Pixels\",\n percents: \"Percents\"\n }\n },\n common: {\n width: \"Width:\",\n height: \"Height:\",\n cancel: \"Cancel\",\n confirm: \"Confirm\",\n lockAspectRatio: \"Lock aspect ratio\"\n }\n }\n },\n\n events: [\n ERROR,\n IMAGELOADED,\n IMAGERENDERED,\n EXECUTE\n ],\n\n defaultTools: {\n open: { type: \"button\", icon: \"upload\", name: \"open\", command: \"OpenImageEditorCommand\", showText: \"overflow\" },\n save: { type: \"button\", icon: \"download\", name: \"save\", command: \"SaveImageEditorCommand\", showText: \"overflow\", toggleCondition: \"canExport\" },\n separator: { type: \"separator\" },\n undo: { type: \"button\", icon: \"undo\", name: \"undo\", command: \"UndoImageEditorCommand\", showText: \"overflow\", toggleCondition: \"undo\" },\n redo: { type: \"button\", icon: \"redo\", name: \"redo\", command: \"RedoImageEditorCommand\", showText: \"overflow\", toggleCondition: \"redo\" },\n separator1: { type: \"separator\" },\n crop: { type: \"button\", icon: \"crop\", name: \"crop\", command: \"OpenPaneImageEditorCommand\", options: \"crop\", showText: \"overflow\", toggleCondition: \"canExport\" },\n resize: { type: \"button\", icon: \"image-resize\", name: \"resize\", command: \"OpenPaneImageEditorCommand\", options: \"resize\", showText: \"overflow\", toggleCondition: \"canExport\" },\n zoomIn: { type: \"button\", icon: \"zoom-in\", name: \"zoomIn\", command: \"ZoomImageEditorCommand\", showText: \"overflow\", options: \"zoomIn\", toggleCondition: \"enable\" },\n zoomOut: { type: \"button\", icon: \"zoom-out\", name: \"zoomOut\", command: \"ZoomImageEditorCommand\", showText: \"overflow\", options: \"zoomOut\", toggleCondition: \"enable\" },\n zoomDropdown: {\n type: \"component\",\n name: \"zoomDropdown\",\n command: \"ZoomImageEditorCommand\",\n toggleCondition: \"enable\",\n overflow: \"never\",\n component: \"DropDownList\",\n componentOptions: {\n placeholder: \"Search\",\n icon: \"search\",\n dataSource: [\n { name: \"zoomActualSize\", icon: \"zoom-actual-size\", value: \"actualSize\" },\n { name: \"zoomFitToScreen\", icon: \"zoom-best-fit\", value: \"fitToScreen\" }\n ],\n dataTextField: \"text\",\n dataValueField: \"value\",\n valuePrimitive: true,\n template: ({ icon, text }) => `${kendo.ui.icon(kendo.htmlEncode(icon))} ${kendo.htmlEncode(text)}`,\n commandOn: \"change\",\n optionLabel: \"Zoom options\",\n dataBound: (e) => {\n e.sender.list.find(\".k-list-optionlabel\").hide();\n }\n }\n }\n },\n\n _wrapper: function() {\n var that = this,\n options = that.options,\n width = options.width,\n height = options.height;\n\n that.wrapper = that.element\n .addClass(imageEditorStyles.wrapper);\n\n if (width) {\n that.wrapper.width(width);\n }\n\n if (height) {\n that.wrapper.height(height);\n }\n\n that._resizeHandler = kendo.onResize(function() {\n that.resize(true);\n });\n },\n\n _renderHeader: function() {\n var that = this,\n options = that.options;\n\n that.header = $(\"
\").addClass(imageEditorStyles.header);\n that.wrapper.append(that.header);\n\n if (options.toolbar) {\n that._initToolbar();\n that.toolbar._tabIndex();\n }\n },\n\n _initToolbar: function() {\n var that = this,\n options = that.options,\n toolbarElement = $(\"
\").addClass(imageEditorStyles.toolbar),\n toolbarOptions = extend({}, options.toolbar),\n tools = toolbarOptions.items ? toolbarOptions.items : Object.keys(that.defaultTools);\n\n toolbarOptions.tools = tools;\n toolbarOptions.defaultTools = that.defaultTools;\n toolbarOptions.parentMessages = that.options.messages.toolbar;\n\n that.header.append(toolbarElement);\n that.toolbar = new kendo.ui.ToolBar(toolbarElement, toolbarOptions);\n that.options.toolbar = that.toolbar.options;\n that.toolbar.toggleTools();\n\n that.toolbar.bind(CLICK, that._toolbarClick.bind(that));\n that.toolbar.bind(TOGGLE, that._toolbarClick.bind(that));\n that.toolbar.bind(CHANGE, that._toolbarClick.bind(that));\n\n return that.toolbar;\n },\n\n _toolbarClick: function(ev) {\n var command = $(ev.target).data(\"command\"),\n options = $(ev.target).data(\"options\");\n\n options = $(ev.target).val() || options;\n\n if (!command) {\n return;\n }\n\n this.executeCommand({\n command: command,\n options: options\n });\n },\n\n _contentWrapper: function() {\n var that = this,\n contentWrapper = $(\"
\").addClass(imageEditorStyles.contentWrapper),\n canvasWrapper = $(\"
\").addClass(imageEditorStyles.canvasWrapper),\n canvasContainer = $(\"
\").addClass(imageEditorStyles.canvasContainer),\n paneWrapper = $(\"
\").addClass(imageEditorStyles.paneWrapper).hide(),\n toolbarHeight = outerHeight(that.header);\n\n that.canvasWrapper = canvasWrapper;\n that.canvasContainer = canvasContainer;\n that.paneWrapper = paneWrapper;\n\n canvasWrapper.append(canvasContainer);\n\n contentWrapper.height(outerHeight(that.wrapper) - toolbarHeight);\n\n contentWrapper.append(canvasWrapper).append(paneWrapper);\n that.wrapper.append(contentWrapper);\n },\n\n _keyHandler: function() {\n var that = this,\n prevent = false;\n\n that.wrapper.on(\"keydown\" + NS, function(ev) {\n if (ev.ctrlKey) {\n switch (ev.keyCode) {\n case 48: // ctrl+0\n that.executeCommand({ command: \"ZoomImageEditorCommand\", options: \"fitToScreen\" });\n prevent = true;\n break;\n case 189: // ctrl+-\n that.executeCommand({ command: \"ZoomImageEditorCommand\", options: \"zoomOut\" });\n prevent = true;\n break;\n case 187: // ctrl++\n that.executeCommand({ command: \"ZoomImageEditorCommand\", options: \"zoomIn\" });\n prevent = true;\n break;\n case 90: // ctrl+z\n that.executeCommand({ command: \"UndoImageEditorCommand\" });\n prevent = true;\n break;\n case 89: // ctrl+y\n that.executeCommand({ command: \"RedoImageEditorCommand\" });\n prevent = true;\n break;\n }\n\n if (prevent) {\n ev.preventDefault();\n }\n }\n });\n },\n\n _drawCanvas: function() {\n var that = this;\n var imageUrl = that.options.imageUrl;\n\n that.drawImage(imageUrl).done(function(image) {\n if (!that.trigger(IMAGELOADED, { image: image })) {\n that.drawCanvas(image);\n }\n }).fail(function(ev) {\n that.trigger(ERROR, ev);\n });\n },\n\n _initUndoRedoStack: function() {\n var that = this;\n\n that.undoStack = [];\n that.redoStack = [];\n },\n\n _toggleTools: function() {\n var that = this,\n canRedo = that.redoStack.length > 0,\n canUndo = that.undoStack.length > 0,\n hasImage = !!that._image,\n canExport = true;\n\n try {\n that._canvas.toDataURL();\n } catch (error) {\n canExport = false;\n }\n\n if (that.toolbar) {\n that.toolbar.toggleTools({\n redo: canRedo,\n undo: canUndo,\n enable: hasImage,\n canExport: canExport\n });\n }\n },\n\n drawImage: function(imageUrl) {\n var that = this,\n deferred = new $.Deferred(),\n image = new Image();\n\n image.onload = function() {\n kendo.ui.progress(that.canvasContainer, false);\n deferred.resolve(image);\n };\n\n image.onerror = function() {\n kendo.ui.progress(that.canvasContainer, false);\n deferred.reject(arguments);\n };\n\n kendo.ui.progress(that.canvasContainer, true);\n\n image.src = imageUrl;\n\n return deferred.promise();\n },\n\n drawCanvas: function(image) {\n var that = this;\n var canvas = $(kendo.template(CANVAS_TEMPLATE)(that.options.imageLabel))[0];\n var ctx = canvas.getContext('2d');\n\n if (that._canvas) {\n $(that._canvas).remove();\n }\n\n if (that._image) {\n that.undoStack.push(that._image);\n }\n\n that._canvas = canvas;\n that._ctx = ctx;\n that._image = image;\n\n canvas.width = image.width;\n canvas.height = image.height;\n\n ctx.drawImage(image, 0, 0);\n\n that.canvasContainer.append(canvas);\n\n if (image.height > that.canvasWrapper.height()) {\n that.executeCommand({ command: \"ZoomImageEditorCommand\", options: \"fitToScreen\" });\n } else {\n that.executeCommand({ command: \"ZoomImageEditorCommand\", options: that.getZoomLevel() });\n }\n\n that.trigger(IMAGERENDERED, {\n canvas: canvas,\n ctx: ctx,\n image: image\n });\n\n that._toggleTools();\n },\n\n getCanvasElement: function() {\n return this._canvas;\n },\n\n getCurrent2dContext: function() {\n return this._ctx;\n },\n\n getCurrentImage: function() {\n return this._image;\n },\n\n executeCommand: function(args) {\n var commandName = args.command,\n commandOptions = extend({ imageeditor: this }, isPlainObject(args.options) ? args.options : { value: args.options }),\n command = new ui.imageeditor.commands[commandName](commandOptions);\n\n if (!this.trigger(EXECUTE, args)) {\n this._toggleTools();\n return command.exec();\n }\n },\n\n getZoomLevel: function() {\n return this._zoomLevel || 1;\n },\n\n destroy: function() {\n var that = this;\n\n that.element.off(NS);\n\n if (that.currentPaneTool) {\n that.currentPaneTool.destroy();\n }\n\n if (that.toolbar) {\n that.toolbar.destroy();\n }\n\n if (that._upload) {\n that._upload.destroy();\n }\n\n\n Widget.fn.destroy.call(that);\n }\n });\n ui.plugin(ImageEditor);\n })(window.kendo.jQuery);\n var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}