ResizableTextArea.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  10. var _vcResizeObserver = _interopRequireDefault(require("../vc-resize-observer"));
  11. var _classNames2 = _interopRequireDefault(require("../_util/classNames"));
  12. var _calculateNodeHeight = _interopRequireDefault(require("./calculateNodeHeight"));
  13. var _raf = _interopRequireDefault(require("../_util/raf"));
  14. var _warning = _interopRequireDefault(require("../_util/warning"));
  15. var _antInputDirective = _interopRequireDefault(require("../_util/antInputDirective"));
  16. var _omit = _interopRequireDefault(require("../_util/omit"));
  17. var _inputProps = require("./inputProps");
  18. var RESIZE_STATUS_NONE = 0;
  19. var RESIZE_STATUS_RESIZING = 1;
  20. var RESIZE_STATUS_RESIZED = 2;
  21. var ResizableTextArea = (0, _vue.defineComponent)({
  22. compatConfig: {
  23. MODE: 3
  24. },
  25. name: 'ResizableTextArea',
  26. inheritAttrs: false,
  27. props: (0, _inputProps.textAreaProps)(),
  28. setup: function setup(props, _ref) {
  29. var attrs = _ref.attrs,
  30. emit = _ref.emit,
  31. expose = _ref.expose;
  32. var nextFrameActionId;
  33. var resizeFrameId;
  34. var textAreaRef = (0, _vue.ref)();
  35. var textareaStyles = (0, _vue.ref)({});
  36. var resizeStatus = (0, _vue.ref)(RESIZE_STATUS_NONE);
  37. (0, _vue.onBeforeUnmount)(function () {
  38. _raf.default.cancel(nextFrameActionId);
  39. _raf.default.cancel(resizeFrameId);
  40. });
  41. // https://github.com/ant-design/ant-design/issues/21870
  42. var fixFirefoxAutoScroll = function fixFirefoxAutoScroll() {
  43. try {
  44. if (document.activeElement === textAreaRef.value) {
  45. var currentStart = textAreaRef.value.selectionStart;
  46. var currentEnd = textAreaRef.value.selectionEnd;
  47. textAreaRef.value.setSelectionRange(currentStart, currentEnd);
  48. }
  49. } catch (e) {
  50. // Fix error in Chrome:
  51. // Failed to read the 'selectionStart' property from 'HTMLInputElement'
  52. // http://stackoverflow.com/q/21177489/3040605
  53. }
  54. };
  55. var resizeTextarea = function resizeTextarea() {
  56. var autoSize = props.autoSize || props.autosize;
  57. if (!autoSize || !textAreaRef.value) {
  58. return;
  59. }
  60. var minRows = autoSize.minRows,
  61. maxRows = autoSize.maxRows;
  62. textareaStyles.value = (0, _calculateNodeHeight.default)(textAreaRef.value, false, minRows, maxRows);
  63. resizeStatus.value = RESIZE_STATUS_RESIZING;
  64. _raf.default.cancel(resizeFrameId);
  65. resizeFrameId = (0, _raf.default)(function () {
  66. resizeStatus.value = RESIZE_STATUS_RESIZED;
  67. resizeFrameId = (0, _raf.default)(function () {
  68. resizeStatus.value = RESIZE_STATUS_NONE;
  69. fixFirefoxAutoScroll();
  70. });
  71. });
  72. };
  73. var resizeOnNextFrame = function resizeOnNextFrame() {
  74. _raf.default.cancel(nextFrameActionId);
  75. nextFrameActionId = (0, _raf.default)(resizeTextarea);
  76. };
  77. var handleResize = function handleResize(size) {
  78. if (resizeStatus.value !== RESIZE_STATUS_NONE) {
  79. return;
  80. }
  81. emit('resize', size);
  82. var autoSize = props.autoSize || props.autosize;
  83. if (autoSize) {
  84. resizeOnNextFrame();
  85. }
  86. };
  87. (0, _warning.default)(props.autosize === undefined, 'Input.TextArea', 'autosize is deprecated, please use autoSize instead.');
  88. var renderTextArea = function renderTextArea() {
  89. var prefixCls = props.prefixCls,
  90. autoSize = props.autoSize,
  91. autosize = props.autosize,
  92. disabled = props.disabled;
  93. var otherProps = (0, _omit.default)(props, ['prefixCls', 'onPressEnter', 'autoSize', 'autosize', 'defaultValue', 'allowClear', 'type', 'lazy', 'maxlength', 'valueModifiers']);
  94. var cls = (0, _classNames2.default)(prefixCls, attrs.class, (0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), disabled));
  95. var style = [attrs.style, textareaStyles.value, resizeStatus.value === RESIZE_STATUS_RESIZING ? {
  96. overflowX: 'hidden',
  97. overflowY: 'hidden'
  98. } : null];
  99. var textareaProps = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, otherProps), attrs), {}, {
  100. style: style,
  101. class: cls
  102. });
  103. if (!textareaProps.autofocus) {
  104. delete textareaProps.autofocus;
  105. }
  106. if (textareaProps.rows === 0) {
  107. delete textareaProps.rows;
  108. }
  109. return (0, _vue.createVNode)(_vcResizeObserver.default, {
  110. "onResize": handleResize,
  111. "disabled": !(autoSize || autosize)
  112. }, {
  113. default: function _default() {
  114. return [(0, _vue.withDirectives)((0, _vue.createVNode)("textarea", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, textareaProps), {}, {
  115. "ref": textAreaRef
  116. }), null), [[_antInputDirective.default]])];
  117. }
  118. });
  119. };
  120. (0, _vue.watch)(function () {
  121. return props.value;
  122. }, function () {
  123. (0, _vue.nextTick)(function () {
  124. resizeTextarea();
  125. });
  126. });
  127. (0, _vue.onMounted)(function () {
  128. (0, _vue.nextTick)(function () {
  129. resizeTextarea();
  130. });
  131. });
  132. var instance = (0, _vue.getCurrentInstance)();
  133. expose({
  134. resizeTextarea: resizeTextarea,
  135. textArea: textAreaRef,
  136. instance: instance
  137. });
  138. return function () {
  139. return renderTextArea();
  140. };
  141. }
  142. });
  143. var _default2 = ResizableTextArea;
  144. exports.default = _default2;