resizing.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /**
  2. * DevExtreme (ui/html_editor/modules/resizing.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. Object.defineProperty(exports, "__esModule", {
  11. value: true
  12. });
  13. var _renderer = require("../../../core/renderer");
  14. var _renderer2 = _interopRequireDefault(_renderer);
  15. var _events_engine = require("../../../events/core/events_engine");
  16. var _events_engine2 = _interopRequireDefault(_events_engine);
  17. var _click = require("../../../events/click");
  18. var _utils = require("../../../events/utils");
  19. var _translator = require("../../../animation/translator");
  20. var _devices = require("../../../core/devices");
  21. var _devices2 = _interopRequireDefault(_devices);
  22. var _resizable = require("../../resizable");
  23. var _resizable2 = _interopRequireDefault(_resizable);
  24. var _quill = require("quill");
  25. var _quill2 = _interopRequireDefault(_quill);
  26. function _interopRequireDefault(obj) {
  27. return obj && obj.__esModule ? obj : {
  28. "default": obj
  29. }
  30. }
  31. function _classCallCheck(instance, Constructor) {
  32. if (!(instance instanceof Constructor)) {
  33. throw new TypeError("Cannot call a class as a function")
  34. }
  35. }
  36. function _defineProperties(target, props) {
  37. for (var i = 0; i < props.length; i++) {
  38. var descriptor = props[i];
  39. descriptor.enumerable = descriptor.enumerable || false;
  40. descriptor.configurable = true;
  41. if ("value" in descriptor) {
  42. descriptor.writable = true
  43. }
  44. Object.defineProperty(target, descriptor.key, descriptor)
  45. }
  46. }
  47. function _createClass(Constructor, protoProps, staticProps) {
  48. if (protoProps) {
  49. _defineProperties(Constructor.prototype, protoProps)
  50. }
  51. if (staticProps) {
  52. _defineProperties(Constructor, staticProps)
  53. }
  54. Object.defineProperty(Constructor, "prototype", {
  55. writable: false
  56. });
  57. return Constructor
  58. }
  59. var DX_RESIZE_FRAME_CLASS = "dx-resize-frame";
  60. var DX_TOUCH_DEVICE_CLASS = "dx-touch-device";
  61. var MODULE_NAMESPACE = "dxHtmlResizingModule";
  62. var KEYDOWN_EVENT = (0, _utils.addNamespace)("keydown", MODULE_NAMESPACE);
  63. var SCROLL_EVENT = (0, _utils.addNamespace)("scroll", MODULE_NAMESPACE);
  64. var FRAME_PADDING = 1;
  65. var ResizingModule = function() {
  66. function ResizingModule(quill, options) {
  67. _classCallCheck(this, ResizingModule);
  68. this.quill = quill;
  69. this.editorInstance = options.editorInstance;
  70. this.allowedTargets = options.allowedTargets || ["image"];
  71. this.enabled = !!options.enabled;
  72. if (this.enabled) {
  73. this._attachEvents();
  74. this._createResizeFrame()
  75. }
  76. }
  77. _createClass(ResizingModule, [{
  78. key: "_attachEvents",
  79. value: function() {
  80. _events_engine2.default.on(this.quill.root, (0, _utils.addNamespace)(_click.name, MODULE_NAMESPACE), this._clickHandler.bind(this));
  81. _events_engine2.default.on(this.quill.root, SCROLL_EVENT, this._scrollHandler.bind(this))
  82. }
  83. }, {
  84. key: "_detachEvents",
  85. value: function() {
  86. _events_engine2.default.off(this.quill.root, MODULE_NAMESPACE)
  87. }
  88. }, {
  89. key: "_clickHandler",
  90. value: function(e) {
  91. if (this._isAllowedTarget(e.target)) {
  92. if (this._$target === e.target) {
  93. return
  94. }
  95. this._$target = e.target;
  96. this.updateFramePosition();
  97. this.showFrame()
  98. } else {
  99. if (this._$target) {
  100. this.hideFrame()
  101. }
  102. }
  103. }
  104. }, {
  105. key: "_scrollHandler",
  106. value: function(e) {
  107. if (this._$target) {
  108. this.updateFramePosition()
  109. }
  110. }
  111. }, {
  112. key: "_isAllowedTarget",
  113. value: function(targetElement) {
  114. return this._isImage(targetElement)
  115. }
  116. }, {
  117. key: "_isImage",
  118. value: function(targetElement) {
  119. return this.allowedTargets.indexOf("image") !== -1 && "IMG" === targetElement.tagName.toUpperCase()
  120. }
  121. }, {
  122. key: "showFrame",
  123. value: function() {
  124. this._$resizeFrame.show();
  125. _events_engine2.default.on(this.quill.root, KEYDOWN_EVENT, this._handleFrameKeyDown.bind(this))
  126. }
  127. }, {
  128. key: "_handleFrameKeyDown",
  129. value: function(e) {
  130. var keyName = (0, _utils.normalizeKeyName)(e);
  131. if ("del" === keyName || "backspace" === keyName) {
  132. this._deleteImage()
  133. }
  134. this.hideFrame()
  135. }
  136. }, {
  137. key: "hideFrame",
  138. value: function() {
  139. this._$target = null;
  140. this._$resizeFrame.hide();
  141. _events_engine2.default.off(this.quill.root, KEYDOWN_EVENT)
  142. }
  143. }, {
  144. key: "updateFramePosition",
  145. value: function() {
  146. var _this$_$target$getBou = this._$target.getBoundingClientRect(),
  147. height = _this$_$target$getBou.height,
  148. width = _this$_$target$getBou.width,
  149. targetTop = _this$_$target$getBou.top,
  150. targetLeft = _this$_$target$getBou.left;
  151. var _this$quill$root$getB = this.quill.root.getBoundingClientRect(),
  152. containerTop = _this$quill$root$getB.top,
  153. containerLeft = _this$quill$root$getB.left;
  154. var borderWidth = this._getBorderWidth();
  155. this._$resizeFrame.css({
  156. height: height,
  157. width: width,
  158. padding: FRAME_PADDING,
  159. top: targetTop - containerTop - borderWidth - FRAME_PADDING,
  160. left: targetLeft - containerLeft - borderWidth - FRAME_PADDING
  161. });
  162. (0, _translator.move)(this._$resizeFrame, {
  163. left: 0,
  164. top: 0
  165. })
  166. }
  167. }, {
  168. key: "_getBorderWidth",
  169. value: function() {
  170. return parseInt(this._$resizeFrame.css("borderTopWidth"))
  171. }
  172. }, {
  173. key: "_createResizeFrame",
  174. value: function() {
  175. var _this = this;
  176. if (this._$resizeFrame) {
  177. return
  178. }
  179. var _devices$current = _devices2.default.current(),
  180. deviceType = _devices$current.deviceType;
  181. this._$resizeFrame = (0, _renderer2.default)("<div>").addClass(DX_RESIZE_FRAME_CLASS).toggleClass(DX_TOUCH_DEVICE_CLASS, "desktop" !== deviceType).appendTo(this.editorInstance._getQuillContainer()).hide();
  182. this.editorInstance._createComponent(this._$resizeFrame, _resizable2.default, {
  183. onResize: function(e) {
  184. if (!_this._$target) {
  185. return
  186. }
  187. var correction = 2 * (FRAME_PADDING + _this._getBorderWidth());
  188. (0, _renderer2.default)(_this._$target).attr({
  189. height: e.height - correction,
  190. width: e.width - correction
  191. });
  192. _this.updateFramePosition()
  193. }
  194. })
  195. }
  196. }, {
  197. key: "_deleteImage",
  198. value: function() {
  199. if (this._isAllowedTarget(this._$target)) {
  200. _quill2.default.find(this._$target).deleteAt(0)
  201. }
  202. }
  203. }, {
  204. key: "option",
  205. value: function(_option, value) {
  206. var _this2 = this;
  207. if ("mediaResizing" === _option) {
  208. Object.keys(value).forEach(function(optionName) {
  209. return _this2.option(optionName, value[optionName])
  210. });
  211. return
  212. }
  213. if ("enabled" === _option) {
  214. this.enabled = value;
  215. value ? this._attachEvents() : this._detachEvents()
  216. } else {
  217. if ("allowedTargets" === _option && Array.isArray(value)) {
  218. this.allowedTargets = value
  219. }
  220. }
  221. }
  222. }, {
  223. key: "clean",
  224. value: function() {
  225. this._detachEvents();
  226. this._$resizeFrame.remove();
  227. this._$resizeFrame = void 0
  228. }
  229. }]);
  230. return ResizingModule
  231. }();
  232. exports.default = ResizingModule;