plugin.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /**
  2. * Copyright (c) Tiny Technologies, Inc. All rights reserved.
  3. * Licensed under the LGPL or a commercial license.
  4. * For LGPL see License.txt in the project root for license information.
  5. * For commercial licenses see https://www.tiny.cloud/
  6. *
  7. * Version: 5.0.7 (2019-06-05)
  8. */
  9. (function () {
  10. var autoresize = (function () {
  11. 'use strict';
  12. var Cell = function (initial) {
  13. var value = initial;
  14. var get = function () {
  15. return value;
  16. };
  17. var set = function (v) {
  18. value = v;
  19. };
  20. var clone = function () {
  21. return Cell(get());
  22. };
  23. return {
  24. get: get,
  25. set: set,
  26. clone: clone
  27. };
  28. };
  29. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  30. var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
  31. var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');
  32. var fireResizeEditor = function (editor) {
  33. return editor.fire('ResizeEditor');
  34. };
  35. var Events = { fireResizeEditor: fireResizeEditor };
  36. var getAutoResizeMinHeight = function (editor) {
  37. return editor.getParam('min_height', editor.getElement().offsetHeight, 'number');
  38. };
  39. var getAutoResizeMaxHeight = function (editor) {
  40. return editor.getParam('max_height', 0, 'number');
  41. };
  42. var getAutoResizeOverflowPadding = function (editor) {
  43. return editor.getParam('autoresize_overflow_padding', 1, 'number');
  44. };
  45. var getAutoResizeBottomMargin = function (editor) {
  46. return editor.getParam('autoresize_bottom_margin', 50, 'number');
  47. };
  48. var shouldAutoResizeOnInit = function (editor) {
  49. return editor.getParam('autoresize_on_init', true, 'boolean');
  50. };
  51. var Settings = {
  52. getAutoResizeMinHeight: getAutoResizeMinHeight,
  53. getAutoResizeMaxHeight: getAutoResizeMaxHeight,
  54. getAutoResizeOverflowPadding: getAutoResizeOverflowPadding,
  55. getAutoResizeBottomMargin: getAutoResizeBottomMargin,
  56. shouldAutoResizeOnInit: shouldAutoResizeOnInit
  57. };
  58. var isFullscreen = function (editor) {
  59. return editor.plugins.fullscreen && editor.plugins.fullscreen.isFullscreen();
  60. };
  61. var wait = function (editor, oldSize, times, interval, callback) {
  62. global$2.setEditorTimeout(editor, function () {
  63. resize(editor, oldSize);
  64. if (times--) {
  65. wait(editor, oldSize, times, interval, callback);
  66. } else if (callback) {
  67. callback();
  68. }
  69. }, interval);
  70. };
  71. var toggleScrolling = function (editor, state) {
  72. var body = editor.getBody();
  73. if (body) {
  74. body.style.overflowY = state ? '' : 'hidden';
  75. if (!state) {
  76. body.scrollTop = 0;
  77. }
  78. }
  79. };
  80. var parseCssValueToInt = function (dom, elm, name, computed) {
  81. var value = parseInt(dom.getStyle(elm, name, computed), 10);
  82. return isNaN(value) ? 0 : value;
  83. };
  84. var resize = function (editor, oldSize) {
  85. var deltaSize, resizeHeight, contentHeight;
  86. var dom = editor.dom;
  87. var doc = editor.getDoc();
  88. if (!doc) {
  89. return;
  90. }
  91. if (isFullscreen(editor)) {
  92. toggleScrolling(editor, true);
  93. return;
  94. }
  95. var docEle = doc.documentElement;
  96. var resizeBottomMargin = Settings.getAutoResizeBottomMargin(editor);
  97. resizeHeight = Settings.getAutoResizeMinHeight(editor);
  98. var marginTop = parseCssValueToInt(dom, docEle, 'margin-top', true);
  99. var marginBottom = parseCssValueToInt(dom, docEle, 'margin-bottom', true);
  100. contentHeight = docEle.offsetHeight + marginTop + marginBottom + resizeBottomMargin;
  101. if (contentHeight < 0) {
  102. contentHeight = 0;
  103. }
  104. var containerHeight = editor.getContainer().offsetHeight;
  105. var contentAreaHeight = editor.getContentAreaContainer().offsetHeight;
  106. var chromeHeight = containerHeight - contentAreaHeight;
  107. if (contentHeight + chromeHeight > Settings.getAutoResizeMinHeight(editor)) {
  108. resizeHeight = contentHeight + chromeHeight;
  109. }
  110. var maxHeight = Settings.getAutoResizeMaxHeight(editor);
  111. if (maxHeight && resizeHeight > maxHeight) {
  112. resizeHeight = maxHeight;
  113. toggleScrolling(editor, true);
  114. } else {
  115. toggleScrolling(editor, false);
  116. }
  117. if (resizeHeight !== oldSize.get()) {
  118. deltaSize = resizeHeight - oldSize.get();
  119. dom.setStyle(editor.getContainer(), 'height', resizeHeight + 'px');
  120. oldSize.set(resizeHeight);
  121. Events.fireResizeEditor(editor);
  122. if (global$1.webkit && deltaSize < 0) {
  123. resize(editor, oldSize);
  124. }
  125. }
  126. };
  127. var setup = function (editor, oldSize) {
  128. editor.on('init', function () {
  129. var overflowPadding = Settings.getAutoResizeOverflowPadding(editor);
  130. var dom = editor.dom;
  131. dom.setStyles(editor.getBody(), {
  132. 'paddingLeft': overflowPadding,
  133. 'paddingRight': overflowPadding,
  134. 'min-height': 0
  135. });
  136. });
  137. editor.on('NodeChange SetContent keyup FullscreenStateChanged ResizeContent', function (e) {
  138. resize(editor, oldSize);
  139. });
  140. if (Settings.shouldAutoResizeOnInit(editor)) {
  141. editor.on('init', function () {
  142. wait(editor, oldSize, 20, 100, function () {
  143. wait(editor, oldSize, 5, 1000);
  144. });
  145. });
  146. }
  147. };
  148. var Resize = {
  149. setup: setup,
  150. resize: resize
  151. };
  152. var register = function (editor, oldSize) {
  153. editor.addCommand('mceAutoResize', function () {
  154. Resize.resize(editor, oldSize);
  155. });
  156. };
  157. var Commands = { register: register };
  158. global.add('autoresize', function (editor) {
  159. if (!editor.settings.hasOwnProperty('resize')) {
  160. editor.settings.resize = false;
  161. }
  162. if (!editor.inline) {
  163. var oldSize = Cell(0);
  164. Commands.register(editor, oldSize);
  165. Resize.setup(editor, oldSize);
  166. }
  167. });
  168. function Plugin () {
  169. }
  170. return Plugin;
  171. }());
  172. })();