song-ui-u
Version:
vue3 + js的PC前端组件库
392 lines (355 loc) • 12.8 kB
JavaScript
;
var vue = require('vue');
var index$3 = require('../../../hook/use-namespace/index.cjs');
var index$2 = require('../../../hook/use-style/index.cjs');
var index = require('../../../hook/use-event/index.cjs');
var index$1 = require('../../../hook/use-expose/index.cjs');
require('../../../hook/use-zindex/index.cjs');
require('../../button/index.cjs');
require('../../buttonGroup/index.cjs');
require('../../icon/index.cjs');
require('../../input/index.cjs');
require('../../textarea/index.cjs');
require('../../row/index.cjs');
require('../../col/index.cjs');
require('../../container/index.cjs');
require('../../checkbox/index.cjs');
require('../../switch/index.cjs');
require('../../form/index.cjs');
require('../../message/index.cjs');
require('../../mask/src/mask.cjs');
require('../../modal/index.cjs');
require('../../messageBox/index.cjs');
require('../../drawer/index.cjs');
require('../../badge/index.cjs');
require('../../space/index.cjs');
require('../../image/index.cjs');
require('../../radio/index.cjs');
require('../../divider/index.cjs');
require('../../chat/index.cjs');
require('../../progress/index.cjs');
var index$4 = require('../../upload/index.cjs');
require('../../vTree/index.cjs');
require('../../table/index.cjs');
require('../../tabs/index.cjs');
require('../../menu/index.cjs');
require('../../steps/index.cjs');
require('../../header/index.cjs');
require('../../breadcrumble/index.cjs');
require('../../datePicker/index.cjs');
require('../../tooltip/index.cjs');
require('../../popover/index.cjs');
require('../../timePicker/index.cjs');
require('../../select/index.cjs');
require('../../collapse/index.cjs');
require('../../card/index.cjs');
require('../../timeline/index.cjs');
require('../../tag/index.cjs');
require('../../result/index.cjs');
require('../index.cjs');
var _pluginVue_exportHelper = require('../../../_virtual/_plugin-vue_export-helper.cjs');
const __default__ = { name: "x-sender" };
const _sfc_main = /*#__PURE__*/Object.assign(__default__, {
props: /*#__PURE__*/vue.mergeModels({
placeholder: {
type: String,
default: "请输入",
},
maxlength: {
type: [String, Number],
default: "",
},
width: {
type: String,
default: "",
},
rows: {
type: String,
default: "",
},
position: {
type: String,
default: "between", // between bottom
},
disabled: Boolean, // 禁用
count: Boolean, // 统计
rows: {
type: Number,
default: 1,
},
minRows: {
type: Number,
default: 1,
},
maxRows: {
type: Number,
default: 8,
},
}, {
"modelValue": {},
"modelModifiers": {},
"imageList": {
type: Array,
default: () => [],
},
"imageListModifiers": {},
}),
emits: /*#__PURE__*/vue.mergeModels([
"input",
"clear",
"focus",
"blur",
"mouseenter",
"mouselevel",
"compositionstart",
"compositionupdate",
"compositionend",
"change",
"keydown",
"keyup",
"success",
"paste",
], ["update:modelValue", "update:imageList"]),
setup(__props, { expose: __expose, emit: __emit }) {
const ns = index$3.useNamespace("sender");
// input
const _ref = vue.shallowRef(null);
const { focusExpose, blurExpose, selectExpose } = index$1.useExpose(_ref);
// event
const {
isFocus,
isComposition,
focusEvent,
blurEvent,
mouseenterEvent,
mouselevelEvent,
compositionStartEvent,
compositionUpdateEvent,
compositionEndEvent,
changeEvent,
keydownEvent,
keyupEvent,
} = index.useEvent();
// style
const uStyle = index$2.useStyle();
const styleWidth = vue.computed(() => uStyle.width(props.width));
// defineModel
const modelValue = vue.useModel(__props, "modelValue");
// emits
const emit = __emit;
/** props */
const props = __props;
// showLimit
const showLimit = vue.computed(
() => props.count && !props.disabled && props.maxlength
);
// 文本长度
const valueLength = vue.computed(() => modelValue.value.length);
const isColorDanger = vue.computed(() => {
return props.maxlength && props.count && valueLength.value > props.maxlength;
});
const dynamicRows = vue.ref(props.rows);
const adjustHeight = () => {
const textarea = _ref.value;
if (!textarea) return;
// 重置为默认行数
textarea.rows = props.minRows;
const scrollHeight = textarea.scrollHeight;
textarea.clientHeight;
const lineHeight = parseInt(getComputedStyle(textarea).lineHeight, 10);
let rows = Math.floor(scrollHeight / lineHeight);
rows = Math.max(rows, props.minRows);
rows = Math.min(rows, props.maxRows);
dynamicRows.value = rows;
textarea.rows = rows;
};
const isAdj = vue.computed(() => {
return dynamicRows.value > props.rows;
});
// 清除
const handlerClear = () => {
modelValue.value = "";
// emit input
emit("input", "");
emit("clear", "");
};
const handlerCompositionEnd = (e) => {
compositionEndEvent(e).then(() => {
handlerInput(e);
});
};
const handlerInput = (e) => {
if (isComposition.value) return;
const value = e.target.value;
modelValue.value = value;
// 自适应高度
adjustHeight();
emit("input", value, e);
};
const uploadRef = vue.ref(null);
const file = vue.ref(null);
const paste = vue.ref(null);
const handelPaste = (e) => {
// 获取剪贴板中的内容
const items = e.clipboardData?.items;
if (items) {
for (let i = 0; i < items.length; i++) {
const item = items[i];
// 判断是否是图片类型
if (item.type.startsWith("image/")) {
const blob = item.getAsFile(); // 获取图片的 Blob 对象
if (blob) {
// 将 Blob 转换为 URL
paste.value = URL.createObjectURL(blob);
// 将blob转成File
const bobleTofile = new File(
[blob],
new Date().getTime() + "." + blob.type.split("/")[1],
{
type: blob.type,
}
);
file.value = bobleTofile;
if (uploadRef.value) {
uploadRef.value.upload(file.value);
}
emit("paste", file);
// 在这里可以将图片插入到页面或者上传到服务器
}
}
}
}
};
vue.nextTick(() => {
vue.watch(
() => uploadRef.value,
() => {
uploadRef.value.upload(file.value);
}
);
});
const imageList = vue.useModel(__props, "imageList");
const success = (res) => {
console.log(res, "res");
emit("success", res);
};
vue.onMounted(() => {
// 初始化自适应高度
adjustHeight();
});
__expose({
ref: _ref, // 输入框对象
focus: focusExpose,
blur: blurExpose,
select: selectExpose,
clear: handlerClear,
});
const __returned__ = { ns, _ref, focusExpose, blurExpose, selectExpose, isFocus, isComposition, focusEvent, blurEvent, mouseenterEvent, mouselevelEvent, compositionStartEvent, compositionUpdateEvent, compositionEndEvent, changeEvent, keydownEvent, keyupEvent, uStyle, styleWidth, modelValue, emit, props, showLimit, valueLength, isColorDanger, dynamicRows, adjustHeight, isAdj, handlerClear, handlerCompositionEnd, handlerInput, uploadRef, file, paste, handelPaste, imageList, success, ref: vue.ref, computed: vue.computed, shallowRef: vue.shallowRef, watch: vue.watch, onMounted: vue.onMounted, nextTick: vue.nextTick, get useNamespace() { return index$3.useNamespace }, get useStyle() { return index$2.useStyle }, get useEvent() { return index.useEvent }, get useExpose() { return index$1.useExpose }, get XUpload() { return index$4.XUpload } };
Object.defineProperty(__returned__, '__isScriptSetup', { enumerable: false, value: true });
return __returned__
}
});
const _hoisted_1 = ["rows", "placeholder", "value", "disabled"];
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
return (vue.openBlock(), vue.createElementBlock("div", {
style: vue.normalizeStyle([$setup.styleWidth]),
class: vue.normalizeClass([$setup.ns.b(), $setup.ns.is('focus', $setup.isFocus)]),
onMouseenter: _cache[8] || (_cache[8] = (...args) => ($setup.mouseenterEvent && $setup.mouseenterEvent(...args))),
onMouseleave: _cache[9] || (_cache[9] = (...args) => ($setup.mouselevelEvent && $setup.mouselevelEvent(...args)))
}, [
(_ctx.$slots.top || $setup.paste)
? (vue.openBlock(), vue.createElementBlock("div", {
key: 0,
class: vue.normalizeClass([$setup.ns.e('wapper-top')])
}, [
(_ctx.$slots.top)
? vue.renderSlot(_ctx.$slots, "top", { key: 0 })
: ($setup.paste)
? (vue.openBlock(), vue.createBlock($setup["XUpload"], {
key: 1,
imageSize: "80",
type: "imageList",
isVerify: false,
uploadUrl: "http://localhost:3000/upload/chunk",
verifyUrl: "http://localhost:3000/upload/verify",
mergeUrl: "http://localhost:3000/upload/merge",
imageList: $setup.imageList,
"onUpdate:imageList": _cache[0] || (_cache[0] = $event => (($setup.imageList) = $event)),
onSuccess: $setup.success,
ref: "uploadRef"
}, null, 8 /* PROPS */, ["imageList"]))
: vue.createCommentVNode("v-if", true)
], 2 /* CLASS */))
: vue.createCommentVNode("v-if", true),
vue.createElementVNode("div", {
class: vue.normalizeClass([
$setup.ns.e('inner-wrapper'),
$setup.ns.m('position', $props.position),
$setup.ns.is('adj', $setup.isAdj),
])
}, [
($props.position == 'between' && _ctx.$slots.prefix)
? (vue.openBlock(), vue.createElementBlock("div", {
key: 0,
class: vue.normalizeClass([$setup.ns.e('prefix')])
}, [
vue.renderSlot(_ctx.$slots, "prefix")
], 2 /* CLASS */))
: vue.createCommentVNode("v-if", true),
vue.createElementVNode("textarea", {
ref: "_ref",
rows: $setup.dynamicRows,
onInput: $setup.handlerInput,
onFocus: _cache[1] || (_cache[1] = (...args) => ($setup.focusEvent && $setup.focusEvent(...args))),
onBlur: _cache[2] || (_cache[2] = (...args) => ($setup.blurEvent && $setup.blurEvent(...args))),
onCompositionstart: _cache[3] || (_cache[3] = (...args) => ($setup.compositionStartEvent && $setup.compositionStartEvent(...args))),
onCompositionupdate: _cache[4] || (_cache[4] = (...args) => ($setup.compositionUpdateEvent && $setup.compositionUpdateEvent(...args))),
onCompositionend: $setup.handlerCompositionEnd,
onChange: _cache[5] || (_cache[5] = (...args) => ($setup.changeEvent && $setup.changeEvent(...args))),
onKeydown: _cache[6] || (_cache[6] = (...args) => ($setup.keydownEvent && $setup.keydownEvent(...args))),
onKeyup: _cache[7] || (_cache[7] = (...args) => ($setup.keyupEvent && $setup.keyupEvent(...args))),
placeholder: $props.placeholder,
value: $setup.modelValue,
disabled: $props.disabled,
class: vue.normalizeClass([$setup.ns.e('inner'), $setup.ns.is('bottom', $props.position == 'bottom')]),
onPaste: $setup.handelPaste
}, null, 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_1),
($props.position == 'between' && _ctx.$slots.action)
? (vue.openBlock(), vue.createElementBlock("div", {
key: 1,
class: vue.normalizeClass([$setup.ns.e('action')])
}, [
vue.renderSlot(_ctx.$slots, "action")
], 2 /* CLASS */))
: vue.createCommentVNode("v-if", true),
($props.position == 'bottom')
? (vue.openBlock(), vue.createElementBlock("div", {
key: 2,
class: vue.normalizeClass([$setup.ns.e('bottom')])
}, [
vue.createElementVNode("div", {
class: vue.normalizeClass([$setup.ns.e('action')])
}, [
vue.renderSlot(_ctx.$slots, "action")
], 2 /* CLASS */),
vue.createElementVNode("div", {
class: vue.normalizeClass([$setup.ns.e('prefix')])
}, [
vue.renderSlot(_ctx.$slots, "prefix")
], 2 /* CLASS */)
], 2 /* CLASS */))
: vue.createCommentVNode("v-if", true)
], 2 /* CLASS */),
(_ctx.$slots.bottom)
? (vue.openBlock(), vue.createElementBlock("div", {
key: 1,
class: vue.normalizeClass($setup.ns.e('wapper-bottom'))
}, [
vue.renderSlot(_ctx.$slots, "bottom")
], 2 /* CLASS */))
: vue.createCommentVNode("v-if", true)
], 38 /* CLASS, STYLE, NEED_HYDRATION */))
}
var Sender = /*#__PURE__*/_pluginVue_exportHelper(_sfc_main, [['render',_sfc_render],['__file',"E:\\code\\my-code\\song-ui-ultra\\packages\\components\\sender\\src\\index.vue"]]);
module.exports = Sender;
//# sourceMappingURL=index.vue.cjs.map