@aplus-frontend/antdv
Version:
Vue basic component library maintained based on ant-design-vue
156 lines (154 loc) • 4.83 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _vue = require("vue");
var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
var _TextArea = _interopRequireDefault(require("../input/TextArea"));
var _EnterOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/EnterOutlined"));
var _classNames = _interopRequireDefault(require("../_util/classNames"));
var _style = _interopRequireDefault(require("./style"));
// CSSINJS
const editableProps = () => ({
prefixCls: String,
value: String,
maxlength: Number,
autoSize: {
type: [Boolean, Object]
},
onSave: Function,
onCancel: Function,
onEnd: Function,
onChange: Function,
originContent: String,
direction: String,
component: String
});
const Editable = (0, _vue.defineComponent)({
compatConfig: {
MODE: 3
},
name: 'Editable',
inheritAttrs: false,
props: editableProps(),
// emits: ['save', 'cancel', 'end', 'change'],
setup(props, _ref) {
let {
emit,
slots,
attrs
} = _ref;
const {
prefixCls
} = (0, _vue.toRefs)(props);
const state = (0, _vue.reactive)({
current: props.value || '',
lastKeyCode: undefined,
inComposition: false,
cancelFlag: false
});
(0, _vue.watch)(() => props.value, current => {
state.current = current;
});
const textArea = (0, _vue.ref)();
(0, _vue.onMounted)(() => {
var _a;
if (textArea.value) {
const resizableTextArea = (_a = textArea.value) === null || _a === void 0 ? void 0 : _a.resizableTextArea;
const innerTextArea = resizableTextArea === null || resizableTextArea === void 0 ? void 0 : resizableTextArea.textArea;
innerTextArea.focus();
const {
length
} = innerTextArea.value;
innerTextArea.setSelectionRange(length, length);
}
});
function saveTextAreaRef(node) {
textArea.value = node;
}
function onChange(_ref2) {
let {
target: {
value
}
} = _ref2;
state.current = value.replace(/[\r\n]/g, '');
emit('change', state.current);
}
function onCompositionStart() {
state.inComposition = true;
}
function onCompositionEnd() {
state.inComposition = false;
}
function onKeyDown(e) {
const {
keyCode
} = e;
if (keyCode === _KeyCode.default.ENTER) {
e.preventDefault();
}
// We don't record keyCode when IME is using
if (state.inComposition) return;
state.lastKeyCode = keyCode;
}
function onKeyUp(e) {
const {
keyCode,
ctrlKey,
altKey,
metaKey,
shiftKey
} = e;
// Check if it's a real key
if (state.lastKeyCode === keyCode && !state.inComposition && !ctrlKey && !altKey && !metaKey && !shiftKey) {
if (keyCode === _KeyCode.default.ENTER) {
confirmChange();
emit('end');
} else if (keyCode === _KeyCode.default.ESC) {
state.current = props.originContent;
emit('cancel');
}
}
}
function onBlur() {
confirmChange();
}
function confirmChange() {
emit('save', state.current.trim());
}
// style
const [wrapSSR, hashId] = (0, _style.default)(prefixCls);
return () => {
const textAreaClassName = (0, _classNames.default)({
[`${prefixCls.value}`]: true,
[`${prefixCls.value}-edit-content`]: true,
[`${prefixCls.value}-rtl`]: props.direction === 'rtl',
[props.component ? `${prefixCls.value}-${props.component}` : '']: true
}, attrs.class, hashId.value);
return wrapSSR((0, _vue.createVNode)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, {
"class": textAreaClassName
}), [(0, _vue.createVNode)(_TextArea.default, {
"ref": saveTextAreaRef,
"maxlength": props.maxlength,
"value": state.current,
"onChange": onChange,
"onKeydown": onKeyDown,
"onKeyup": onKeyUp,
"onCompositionstart": onCompositionStart,
"onCompositionend": onCompositionEnd,
"onBlur": onBlur,
"rows": 1,
"autoSize": props.autoSize === undefined || props.autoSize
}, null), slots.enterIcon ? slots.enterIcon({
className: `${props.prefixCls}-edit-content-confirm`
}) : (0, _vue.createVNode)(_EnterOutlined.default, {
"class": `${props.prefixCls}-edit-content-confirm`
}, null)]));
};
}
});
var _default = exports.default = Editable;
;