froala-editor
Version:
The next generation Javascript WYSIWYG HTML rich text editor made by devs for devs. High performance and modern design make it easy to use for developers and loved by users.
7 lines (6 loc) • 12.1 kB
JavaScript
/*!
* froala_editor v5.0.1 (https://www.froala.com/wysiwyg-editor)
* License https://froala.com/wysiwyg-editor/terms/
* Copyright 2014-2026 Froala Labs
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(require("froala-editor")):"function"==typeof define&&define.amd?define(["froala-editor"],t):t(("undefined"!=typeof globalThis?globalThis:e||self).FroalaEditor)}(this,function(k){"use strict";Object.assign(k.POPUP_TEMPLATES,{"file.insert":"[_BUTTONS_][_UPLOAD_LAYER_][_PROGRESS_BAR_]"}),Object.assign(k.DEFAULTS,{fileUpload:!0,fileUploadURL:null,fileUploadParam:"file",fileUploadParams:{},fileUploadToS3:!1,fileUploadToAzure:!1,fileUploadMethod:"POST",fileMaxSize:10485760,fileAllowedTypes:["*"],fileInsertButtons:["fileBack","|"],fileUseSelectedText:!1}),k.PLUGINS.file=function(g){var i,f=g.$,v="https://i.froala.com/upload",d=2,u=3,c=4,h=5,m=6,a={};function U(){var e=g.popups.get("file.insert");(e=e||l()).find(".fr-layer.fr-active").removeClass("fr-active").addClass("fr-pactive"),e.find(".fr-file-progress-bar-layer").addClass("fr-active"),e.find(".fr-buttons").hide(),t(g.language.translate("Uploading"),0)}function r(e){var t=g.popups.get("file.insert");t&&(t.find(".fr-layer.fr-pactive").addClass("fr-active").removeClass("fr-pactive"),t.find(".fr-file-progress-bar-layer").removeClass("fr-active"),t.find(".fr-buttons").show(),e)&&(g.events.focus(),g.popups.hide("file.insert"))}function t(e,t){var o=g.popups.get("file.insert");o&&((o=o.find(".fr-file-progress-bar-layer")).find("h3").text(e+(t?" ".concat(t,"%"):"")),o.removeClass("fr-error"),t?(o.find("div").removeClass("fr-indeterminate"),o.find("div > span").css("width","".concat(t,"%"))):o.find("div").addClass("fr-indeterminate"))}function b(e,t,o,i){g.edit.on(),g.events.focus(!0),g.selection.restore(),g.opts.fileUseSelectedText&&g.selection.text().length&&(t=g.selection.text());var a,r='<a href="'.concat(e,'" id="fr-inserted-file" ');if(void 0!==i)for(a in i)i.hasOwnProperty(a)&&"link"!=a&&(r+="".concat(a,'="').concat(i[a],'" '));-1==r.indexOf(' class="')&&(r+='class="fr-file" '),r+=">".concat(t,"</a>"),g.html.insert(r);e=g.$el.find("#fr-inserted-file");e.removeAttr("id"),g.popups.hide("file.insert"),g.undo.saveStep(),p(),g.events.trigger("file.inserted",[e,o])}function y(e,t,o){var i,a,r=this.status,n=this.response,s=this.responseXML,l=this.responseText;try{if(g.opts.fileUploadToS3||g.opts.fileUploadToAzure)if(201===r){if(g.opts.fileUploadToAzure){if(!1===g.events.trigger("file.uploadedToAzure",[this.responseURL,o,n],!0))return g.edit.on(),!1;a=t}else a=function(e){try{var t=f(e).find("Location").text(),o=f(e).find("Key").text();return!1===g.events.trigger("file.uploadedToS3",[t,o,e],!0)?(g.edit.on(),!1):t}catch(i){return S(c,e),!1}}(s);a&&b(a,e,n||s)}else S(c,n||s);else 200<=r&&r<300?(i=function(e){try{var t;return!1===g.events.trigger("file.uploaded",[e],!0)?(g.edit.on(),!1):(t=JSON.parse(e)).link?t:(S(d,e),!1)}catch(o){return S(c,e),!1}}(l))&&b(i.link,e,n||l,i):S(u,n||l)}catch(p){S(c,n||l)}}function T(){S(c,this.response||this.responseText||this.responseXML)}function A(e){e.lengthComputable&&(e=e.loaded/e.total*100|0,t(g.language.translate("Uploading"),e))}function S(e,t){var o,i;g.edit.on(),o=g.language.translate("Something went wrong. Please try again."),U(),(i=g.popups.get("file.insert").find(".fr-file-progress-bar-layer")).addClass("fr-error"),(i=i.find("h3")).text(o),g.events.disableBlur(),i.focus(),g.events.trigger("file.error",[{code:e,message:a[e]},t])}function P(){g.edit.on(),r(!0)}function n(e){if(void 0!==e&&0<e.length){var t=e[0].type;if(e[0].name&&e[0].name.endsWith(".msg")&&(t="application/vnd.ms-outlook"),!1===g.events.trigger("file.beforeUpload",[e]))return!1;var o,i,a=e[0];if(!(null!==g.opts.fileUploadURL&&g.opts.fileUploadURL!==v||g.opts.fileUploadToS3||g.opts.fileUploadToAzure))return u=a,(c=new FileReader).onload=function(){c.result;for(var e=atob(c.result.split(",")[1]),t=[],o=0;o<e.length;o++)t.push(e.charCodeAt(o));var i=u.type;u.name&&u.name.endsWith(".msg")&&(i="application/vnd.ms-outlook"),i=window.URL.createObjectURL(new Blob([new Uint8Array(t)],{type:i})),g.file.insert(i,u.name,null)},U(),c.readAsDataURL(u),!1;if(a.size>g.opts.fileMaxSize)return S(h),!1;if(g.opts.fileAllowedTypes.indexOf("*")<0&&g.opts.fileAllowedTypes.indexOf(t.replace(/file\//g,""))<0)return S(m),!1;if(o=g.drag_support.formdata?g.drag_support.formdata?new FormData:null:o){if(!1!==g.opts.fileUploadToS3)for(i in o.append("key",g.opts.fileUploadToS3.keyStart+(new Date).getTime()+"-"+(a.name||"untitled")),o.append("success_action_status","201"),o.append("X-Requested-With","xhr"),o.append("Content-Type",t),g.opts.fileUploadToS3.params)g.opts.fileUploadToS3.params.hasOwnProperty(i)&&o.append(i,g.opts.fileUploadToS3.params[i]);for(i in g.opts.fileUploadParams)g.opts.fileUploadParams.hasOwnProperty(i)&&o.append(i,g.opts.fileUploadParams[i]);o.append(g.opts.fileUploadParam,a);var r,e=g.opts.fileUploadURL,n=(g.opts.fileUploadToS3&&(e=g.opts.fileUploadToS3.uploadURL||"https://".concat(g.opts.fileUploadToS3.region,".amazonaws.com/").concat(g.opts.fileUploadToS3.bucket)),g.opts.fileUploadMethod),s=(g.opts.fileUploadToAzure&&(e=g.opts.fileUploadToAzure.uploadURL?"".concat(g.opts.fileUploadToAzure.uploadURL,"/").concat(a.name):encodeURI("https://".concat(g.opts.fileUploadToAzure.account,".blob.core.windows.net/").concat(g.opts.fileUploadToAzure.container,"/").concat(a.name)),r=e,g.opts.fileUploadToAzure.SASToken&&(e+=g.opts.fileUploadToAzure.SASToken),n="PUT"),g.core.getXHR(e,n));if(g.opts.fileUploadToAzure){var l,p,f,e=(new Date).toUTCString();for(i in!g.opts.fileUploadToAzure.SASToken&&g.opts.fileUploadToAzure.accessKey&&(l=g.opts.fileUploadToAzure.account,d=g.opts.fileUploadToAzure.container,g.opts.fileUploadToAzure.uploadURL&&(d=(p=g.opts.fileUploadToAzure.uploadURL.split("/")).pop(),l=p.pop().split(".")[0]),p="x-ms-blob-type:BlockBlob\nx-ms-date:".concat(e,"\nx-ms-version:2019-07-07"),d=encodeURI("/"+l+"/"+d+"/"+a.name),n=n+"\n\n\n"+a.size+"\n\n"+t+"\n\n\n\n\n\n\n"+p+"\n"+d,p=g.cryptoJSPlugin.cryptoJS.HmacSHA256(n,g.cryptoJSPlugin.cryptoJS.enc.Base64.parse(g.opts.fileUploadToAzure.accessKey)).toString(g.cryptoJSPlugin.cryptoJS.enc.Base64),f=p,s.setRequestHeader("Authorization","SharedKey "+l+":"+p)),s.setRequestHeader("x-ms-version","2019-07-07"),s.setRequestHeader("x-ms-date",e),s.setRequestHeader("Content-Type",t),s.setRequestHeader("x-ms-blob-type","BlockBlob"),g.opts.fileUploadParams)g.opts.fileUploadParams.hasOwnProperty(i)&&s.setRequestHeader(i,g.opts.fileUploadParams[i]);for(i in g.opts.fileUploadToAzure.params)g.opts.fileUploadToAzure.params.hasOwnProperty(i)&&s.setRequestHeader(i,g.opts.fileUploadToAzure.params[i])}s.onload=function(){y.call(s,a.name,r,f)},s.onerror=T,s.upload.onprogress=A,s.onabort=P,U();var d=g.popups.get("file.insert");d&&(d.off("abortUpload"),d.on("abortUpload",function(){4!==s.readyState&&s.abort()})),s.send(g.opts.fileUploadToAzure?a:o)}}var u,c}function s(){r()}function l(e){var t,o;return e?(g.popups.onHide("file.insert",s),!0):(e="",g.opts.fileUpload||g.opts.fileInsertButtons.splice(g.opts.fileInsertButtons.indexOf("fileUpload"),1),e='<div class="fr-buttons fr-tabs">'.concat(g.button.buildList(g.opts.fileInsertButtons),"</div>"),t="",g.opts.fileUpload&&(t='<div class="fr-file-upload-layer fr-layer fr-active" id="fr-file-upload-layer-'.concat(g.id,'"><strong>').concat(g.language.translate("Drop file"),"</strong><br>(").concat(g.language.translate("or click"),')<div class="fr-form"><input type="file" name="').concat(g.opts.fileUploadParam,'" accept="').concat(0<=g.opts.fileAllowedTypes.indexOf("*")?"/":"").concat(g.opts.fileAllowedTypes.join(", ").toLowerCase(),'" tabIndex="-1" aria-labelledby="fr-file-upload-layer-').concat(g.id,'" role="button"></div></div>')),e=g.popups.create("file.insert",{buttons:e,upload_layer:t,progress_bar:'<div class="fr-file-progress-bar-layer fr-layer"><h3 tabIndex="-1" class="fr-message">Uploading</h3><div class="fr-loader"><span class="fr-progress"></span></div><div class="fr-action-buttons"><button type="button" class="fr-command fr-dismiss" data-cmd="fileDismissError" tabIndex="2" role="button">OK</button></div></div>'}),o=e,g.events.$on(o,"dragover dragenter",".fr-file-upload-layer",function(){return f(this).addClass("fr-drop"),!1},!0),g.events.$on(o,"dragleave dragend",".fr-file-upload-layer",function(){return f(this).removeClass("fr-drop"),!1},!0),g.events.$on(o,"drop",".fr-file-upload-layer",function(e){e.preventDefault(),e.stopPropagation(),f(this).removeClass("fr-drop");e=e.originalEvent.dataTransfer;e&&e.files&&(o.data("instance")||g).file.upload(e.files)},!0),g.helpers.isIOS()&&g.events.$on(o,"touchstart",'.fr-file-upload-layer input[type="file"]',function(){f(this).trigger("click")}),g.events.$on(o,"change",'.fr-file-upload-layer input[type="file"]',function(){var e;this.files&&((e=o.data("instance")||g).events.disableBlur(),o.find("input:focus").blur(),e.events.enableBlur(),e.file.upload(this.files)),f(this).val("")},!0),e)}function e(e){g.node.hasClass(e,"fr-file")}function o(e){var t=e.originalEvent.dataTransfer;if(t&&t.files&&t.files.length){var o=t.files[0];if(o&&"undefined"!=typeof o.type){if(o.type.indexOf("image")<0)return g.opts.fileUpload?(g.markers.remove(),g.markers.insertAtPoint(e.originalEvent),g.$el.find(".fr-marker").replaceWith(k.MARKERS),g.popups.hideAll(),g.popups.get("file.insert")||l(),g.popups.setContainer("file.insert",g.$sc),g.popups.show("file.insert",e.originalEvent.pageX,e.originalEvent.pageY),U(),n(t.files),e.preventDefault(),e.stopPropagation()):(e.preventDefault(),e.stopPropagation()),!1}else o.type.indexOf("image")<0&&(e.preventDefault(),e.stopPropagation())}}function p(){for(var e=Array.prototype.slice.call(g.el.querySelectorAll("a.fr-file")),t=[],o=0;o<e.length;o++)t.push(e[o].getAttribute("href"));if(i)for(o=0;o<i.length;o++)t.indexOf(i[o].getAttribute("href"))<0&&g.events.trigger("file.unlink",[i[o]]);i=e}return a[1]="File cannot be loaded from the passed link.",a[d]="No link in upload response.",a[u]="Error during file upload.",a[c]="Parsing response failed.",a[h]="File is too large.",a[m]="File file type is invalid.",a[7]="Files can be uploaded only to same domain in IE 8 and IE 9.",{_init:function(){g.events.on("drop",o),g.events.$on(g.$win,"keydown",function(e){var e=e.which,t=g.popups.get("file.insert");t&&e===k.KEYCODE.ESC&&t.trigger("abortUpload")}),g.events.on("destroy",function(){var e=g.popups.get("file.insert");e&&e.trigger("abortUpload")}),g.events.on("link.beforeRemove",e),g.$wp&&(p(),g.events.on("contentChanged",p)),l(!0)},showInsertPopup:function(){var e,t,o=g.$tb.find('.fr-command[data-cmd="insertFile"]'),i=(i=g.popups.get("file.insert"))||l();r(),i.hasClass("fr-active")||(g.popups.refresh("file.insert"),g.popups.setContainer("file.insert",g.$tb),o.isVisible?(t=(e=g.button.getPosition(o)).left,g.popups.show("file.insert",t,e.top,o.outerHeight())):(g.position.forSelection(i),g.popups.show("file.insert")))},upload:n,insert:b,back:function(){g.events.disableBlur(),g.selection.restore(),g.events.enableBlur(),g.popups.hide("file.insert"),g.toolbar.showInline()},hideProgressBar:r}},k.DefineIcon("insertFile",{NAME:"file-o",FA5NAME:"file",SVG_KEY:"insertFile"}),k.RegisterCommand("insertFile",{title:"Upload File",undo:!1,focus:!0,refreshAfterCallback:!1,popup:!0,callback:function(){this.popups.isVisible("file.insert")?(this.$el.find(".fr-marker").length&&(this.events.disableBlur(),this.selection.restore()),this.popups.hide("file.insert")):this.file.showInsertPopup()},plugin:"file"}),k.DefineIcon("fileBack",{NAME:"arrow-left",SVG_KEY:"back"}),k.RegisterCommand("fileBack",{title:"Back",undo:!1,focus:!1,back:!0,refreshAfterCallback:!1,callback:function(){this.file.back()},refresh:function(e){this.opts.toolbarInline?(e.removeClass("fr-hidden"),e.next(".fr-separator").removeClass("fr-hidden")):(e.addClass("fr-hidden"),e.next(".fr-separator").addClass("fr-hidden"))}}),k.RegisterCommand("fileDismissError",{title:"OK",callback:function(){this.file.hideProgressBar(!0)}})});