UNPKG

froala-editor

Version:

A beautiful 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) 10.1 kB
/*! * froala_editor v2.9.8 (https://www.froala.com/wysiwyg-editor) * License https://froala.com/wysiwyg-editor/terms/ * Copyright 2014-2020 Froala Labs */ !function(i){"function"==typeof define&&define.amd?define(["jquery"],i):"object"==typeof module&&module.exports?module.exports=function(e,t){return t===undefined&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),i(t)}:i(window.jQuery)}(function(C){C.extend(C.FE.POPUP_TEMPLATES,{"file.insert":"[_BUTTONS_][_UPLOAD_LAYER_][_PROGRESS_BAR_]"}),C.extend(C.FE.DEFAULTS,{fileUpload:!0,fileUploadURL:null,fileUploadParam:"file",fileUploadParams:{},fileUploadToS3:!1,fileUploadMethod:"POST",fileMaxSize:10485760,fileAllowedTypes:["*"],fileInsertButtons:["fileBack","|"],fileUseSelectedText:!1}),C.FE.PLUGINS.file=function(d){var r,u="https://i.froala.com/upload",l=2,f=3,p=4,c=5,v=6,i={};function g(){var e=d.popups.get("file.insert");e||(e=w()),e.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(),o(d.language.translate("Uploading"),0)}function n(e){var t=d.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&&(d.events.focus(),d.popups.hide("file.insert")))}function o(e,t){var i=d.popups.get("file.insert");if(i){var r=i.find(".fr-file-progress-bar-layer");r.find("h3").text(e+(t?" "+t+"%":"")),r.removeClass("fr-error"),t?(r.find("div").removeClass("fr-indeterminate"),r.find("div > span").css("width",t+"%")):r.find("div").addClass("fr-indeterminate")}}function h(e,t,i){d.edit.on(),d.events.focus(!0),d.selection.restore(),d.opts.fileUseSelectedText&&d.selection.text().length&&(t=d.selection.text()),d.html.insert('<a href="'+e+'" target="_blank" id="fr-inserted-file" class="fr-file">'+t+"</a>");var r=d.$el.find("#fr-inserted-file");r.removeAttr("id"),d.popups.hide("file.insert"),d.undo.saveStep(),T(),d.events.trigger("file.inserted",[r,i])}function m(e){var t=this.status,i=this.response,r=this.responseXML,n=this.responseText;try{if(d.opts.fileUploadToS3)if(201==t){var o=function(e){try{var t=C(e).find("Location").text(),i=C(e).find("Key").text();return!1===d.events.trigger("file.uploadedToS3",[t,i,e],!0)?(d.edit.on(),!1):t}catch(r){return U(p,e),!1}}(r);o&&h(o,e,i||r)}else U(p,i||r);else if(200<=t&&t<300){var a=function(e){try{if(!1===d.events.trigger("file.uploaded",[e],!0))return d.edit.on(),!1;var t=JSON.parse(e);return t.link?t:(U(l,e),!1)}catch(i){return U(p,e),!1}}(n);a&&h(a.link,e,i||n)}else U(f,i||n)}catch(s){U(p,i||n)}}function b(){U(p,this.response||this.responseText||this.responseXML)}function y(e){if(e.lengthComputable){var t=e.loaded/e.total*100|0;o(d.language.translate("Uploading"),t)}}function U(e,t){d.edit.on(),function(e){g();var t=d.popups.get("file.insert").find(".fr-file-progress-bar-layer");t.addClass("fr-error");var i=t.find("h3");i.text(e),d.events.disableBlur(),i.focus()}(d.language.translate("Something went wrong. Please try again.")),d.events.trigger("file.error",[{code:e,message:i[e]},t])}function S(){d.edit.on(),n(!0)}function a(e){if(void 0!==e&&0<e.length){if(!1===d.events.trigger("file.beforeUpload",[e]))return!1;var t,i=e[0],r=i.name.slice(i.name.lastIndexOf(".")),n=d.opts.fileAllowedTypes;if(n.indexOf("*")<0&&n.indexOf(r)<0&&n.indexOf(i.type.replace(/file\//g,""))<0)return U(v),!1;if((null===d.opts.fileUploadURL||d.opts.fileUploadURL==u)&&!d.opts.fileUploadToS3)return f=i,(p=new FileReader).onload=function(){for(var e=p.result,t=atob(p.result.split(",")[1]),i=[],r=0;r<t.length;r++)i.push(t.charCodeAt(r));e=window.URL.createObjectURL(new Blob([new Uint8Array(i)],{type:f.type})),d.file.insert(e,f.name,null)},g(),p.readAsDataURL(f),!1;if(i.size>d.opts.fileMaxSize)return U(c),!1;if(d.drag_support.formdata&&(t=d.drag_support.formdata?new FormData:null),t){var o;if(!1!==d.opts.fileUploadToS3)for(o in t.append("key",d.opts.fileUploadToS3.keyStart+(new Date).getTime()+"-"+(i.name||"untitled")),t.append("success_action_status","201"),t.append("X-Requested-With","xhr"),t.append("Content-Type",i.type),d.opts.fileUploadToS3.params)d.opts.fileUploadToS3.params.hasOwnProperty(o)&&t.append(o,d.opts.fileUploadToS3.params[o]);for(o in d.opts.fileUploadParams)d.opts.fileUploadParams.hasOwnProperty(o)&&t.append(o,d.opts.fileUploadParams[o]);t.append(d.opts.fileUploadParam,i);var a=d.opts.fileUploadURL;d.opts.fileUploadToS3&&(a=d.opts.fileUploadToS3.uploadURL?d.opts.fileUploadToS3.uploadURL:"https://"+d.opts.fileUploadToS3.region+".amazonaws.com/"+d.opts.fileUploadToS3.bucket);var s=d.core.getXHR(a,d.opts.fileUploadMethod);s.onload=function(){m.call(s,i.name)},s.onerror=b,s.upload.onprogress=y,s.onabort=S,g();var l=d.popups.get("file.insert");l&&l.off("abortUpload").on("abortUpload",function(){4!=s.readyState&&s.abort()}),s.send(t)}}var f,p}function s(){n()}function w(e){if(e)return d.popups.onHide("file.insert",s),!0;var t;d.opts.fileUpload||d.opts.fileInsertButtons.splice(d.opts.fileInsertButtons.indexOf("fileUpload"),1),t='<div class="fr-buttons">'+d.button.buildList(d.opts.fileInsertButtons)+"</div>";var i="";d.opts.fileUpload&&(i='<div class="fr-file-upload-layer fr-layer fr-active" id="fr-file-upload-layer-'+d.id+'"><strong>'+d.language.translate("Drop file")+"</strong><br>("+d.language.translate("or click")+')<div class="fr-form"><input type="file" name="'+d.opts.fileUploadParam+'" accept="'+(0<=d.opts.fileAllowedTypes.indexOf("*")?"/":"")+d.opts.fileAllowedTypes.join(", ").toLowerCase()+'" tabIndex="-1" aria-labelledby="fr-file-upload-layer-'+d.id+'" role="button"></div></div>');var r,n={buttons:t,upload_layer:i,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=d.popups.create("file.insert",n);return r=o,d.events.$on(r,"dragover dragenter",".fr-file-upload-layer",function(){return C(this).addClass("fr-drop"),!1},!0),d.events.$on(r,"dragleave dragend",".fr-file-upload-layer",function(){return C(this).removeClass("fr-drop"),!1},!0),d.events.$on(r,"drop",".fr-file-upload-layer",function(e){e.preventDefault(),e.stopPropagation(),C(this).removeClass("fr-drop");var t=e.originalEvent.dataTransfer;t&&t.files&&(r.data("instance")||d).file.upload(t.files)},!0),d.helpers.isIOS()&&d.events.$on(r,"touchstart",'.fr-file-upload-layer input[type="file"]',function(){C(this).trigger("click")}),d.events.$on(r,"change",'.fr-file-upload-layer input[type="file"]',function(){if(this.files){var e=r.data("instance")||d;e.events.disableBlur(),r.find("input:focus").blur(),e.events.enableBlur(),e.file.upload(this.files)}C(this).val("")},!0),o}function e(e){d.node.hasClass(e,"fr-file")}function t(e){var t=e.originalEvent.dataTransfer;if(t&&t.files&&t.files.length){var i=t.files[0];if(i&&"undefined"!=typeof i.type){if(i.type.indexOf("image")<0||-1<i.type.indexOf("svg")){if(!d.opts.fileUpload)return e.preventDefault(),e.stopPropagation(),!1;d.markers.remove(),d.markers.insertAtPoint(e.originalEvent),d.$el.find(".fr-marker").replaceWith(C.FE.MARKERS),d.popups.hideAll();var r=d.popups.get("file.insert");return r||(r=w()),d.popups.setContainer("file.insert",d.$sc),d.popups.show("file.insert",e.originalEvent.pageX,e.originalEvent.pageY),g(),a(t.files),e.preventDefault(),e.stopPropagation(),!1}}else i.type.indexOf("image")<0&&(e.preventDefault(),e.stopPropagation())}}function T(){var e,t=Array.prototype.slice.call(d.el.querySelectorAll("a.fr-file")),i=[];for(e=0;e<t.length;e++)i.push(t[e].getAttribute("href"));if(r)for(e=0;e<r.length;e++)i.indexOf(r[e].getAttribute("href"))<0&&d.events.trigger("file.unlink",[r[e]]);r=t}return i[1]="File cannot be loaded from the passed link.",i[l]="No link in upload response.",i[f]="Error during file upload.",i[p]="Parsing response failed.",i[c]="File is too large.",i[v]="File file type is invalid.",i[7]="Files can be uploaded only to same domain in IE 8 and IE 9.",{_init:function(){d.events.on("drop",t),d.events.$on(d.$win,"keydown",function(e){var t=e.which,i=d.popups.get("file.insert");i&&t==C.FE.KEYCODE.ESC&&i.trigger("abortUpload")}),d.events.on("destroy",function(){var e=d.popups.get("file.insert");e&&e.trigger("abortUpload")}),d.events.on("link.beforeRemove",e),d.$wp&&(T(),d.events.on("contentChanged",T)),w(!0)},showInsertPopup:function(){var e=d.$tb.find('.fr-command[data-cmd="insertFile"]'),t=d.popups.get("file.insert");if(t||(t=w()),n(),!t.hasClass("fr-active"))if(d.popups.refresh("file.insert"),d.popups.setContainer("file.insert",d.$tb),e.is(":visible")){var i=e.offset().left+e.outerWidth()/2,r=d.position.getTbarPupupTop("file.insert",e);d.popups.show("file.insert",i,r,e.outerHeight())}else d.position.forSelection(t),d.popups.show("file.insert")},upload:a,insert:h,back:function(){d.events.disableBlur(),d.selection.restore(),d.events.enableBlur(),d.popups.hide("file.insert"),d.toolbar.showInline()},hideProgressBar:n}},C.FE.DefineIcon("insertFile",{NAME:"file-o",FA5NAME:"file"}),C.FE.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"}),C.FE.DefineIcon("fileBack",{NAME:"arrow-left"}),C.FE.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"))}}),C.FE.RegisterCommand("fileDismissError",{title:"OK",callback:function(){this.file.hideProgressBar(!0)}})});