text_area.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /**
  2. * DevExtreme (ui/text_area.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. var _renderer = require("../core/renderer");
  11. var _renderer2 = _interopRequireDefault(_renderer);
  12. var _events_engine = require("../events/core/events_engine");
  13. var _events_engine2 = _interopRequireDefault(_events_engine);
  14. var _common = require("../core/utils/common");
  15. var _window = require("../core/utils/window");
  16. var _window2 = _interopRequireDefault(_window);
  17. var _component_registrator = require("../core/component_registrator");
  18. var _component_registrator2 = _interopRequireDefault(_component_registrator);
  19. var _extend = require("../core/utils/extend");
  20. var _type = require("../core/utils/type");
  21. var _utils = require("../events/utils");
  22. var _utils2 = _interopRequireDefault(_utils);
  23. var _pointer = require("../events/pointer");
  24. var _pointer2 = _interopRequireDefault(_pointer);
  25. var _uiEventsEmitterGesture = require("../ui/scroll_view/ui.events.emitter.gesture.scroll");
  26. var _uiEventsEmitterGesture2 = _interopRequireDefault(_uiEventsEmitterGesture);
  27. var _size = require("../core/utils/size");
  28. var _size2 = _interopRequireDefault(_size);
  29. var _utils3 = require("./text_box/utils.scroll");
  30. var _text_box = require("./text_box");
  31. var _text_box2 = _interopRequireDefault(_text_box);
  32. function _interopRequireDefault(obj) {
  33. return obj && obj.__esModule ? obj : {
  34. "default": obj
  35. }
  36. }
  37. var TEXTAREA_CLASS = "dx-textarea";
  38. var TEXTEDITOR_INPUT_CLASS = "dx-texteditor-input";
  39. var TEXTEDITOR_INPUT_CLASS_AUTO_RESIZE = "dx-texteditor-input-auto-resize";
  40. var TextArea = _text_box2.default.inherit({
  41. _getDefaultOptions: function() {
  42. return (0, _extend.extend)(this.callBase(), {
  43. spellcheck: true,
  44. minHeight: void 0,
  45. maxHeight: void 0,
  46. autoResizeEnabled: false
  47. })
  48. },
  49. _initMarkup: function() {
  50. this.$element().addClass(TEXTAREA_CLASS);
  51. this.callBase();
  52. this.setAria("multiline", "true")
  53. },
  54. _renderContentImpl: function() {
  55. this._updateInputHeight();
  56. this.callBase()
  57. },
  58. _renderInput: function() {
  59. this.callBase();
  60. this._renderScrollHandler()
  61. },
  62. _createInput: function() {
  63. var $input = (0, _renderer2.default)("<textarea>");
  64. this._applyInputAttributes($input, this.option("inputAttr"));
  65. this._updateInputAutoResizeAppearance($input);
  66. return $input
  67. },
  68. _applyInputAttributes: function($input, customAttributes) {
  69. $input.attr(customAttributes).addClass(TEXTEDITOR_INPUT_CLASS)
  70. },
  71. _renderScrollHandler: function() {
  72. var _this = this;
  73. this._eventY = 0;
  74. var $input = this._input();
  75. var initScrollData = {
  76. validate: function(e) {
  77. if (_utils2.default.isDxMouseWheelEvent(e) && (0, _renderer2.default)(e.target).is(_this._input())) {
  78. if ((0, _utils3.allowScroll)($input, -e.delta, e.shiftKey)) {
  79. e._needSkipEvent = true;
  80. return true
  81. }
  82. return false
  83. }
  84. }
  85. };
  86. _events_engine2.default.on($input, _utils2.default.addNamespace(_uiEventsEmitterGesture2.default.init, this.NAME), initScrollData, _common.noop);
  87. _events_engine2.default.on($input, _utils2.default.addNamespace(_pointer2.default.down, this.NAME), this._pointerDownHandler.bind(this));
  88. _events_engine2.default.on($input, _utils2.default.addNamespace(_pointer2.default.move, this.NAME), this._pointerMoveHandler.bind(this))
  89. },
  90. _pointerDownHandler: function(e) {
  91. this._eventY = _utils2.default.eventData(e).y
  92. },
  93. _pointerMoveHandler: function(e) {
  94. var currentEventY = _utils2.default.eventData(e).y;
  95. var delta = this._eventY - currentEventY;
  96. if ((0, _utils3.allowScroll)(this._input(), delta)) {
  97. e.isScrollingEvent = true;
  98. e.stopPropagation()
  99. }
  100. this._eventY = currentEventY
  101. },
  102. _renderDimensions: function() {
  103. var $element = this.$element();
  104. var element = $element.get(0);
  105. var width = this._getOptionValue("width", element);
  106. var height = this._getOptionValue("height", element);
  107. var minHeight = this.option("minHeight");
  108. var maxHeight = this.option("maxHeight");
  109. $element.css({
  110. minHeight: void 0 !== minHeight ? minHeight : "",
  111. maxHeight: void 0 !== maxHeight ? maxHeight : "",
  112. width: width,
  113. height: height
  114. })
  115. },
  116. _resetDimensions: function() {
  117. this.$element().css({
  118. height: "",
  119. minHeight: "",
  120. maxHeight: ""
  121. })
  122. },
  123. _renderEvents: function() {
  124. if (this.option("autoResizeEnabled")) {
  125. _events_engine2.default.on(this._input(), _utils2.default.addNamespace("input paste", this.NAME), this._updateInputHeight.bind(this))
  126. }
  127. this.callBase()
  128. },
  129. _refreshEvents: function() {
  130. _events_engine2.default.off(this._input(), _utils2.default.addNamespace("input paste", this.NAME));
  131. this.callBase()
  132. },
  133. _getHeightDifference: function($input) {
  134. return _size2.default.getVerticalOffsets(this._$element.get(0), false) + _size2.default.getVerticalOffsets(this._$textEditorContainer.get(0), false) + _size2.default.getVerticalOffsets(this._$textEditorInputContainer.get(0), false) + _size2.default.getElementBoxParams("height", _window2.default.getWindow().getComputedStyle($input.get(0))).margin
  135. },
  136. _updateInputHeight: function() {
  137. var $input = this._input();
  138. var autoHeightResizing = void 0 === this.option("height") && this.option("autoResizeEnabled");
  139. if (!autoHeightResizing) {
  140. $input.css("height", "");
  141. return
  142. } else {
  143. this._resetDimensions();
  144. this._$element.css("height", this._$element.outerHeight())
  145. }
  146. $input.css("height", 0);
  147. var heightDifference = this._getHeightDifference($input);
  148. this._renderDimensions();
  149. var minHeight = this._getBoundaryHeight("minHeight");
  150. var maxHeight = this._getBoundaryHeight("maxHeight");
  151. var inputHeight = $input[0].scrollHeight;
  152. if (void 0 !== minHeight) {
  153. inputHeight = Math.max(inputHeight, minHeight - heightDifference)
  154. }
  155. if (void 0 !== maxHeight) {
  156. var adjustedMaxHeight = maxHeight - heightDifference;
  157. var needScroll = inputHeight > adjustedMaxHeight;
  158. inputHeight = Math.min(inputHeight, adjustedMaxHeight);
  159. this._updateInputAutoResizeAppearance($input, !needScroll)
  160. }
  161. $input.css("height", inputHeight);
  162. if (autoHeightResizing) {
  163. this._$element.css("height", "auto")
  164. }
  165. },
  166. _getBoundaryHeight: function(optionName) {
  167. var boundaryValue = this.option(optionName);
  168. if ((0, _type.isDefined)(boundaryValue)) {
  169. return "number" === typeof boundaryValue ? boundaryValue : _size2.default.parseHeight(boundaryValue, this._$textEditorContainer.get(0))
  170. }
  171. },
  172. _renderInputType: _common.noop,
  173. _visibilityChanged: function(visible) {
  174. if (visible) {
  175. this._updateInputHeight()
  176. }
  177. },
  178. _updateInputAutoResizeAppearance: function($input, isAutoResizeEnabled) {
  179. if ($input) {
  180. var autoResizeEnabled = (0, _common.ensureDefined)(isAutoResizeEnabled, this.option("autoResizeEnabled"));
  181. $input.toggleClass(TEXTEDITOR_INPUT_CLASS_AUTO_RESIZE, autoResizeEnabled)
  182. }
  183. },
  184. _optionChanged: function(args) {
  185. switch (args.name) {
  186. case "autoResizeEnabled":
  187. this._updateInputAutoResizeAppearance(this._input(), args.value);
  188. this._refreshEvents();
  189. this._updateInputHeight();
  190. break;
  191. case "value":
  192. case "height":
  193. this.callBase(args);
  194. this._updateInputHeight();
  195. break;
  196. case "minHeight":
  197. case "maxHeight":
  198. this._renderDimensions();
  199. this._updateInputHeight();
  200. break;
  201. case "visible":
  202. this.callBase(args);
  203. args.value && this._updateInputHeight();
  204. break;
  205. default:
  206. this.callBase(args)
  207. }
  208. }
  209. });
  210. (0, _component_registrator2.default)("dxTextArea", TextArea);
  211. module.exports = TextArea;
  212. module.exports.default = module.exports;