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) • 6.39 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(m){"use strict";Object.assign(m.DEFAULTS,{dragInline:!0}),m.PLUGINS.draggable=function(f){var g=f.$;function e(e){return!(!e.originalEvent||!e.originalEvent.target||e.originalEvent.target.nodeType!==Node.TEXT_NODE)||(e.target&&"A"===e.target.tagName&&1===e.target.childNodes.length&&"IMG"===e.target.childNodes[0].tagName&&(e.target=e.target.childNodes[0]),g(e.target).hasClass("fr-draggable")?(f.undo.canDo()||f.undo.saveStep(),f.opts.dragInline?f.$el.attr("contenteditable",!0):f.$el.attr("contenteditable",!1),f.opts.toolbarInline&&f.toolbar.hide(),g(e.target).addClass("fr-dragging"),f.browser.msie||f.browser.edge||f.selection.clear(),void e.originalEvent.dataTransfer.setData("text","Froala")):(e.preventDefault(),!1))}var d,p=function p(e){return!(e&&("HTML"===e.tagName||"BODY"===e.tagName||f.node.isElement(e)))};function v(e,t,n){var r,a;f.opts.iframe&&(r=f.helpers.getPX(f.$wp.find(".fr-iframe").css("padding-top")),a=f.helpers.getPX(f.$wp.find(".fr-iframe").css("padding-left")),e+=f.$iframe.offset().top+r,t+=f.$iframe.offset().left+a),d.offset().top!==e&&d.css("top",e),d.offset().left!==t&&d.css("left",t),d.width()!==n&&d.css("width",n)}function t(e){if(e.originalEvent.dataTransfer.dropEffect="move",f.opts.dragInline)(!function(){for(var e=null,t=0;t<m.INSTANCES.length;t++)if((e=m.INSTANCES[t].$el.find(".fr-dragging")).length)return e.get(0)}()||f.browser.msie||f.browser.edge)&&e.preventDefault();else{e.preventDefault();var t,n,r=e,a=f.doc.elementFromPoint(r.originalEvent.pageX-f.win.pageXOffset,r.originalEvent.pageY-f.win.pageYOffset);if(!p(a)){for(var o=0,i=a;!p(i)&&i===a&&0<r.originalEvent.pageY-f.win.pageYOffset-o;)i=f.doc.elementFromPoint(r.originalEvent.pageX-f.win.pageXOffset,r.originalEvent.pageY-f.win.pageYOffset-++o);(!p(i)||d&&0===f.$el.find(i).length&&i!==d.get(0))&&(i=null);for(var l=0,s=a;!p(s)&&s===a&&r.originalEvent.pageY-f.win.pageYOffset+l<g(f.doc).height();)s=f.doc.elementFromPoint(r.originalEvent.pageX-f.win.pageXOffset,r.originalEvent.pageY-f.win.pageYOffset+ ++l);a=null===(s=!p(s)||d&&0===f.$el.find(s).length&&s!==d.get(0)?null:s)&&i?i:s&&null===i?s:s&&i?o<l?i:s:null}g(a).hasClass("fr-drag-helper")||((a=(a=(a=a&&!f.node.isBlock(a)?f.node.blockParent(a):a)&&0<=["TD","TH","TR","THEAD","TBODY"].indexOf(a.tagName)?g(a).parents("table").get(0):a)&&0<=["LI"].indexOf(a.tagName)?g(a).parents("UL, OL").get(0):a)&&!g(a).hasClass("fr-drag-helper")?(d||(m.$draggable_helper||(m.$draggable_helper=g(document.createElement("div")).attr("class","fr-drag-helper")),d=m.$draggable_helper,f.events.on("shared.destroy",function(){d.html("").removeData().remove(),d=null},!0)),e=r.originalEvent.pageY<g(a).offset().top+g(a).outerHeight()/2,t=g(a),n=0,e||0!==t.next().length?(e||(t=t.next()),"before"===d.data("fr-position")&&t.is(d.data("fr-tag"))||(0<t.prev().length&&(n=parseFloat(t.prev().css("margin-bottom"))||0),n=Math.max(n,parseFloat(t.css("margin-top"))||0),v(t.offset().top-n/2-f.$box.offset().top,t.offset().left-f.win.pageXOffset-f.$box.offset().left,t.width()),d.data("fr-position","before"))):"after"===d.data("fr-position")&&t.is(d.data("fr-tag"))||(n=parseFloat(t.css("margin-bottom"))||0,v(t.offset().top+g(a).height()+n/2-f.$box.offset().top,t.offset().left-f.win.pageXOffset-f.$box.offset().left,t.width()),d.data("fr-position","after")),d.data("fr-tag",t),d.addClass("fr-visible"),f.$box.append(d)):d&&0<f.$box.find(d).length&&d.removeClass("fr-visible"))}}function n(e){e.originalEvent.dataTransfer.dropEffect="move",f.opts.dragInline||e.preventDefault()}function r(e){f.$el.attr("contenteditable",!0);var t=f.$el.find(".fr-dragging");d&&d.hasClass("fr-visible")&&f.$box.find(d).length?a(e):t.length&&(e.preventDefault(),e.stopPropagation()),d&&f.$box.find(d).length&&d.removeClass("fr-visible"),t.removeClass("fr-dragging")}function a(e){var t,n;f.$el.attr("contenteditable",!0);for(var r,a=0;a<m.INSTANCES.length;a++)if((t=m.INSTANCES[a].$el.find(".fr-dragging")).length){n=m.INSTANCES[a];break}if(t.length){if(e.preventDefault(),e.stopPropagation(),d&&d.hasClass("fr-visible")&&f.$box.find(d).length)d.data("fr-tag")[d.data("fr-position")]('<span class="fr-marker"></span>'),d.removeClass("fr-visible");else if(!1===f.markers.insertAtPoint(e.originalEvent))return!1;return t.removeClass("fr-dragging"),!1!==(t=f.events.chainTrigger("element.beforeDrop",t))&&((e=t).parent().is("A")&&1===t.parent().get(0).childNodes.length&&(e=t.parent()),f.core.isEmpty()?f.events.focus():(f.$el.find(".fr-marker").replaceWith(m.MARKERS),f.selection.restore()),n===f||f.undo.canDo()||f.undo.saveStep(),f.core.isEmpty()?f.$el.html(e):(r=f.markers.insert(),(f||"").selection&&e.contains(r)&&e.before(r),0===e.find(r).length?g(r).replaceWith(e):0===t.find(r).length&&g(r).replaceWith(t),t.after(m.MARKERS),f.selection.restore()),f.popups.hideAll(),f.selection.save(),f.$el.find(f.html.emptyBlockTagsQuery()).not("TD, TH, LI, .fr-inner").not(f.opts.htmlAllowedEmptyTags.join(",")).remove(),f.html.wrap(),f.html.fillEmptyBlocks(),f.selection.restore(),f.undo.saveStep(),f.opts.iframe&&f.size.syncIframe(),n!==f&&(n.popups.hideAll(),n.$el.find(n.html.emptyBlockTagsQuery()).not("TD, TH, LI, .fr-inner").remove(),n.html.wrap(),n.html.fillEmptyBlocks(),n.undo.saveStep(),n.events.trigger("element.dropped"),n.opts.iframe)&&n.size.syncIframe(),f.events.trigger("element.dropped",[e])),!1}d&&d.removeClass("fr-visible"),f.undo.canDo()||f.undo.saveStep(),setTimeout(function(){f.undo.saveStep()},0)}function o(e){if(e&&"DIV"===e.tagName&&f.node.hasClass(e,"fr-drag-helper"))e.parentNode.removeChild(e);else if(e&&e.nodeType===Node.ELEMENT_NODE)for(var t=e.querySelectorAll("div.fr-drag-helper"),n=0;n<t.length;n++)t[n].parentNode.removeChild(t[n])}return{_init:function(){f.opts.enter===m.ENTER_BR&&(f.opts.dragInline=!0),f.events.on("dragstart",e,!0),f.events.on("dragover",t,!0),f.events.on("dragenter",n,!0),f.events.on("document.dragend",r,!0),f.events.on("document.drop",r,!0),f.events.on("drop",a,!0),f.events.on("html.processGet",o)}}}});