Editable.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
  10. var _TextArea = _interopRequireDefault(require("../input/TextArea"));
  11. var _EnterOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/EnterOutlined"));
  12. var editableProps = function editableProps() {
  13. return {
  14. prefixCls: String,
  15. value: String,
  16. maxlength: Number,
  17. autoSize: {
  18. type: [Boolean, Object]
  19. },
  20. onSave: Function,
  21. onCancel: Function,
  22. onEnd: Function,
  23. onChange: Function,
  24. originContent: String,
  25. direction: String
  26. };
  27. };
  28. var Editable = (0, _vue.defineComponent)({
  29. compatConfig: {
  30. MODE: 3
  31. },
  32. name: 'Editable',
  33. props: editableProps(),
  34. // emits: ['save', 'cancel', 'end', 'change'],
  35. setup: function setup(props, _ref) {
  36. var emit = _ref.emit,
  37. slots = _ref.slots;
  38. var state = (0, _vue.reactive)({
  39. current: props.value || '',
  40. lastKeyCode: undefined,
  41. inComposition: false,
  42. cancelFlag: false
  43. });
  44. (0, _vue.watch)(function () {
  45. return props.value;
  46. }, function (current) {
  47. state.current = current;
  48. });
  49. var textArea = (0, _vue.ref)();
  50. (0, _vue.onMounted)(function () {
  51. if (textArea.value) {
  52. var _textArea$value;
  53. var resizableTextArea = (_textArea$value = textArea.value) === null || _textArea$value === void 0 ? void 0 : _textArea$value.resizableTextArea;
  54. var innerTextArea = resizableTextArea === null || resizableTextArea === void 0 ? void 0 : resizableTextArea.textArea;
  55. innerTextArea.focus();
  56. var length = innerTextArea.value.length;
  57. innerTextArea.setSelectionRange(length, length);
  58. }
  59. });
  60. function saveTextAreaRef(node) {
  61. textArea.value = node;
  62. }
  63. function onChange(_ref2) {
  64. var value = _ref2.target.value;
  65. state.current = value.replace(/[\r\n]/g, '');
  66. emit('change', state.current);
  67. }
  68. function onCompositionStart() {
  69. state.inComposition = true;
  70. }
  71. function onCompositionEnd() {
  72. state.inComposition = false;
  73. }
  74. function onKeyDown(e) {
  75. var keyCode = e.keyCode;
  76. if (keyCode === _KeyCode.default.ENTER) {
  77. e.preventDefault();
  78. }
  79. // We don't record keyCode when IME is using
  80. if (state.inComposition) return;
  81. state.lastKeyCode = keyCode;
  82. }
  83. function onKeyUp(e) {
  84. var keyCode = e.keyCode,
  85. ctrlKey = e.ctrlKey,
  86. altKey = e.altKey,
  87. metaKey = e.metaKey,
  88. shiftKey = e.shiftKey;
  89. // Check if it's a real key
  90. if (state.lastKeyCode === keyCode && !state.inComposition && !ctrlKey && !altKey && !metaKey && !shiftKey) {
  91. if (keyCode === _KeyCode.default.ENTER) {
  92. confirmChange();
  93. emit('end');
  94. } else if (keyCode === _KeyCode.default.ESC) {
  95. state.current = props.originContent;
  96. emit('cancel');
  97. }
  98. }
  99. }
  100. function onBlur() {
  101. confirmChange();
  102. }
  103. function confirmChange() {
  104. emit('save', state.current.trim());
  105. }
  106. var textAreaClassName = (0, _vue.computed)(function () {
  107. var _ref3;
  108. return _ref3 = {}, (0, _defineProperty2.default)(_ref3, "".concat(props.prefixCls), true), (0, _defineProperty2.default)(_ref3, "".concat(props.prefixCls, "-edit-content"), true), (0, _defineProperty2.default)(_ref3, "".concat(props.prefixCls, "-rtl"), props.direction === 'rtl'), _ref3;
  109. });
  110. return function () {
  111. return (0, _vue.createVNode)("div", {
  112. "class": textAreaClassName.value
  113. }, [(0, _vue.createVNode)(_TextArea.default, {
  114. "ref": saveTextAreaRef,
  115. "maxlength": props.maxlength,
  116. "value": state.current,
  117. "onChange": onChange,
  118. "onKeydown": onKeyDown,
  119. "onKeyup": onKeyUp,
  120. "onCompositionstart": onCompositionStart,
  121. "onCompositionend": onCompositionEnd,
  122. "onBlur": onBlur,
  123. "rows": 1,
  124. "autoSize": props.autoSize === undefined || props.autoSize
  125. }, null), slots.enterIcon ? slots.enterIcon({
  126. className: "".concat(props.prefixCls, "-edit-content-confirm")
  127. }) : (0, _vue.createVNode)(_EnterOutlined.default, {
  128. "class": "".concat(props.prefixCls, "-edit-content-confirm")
  129. }, null)]);
  130. };
  131. }
  132. });
  133. var _default = Editable;
  134. exports.default = _default;