tdesign-vue-next
Version:
TDesign Component for vue-next
490 lines (486 loc) • 24.2 kB
JavaScript
/**
* tdesign v1.15.2
* (c) 2025 tdesign
* @license MIT
*/
import { defineComponent, toRefs, computed, ref, createVNode, mergeProps, isVNode } from 'vue';
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import { BrowseIcon, DeleteIcon, CheckCircleFilledIcon, ErrorCircleFilledIcon, TimeFilledIcon, FileExcelIcon, FilePdfIcon, FileWordIcon, FilePowerpointIcon, FileIcon, VideoIcon } from 'tdesign-icons-vue-next';
import { isFunction, isObject } from 'lodash-es';
import '@babel/runtime/helpers/typeof';
import '../../_chunks/dep-e604a5ce.js';
import { u as useTNodeJSX } from '../../_chunks/dep-1d44782f.js';
import '../../config-provider/hooks/useConfig.js';
import { u as useGlobalIcon } from '../../_chunks/dep-2ac22271.js';
import '@babel/runtime/helpers/slicedToArray';
import { a as abridgeName, r as returnFileSize, I as IMAGE_REGEXP, F as FILE_PDF_REGEXP, c as FILE_EXCEL_REGEXP, d as FILE_WORD_REGEXP, e as FILE_PPT_REGEXP, V as VIDEO_REGEXP } from '../../_chunks/dep-18651c0d.js';
import '../../_chunks/dep-7324137b.js';
import { ImageViewer } from '../../image-viewer/index.js';
import { commonProps } from '../consts/index.js';
import { Button } from '../../button/index.js';
import useDrag from '../hooks/useDrag.js';
import { Loading } from '../../loading/index.js';
import { Link } from '../../link/index.js';
import { Image } from '../../image/index.js';
import '../../_chunks/dep-7fac49fa.js';
import '../../_chunks/dep-1f7ad104.js';
import '../../_chunks/dep-6c13cc0e.js';
import '../../config-provider/utils/context.js';
import '../../_chunks/dep-3b49fbbe.js';
import 'dayjs';
import '../../_chunks/dep-0ffe4637.js';
import '@babel/runtime/helpers/createClass';
import '@babel/runtime/helpers/classCallCheck';
import '../../image-viewer/image-viewer.js';
import '../../_chunks/dep-79c44a11.js';
import '../../_chunks/dep-b7083c88.js';
import '../../_chunks/dep-199af351.js';
import '../../loading/icon/gradient.js';
import '../../_chunks/dep-3ba91e12.js';
import '../../_chunks/dep-a72765fe.js';
import '@babel/runtime/helpers/objectWithoutProperties';
import '../../_chunks/dep-b9ab7399.js';
import '../../loading/props.js';
import '../../_chunks/dep-34e44a4e.js';
import '../../image-viewer/base/ImageItem.js';
import '@babel/runtime/helpers/asyncToGenerator';
import '@babel/runtime/regenerator';
import '../../_chunks/dep-7129208c.js';
import '../../image-viewer/hooks/index.js';
import '../../_chunks/dep-2b6cbdff.js';
import '../../_chunks/dep-69e69021.js';
import '../../image-viewer/base/ImageModalIcon.js';
import '../../image-viewer/base/ImageViewerModal.js';
import '../../dialog/index.js';
import '../../dialog/dialog.js';
import '../../dialog/props.js';
import '../../_chunks/dep-bdcd9932.js';
import '../../dialog/hooks/useSameTarget.js';
import '../../_chunks/dep-dbde60fa.js';
import '../../dialog/utils/index.js';
import '../../dialog/dialog-card.js';
import '../../dialog/dialog-card-props.js';
import '../../dialog/hooks/useAction.js';
import '../../button/button.js';
import '../../button/props.js';
import '../../_chunks/dep-5360ac56.js';
import '../../_chunks/dep-7b209207.js';
import '../../loading/directive.js';
import '../../loading/plugin.js';
import '../../_chunks/dep-37a2e7c8.js';
import '../../dialog/plugin.js';
import '../../image-viewer/props.js';
import '../../image-viewer/base/ImageViewerUtils.js';
import '../../tooltip/index.js';
import '../../tooltip/tooltip.js';
import '../../tooltip/props.js';
import '../../popup/props.js';
import '../../popup/index.js';
import '../../popup/popup.js';
import '@popperjs/core';
import '../../popup/container.js';
import '../../_chunks/dep-82e44120.js';
import '../../tooltip/utils/index.js';
import '../../image-viewer/consts/index.js';
import '../../image-viewer/utils/index.js';
import '../../image/image.js';
import '../../_chunks/dep-6f34ddfa.js';
import '../../image/props.js';
import '../../space/index.js';
import '../../space/space.js';
import '../../space/props.js';
import '../../_chunks/dep-0f8c45fe.js';
import '../../link/link.js';
import '../../link/props.js';
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _isSlot(s) {
return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !isVNode(s);
}
var MultipleFlowList = defineComponent({
name: "UploadMultipleFlowList",
props: _objectSpread(_objectSpread({}, commonProps), {}, {
showThumbnail: Boolean,
uploadFiles: Function,
cancelUpload: Function,
dragEvents: Object,
disabled: Boolean,
isBatchUpload: Boolean,
draggable: Boolean,
showImageFileName: Boolean,
uploadButton: Object,
cancelUploadButton: Object,
onPreview: Function
}),
setup: function setup(props, _ref) {
var slots = _ref.slots;
var _toRefs = toRefs(props),
uploading = _toRefs.uploading,
disabled = _toRefs.disabled,
displayFiles = _toRefs.displayFiles,
classPrefix = _toRefs.classPrefix,
accept = _toRefs.accept;
var uploadPrefix = computed(function () {
return "".concat(classPrefix.value, "-upload");
});
var locale = computed(function () {
return props.locale;
});
var renderTNodeJSX = useTNodeJSX();
var _useGlobalIcon = useGlobalIcon({
BrowseIcon: BrowseIcon,
DeleteIcon: DeleteIcon,
CheckCircleFilledIcon: CheckCircleFilledIcon,
ErrorCircleFilledIcon: ErrorCircleFilledIcon,
TimeFilledIcon: TimeFilledIcon,
FileExcelIcon: FileExcelIcon,
FilePdfIcon: FilePdfIcon,
FileWordIcon: FileWordIcon,
FilePowerpointIcon: FilePowerpointIcon,
FileIcon: FileIcon,
VideoIcon: VideoIcon
}),
BrowseIcon$1 = _useGlobalIcon.BrowseIcon,
DeleteIcon$1 = _useGlobalIcon.DeleteIcon,
CheckCircleFilledIcon$1 = _useGlobalIcon.CheckCircleFilledIcon,
ErrorCircleFilledIcon$1 = _useGlobalIcon.ErrorCircleFilledIcon,
TimeFilledIcon$1 = _useGlobalIcon.TimeFilledIcon,
FileExcelIcon$1 = _useGlobalIcon.FileExcelIcon,
FilePdfIcon$1 = _useGlobalIcon.FilePdfIcon,
FileWordIcon$1 = _useGlobalIcon.FileWordIcon,
FilePowerpointIcon$1 = _useGlobalIcon.FilePowerpointIcon,
FileIcon$1 = _useGlobalIcon.FileIcon,
VideoIcon$1 = _useGlobalIcon.VideoIcon;
var drag = useDrag(props.dragEvents, accept);
var currentPreviewFile = ref([]);
var previewIndex = ref(0);
var uploadText = computed(function () {
if (uploading.value) return "".concat(locale.value.progress.uploadingText);
return locale.value.triggerUploadText.normal;
});
var innerDragEvents = computed(function () {
var draggable = props.draggable === void 0 ? true : props.draggable;
return draggable ? {
onDrop: drag.handleDrop,
onDragenter: drag.handleDragenter,
onDragover: drag.handleDragover,
onDragleave: drag.handleDragleave
} : {};
});
var getStatusMap = function getStatusMap() {
var iconMap = {
success: createVNode(CheckCircleFilledIcon$1, null, null),
fail: createVNode(ErrorCircleFilledIcon$1, null, null),
progress: createVNode(Loading, null, null),
waiting: createVNode(TimeFilledIcon$1, null, null)
};
var progress = locale.value.progress;
var textMap = {
success: progress === null || progress === void 0 ? void 0 : progress.successText,
fail: progress === null || progress === void 0 ? void 0 : progress.failText,
progress: progress === null || progress === void 0 ? void 0 : progress.uploadingText,
waiting: progress === null || progress === void 0 ? void 0 : progress.waitingText
};
return {
iconMap: iconMap,
textMap: textMap
};
};
var renderEmpty = function renderEmpty() {
return createVNode("div", {
"class": "".concat(uploadPrefix.value, "__flow-empty")
}, [drag.dragActive.value ? locale.value.dragger.dragDropText : locale.value.dragger.clickAndDragText]);
};
var renderImgItem = function renderImgItem(file, index) {
var _file$response;
var _getStatusMap = getStatusMap(),
iconMap = _getStatusMap.iconMap,
textMap = _getStatusMap.textMap;
var fileName = props.abridgeName && file.name ? abridgeName.apply(void 0, [file.name].concat(_toConsumableArray(props.abridgeName))) : file.name;
return createVNode("li", {
"class": "".concat(uploadPrefix.value, "__card-item"),
"key": file.name + index + file.percent + file.status || "0"
}, [createVNode("div", {
"class": ["".concat(uploadPrefix.value, "__card-content"), _defineProperty({}, "".concat(classPrefix.value, "-is-bordered"), file.status !== "waiting")]
}, [file.status === "progress" && createVNode("div", {
"class": "".concat(uploadPrefix.value, "__card-status-wrap ").concat(uploadPrefix.value, "__").concat(props.theme, "-progress")
}, [iconMap[file.status], createVNode("p", null, [textMap[file.status], props.showUploadProgress && " ".concat(file.percent, "%")])]), file.status === "fail" && createVNode("div", {
"class": "".concat(uploadPrefix.value, "__card-status-wrap ").concat(uploadPrefix.value, "__").concat(props.theme, "-fail")
}, [iconMap[file.status], createVNode("p", null, [((_file$response = file.response) === null || _file$response === void 0 ? void 0 : _file$response.error) || textMap[file.status]])]), (["waiting", "success"].includes(file.status) || !file.status && file.url) && createVNode(Image, {
"class": "".concat(uploadPrefix.value, "__card-image"),
"src": file.url || file.raw,
"error": "",
"loading": "",
"fit": "contain"
}, null), createVNode("div", {
"class": "".concat(uploadPrefix.value, "__card-mask")
}, [(file.url || file.raw) && !["progress", "fail"].includes(file.status) && createVNode("span", {
"class": "".concat(uploadPrefix.value, "__card-mask-item")
}, [createVNode(BrowseIcon$1, {
"onClick": function onClick(_ref3) {
var _props$onPreview;
var e = _ref3.e;
previewIndex.value = index;
currentPreviewFile.value = displayFiles.value;
(_props$onPreview = props.onPreview) === null || _props$onPreview === void 0 || _props$onPreview.call(props, {
file: file,
index: index,
e: e
});
}
}, null), createVNode("span", {
"class": "".concat(uploadPrefix.value, "__card-mask-item-divider")
}, null)]), !disabled.value && createVNode("span", {
"class": "".concat(uploadPrefix.value, "__card-mask-item ").concat(uploadPrefix.value, "__delete"),
"onClick": function onClick(e) {
return props.onRemove({
e: e,
index: index,
file: file
});
}
}, [createVNode(DeleteIcon$1, null, null)])])]), props.showImageFileName && createVNode("p", {
"class": ["".concat(uploadPrefix.value, "__card-name"), "".concat(uploadPrefix.value, "__flow-status")]
}, [["success", "waiting"].includes(file.status) && iconMap[file.status], fileName])]);
};
var renderStatus = function renderStatus(file) {
var _file$response2, _file$response3;
var _getStatusMap2 = getStatusMap(),
iconMap = _getStatusMap2.iconMap,
textMap = _getStatusMap2.textMap;
return createVNode("div", {
"class": "".concat(uploadPrefix.value, "__flow-status")
}, [iconMap[file.status], createVNode("span", {
"class": "".concat(uploadPrefix.value, "__").concat(props.theme, "-").concat(file.status)
}, [(_file$response2 = file.response) !== null && _file$response2 !== void 0 && _file$response2.error ? ((_file$response3 = file.response) === null || _file$response3 === void 0 ? void 0 : _file$response3.error) || textMap[file.status] : textMap[file.status], props.showUploadProgress && file.status === "progress" ? " ".concat(file.percent || 0, "%") : ""])]);
};
var renderNormalActionCol = function renderNormalActionCol(file, index) {
var _locale$value;
return createVNode("td", null, [createVNode(Button, {
"theme": "primary",
"variant": "text",
"content": (_locale$value = locale.value) === null || _locale$value === void 0 || (_locale$value = _locale$value.triggerUploadText) === null || _locale$value === void 0 ? void 0 : _locale$value["delete"],
"class": "".concat(uploadPrefix.value, "__delete"),
"onClick": function onClick(e) {
return props.onRemove({
e: e,
index: index,
file: file
});
}
}, null)]);
};
var renderBatchActionCol = function renderBatchActionCol(index) {
var _locale$value2;
return index === 0 ? createVNode("td", {
"rowspan": displayFiles.value.length,
"class": "".concat(uploadPrefix.value, "__flow-table__batch-row")
}, [createVNode(Button, {
"theme": "primary",
"variant": "text",
"content": (_locale$value2 = locale.value) === null || _locale$value2 === void 0 || (_locale$value2 = _locale$value2.triggerUploadText) === null || _locale$value2 === void 0 ? void 0 : _locale$value2["delete"],
"class": "".concat(uploadPrefix.value, "__delete"),
"onClick": function onClick(e) {
return props.onRemove({
e: e,
index: -1,
file: void 0
});
}
}, null)]) : null;
};
var getFileThumbnailIcon = function getFileThumbnailIcon(fileType) {
if (FILE_PDF_REGEXP.test(fileType)) {
return createVNode(FilePdfIcon$1, null, null);
}
if (FILE_EXCEL_REGEXP.test(fileType)) {
return createVNode(FileExcelIcon$1, null, null);
}
if (FILE_WORD_REGEXP.test(fileType)) {
return createVNode(FileWordIcon$1, null, null);
}
if (FILE_PPT_REGEXP.test(fileType)) {
return createVNode(FilePowerpointIcon$1, null, null);
}
if (VIDEO_REGEXP.test(fileType)) {
return createVNode(VideoIcon$1, null, null);
}
return createVNode(FileIcon$1, null, null);
};
var renderFileThumbnail = function renderFileThumbnail(file) {
if (!file || !file.raw && file.url) return null;
var fileType = file.raw.type;
var className = "".concat(uploadPrefix.value, "__file-thumbnail");
if (IMAGE_REGEXP.test(fileType)) {
return createVNode(Image, {
"class": className,
"src": file.url || file.raw,
"fit": "scale-down",
"error": "",
"loading": "",
"onClick": function onClick(e) {
var _props$onPreview2;
e.preventDefault();
currentPreviewFile.value = [file];
previewIndex.value = 0;
(_props$onPreview2 = props.onPreview) === null || _props$onPreview2 === void 0 || _props$onPreview2.call(props, {
file: file,
index: 0,
e: e
});
}
}, null);
}
return createVNode("div", {
"class": className
}, [getFileThumbnailIcon(fileType)]);
};
var renderFileList = function renderFileList() {
var _locale$value$file, _locale$value$file2, _locale$value$file3, _locale$value$file4;
var customList = renderTNodeJSX("fileListDisplay", {
params: {
cancelUpload: props.cancelUpload,
uploadFiles: props.uploadFiles,
onPreview: props.onPreview,
onRemove: props.onRemove,
toUploadFiles: props.toUploadFiles,
sizeOverLimitMessage: props.sizeOverLimitMessage,
locale: props.locale,
files: props.displayFiles,
dragEvents: innerDragEvents.value
}
});
if (customList || props.fileListDisplay) return customList;
return createVNode("table", mergeProps({
"class": "".concat(uploadPrefix.value, "__flow-table")
}, innerDragEvents.value), [createVNode("thead", null, [createVNode("tr", null, [createVNode("th", null, [(_locale$value$file = locale.value.file) === null || _locale$value$file === void 0 ? void 0 : _locale$value$file.fileNameText]), createVNode("th", {
"style": {
minWidth: "120px"
}
}, [(_locale$value$file2 = locale.value.file) === null || _locale$value$file2 === void 0 ? void 0 : _locale$value$file2.fileSizeText]), createVNode("th", {
"style": {
minWidth: "120px"
}
}, [(_locale$value$file3 = locale.value.file) === null || _locale$value$file3 === void 0 ? void 0 : _locale$value$file3.fileStatusText]), disabled.value ? null : createVNode("th", null, [(_locale$value$file4 = locale.value.file) === null || _locale$value$file4 === void 0 ? void 0 : _locale$value$file4.fileOperationText])])]), createVNode("tbody", null, [!displayFiles.value.length && createVNode("tr", null, [createVNode("td", {
"colspan": 4
}, [renderEmpty()])]), displayFiles.value.map(function (file, index) {
var _props$abridgeName;
var showBatchUploadAction = props.isBatchUpload;
var deleteNode = showBatchUploadAction && displayFiles.value.every(function (item) {
return item.status === "success" || !item.status;
}) ? renderBatchActionCol(index) : renderNormalActionCol(file, index);
var fileName = (_props$abridgeName = props.abridgeName) !== null && _props$abridgeName !== void 0 && _props$abridgeName.length ? abridgeName.apply(void 0, [file.name].concat(_toConsumableArray(props.abridgeName))) : file.name;
var thumbnailNode = props.showThumbnail ? createVNode("div", {
"class": "".concat(uploadPrefix.value, "__file-info")
}, [renderFileThumbnail(file), fileName]) : fileName;
var fileNameNode = file.url ? createVNode(Link, {
"href": file.url,
"target": "_blank",
"hover": "color",
"disabled": false
}, _isSlot(thumbnailNode) ? thumbnailNode : {
"default": function _default() {
return [thumbnailNode];
}
}) : thumbnailNode;
return createVNode("tr", {
"key": file.name + index + file.size
}, [createVNode("td", {
"class": "".concat(uploadPrefix.value, "__file-name"),
"key": file.name + file.url
}, [fileNameNode]), createVNode("td", null, [returnFileSize(file.size)]), createVNode("td", null, [renderStatus(file)]), disabled.value ? null : deleteNode]);
})])]);
};
var renderImageList = function renderImageList() {
var customList = renderTNodeJSX("fileListDisplay", {
params: {
cancelUpload: props.cancelUpload,
uploadFiles: props.uploadFiles,
onRemove: props.onRemove,
onPreview: props.onPreview,
toUploadFiles: props.toUploadFiles,
sizeOverLimitMessage: props.sizeOverLimitMessage,
locale: props.locale,
files: props.displayFiles,
dragEvents: innerDragEvents.value
}
});
if (customList || props.fileListDisplay) return customList;
return createVNode("ul", {
"class": "".concat(uploadPrefix.value, "__card clearfix")
}, [props.displayFiles.map(function (file, index) {
return renderImgItem(file, index);
})]);
};
return function () {
var _slots$default, _locale$value3, _locale$value4;
var cardClassName = "".concat(uploadPrefix.value, "__flow-card-area");
var cancelUploadDisabled = disabled.value || !uploading.value;
var hasCancelUploadTNode = slots.uploadButton || isFunction(props.uploadButton);
var uploadButtonDisabled = Boolean(disabled.value || uploading.value || !displayFiles.value.length);
var hasUploadButtonTNode = slots.cancelUploadButton || isFunction(props.cancelUploadButton);
return createVNode("div", {
"class": "".concat(uploadPrefix.value, "__flow ").concat(uploadPrefix.value, "__flow-").concat(props.theme)
}, [createVNode("div", {
"class": "".concat(uploadPrefix.value, "__flow-op")
}, [(_slots$default = slots["default"]) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots), props.placeholder && createVNode("small", {
"class": "".concat(uploadPrefix.value, "__flow-placeholder ").concat(uploadPrefix.value, "__placeholder")
}, [props.placeholder])]), props.theme === "image-flow" && createVNode("div", mergeProps({
"class": cardClassName
}, innerDragEvents.value), [displayFiles.value.length ? renderImageList() : renderEmpty()]), props.theme === "file-flow" && (displayFiles.value.length ? renderFileList() : createVNode("div", mergeProps({
"class": cardClassName
}, innerDragEvents.value), [renderEmpty()])), !props.autoUpload && (props.uploadButton !== null || props.cancelUploadButton !== null) && createVNode("div", {
"class": "".concat(uploadPrefix.value, "__flow-bottom")
}, [props.cancelUploadButton !== null && (hasCancelUploadTNode ? renderTNodeJSX("cancelUploadButton", {
params: {
disabled: cancelUploadDisabled,
cancelUploadText: (_locale$value3 = locale.value) === null || _locale$value3 === void 0 ? void 0 : _locale$value3.cancelUploadText,
cancelUpload: props.cancelUpload
}
}) : createVNode(Button, mergeProps({
"theme": "default",
"disabled": cancelUploadDisabled,
"content": (_locale$value4 = locale.value) === null || _locale$value4 === void 0 ? void 0 : _locale$value4.cancelUploadText,
"class": "".concat(uploadPrefix.value, "__cancel"),
"onClick": function onClick(e) {
var _props$cancelUpload;
return (_props$cancelUpload = props.cancelUpload) === null || _props$cancelUpload === void 0 ? void 0 : _props$cancelUpload.call(props, {
e: e
});
}
}, isObject(props.cancelUploadButton) ? props.cancelUploadButton : {}), null)), props.uploadButton !== null && (hasUploadButtonTNode ? renderTNodeJSX("uploadButton", {
params: {
disabled: uploadButtonDisabled,
uploading: uploading.value,
uploadText: uploadText.value,
uploadFiles: props.uploadFiles
}
}) : createVNode(Button, mergeProps({
"disabled": uploadButtonDisabled,
"theme": "primary",
"loading": uploading.value,
"class": "".concat(uploadPrefix.value, "__continue"),
"content": uploadText.value,
"onClick": function onClick() {
var _props$uploadFiles;
return (_props$uploadFiles = props.uploadFiles) === null || _props$uploadFiles === void 0 ? void 0 : _props$uploadFiles.call(props);
}
}, isObject(props.uploadButton) ? props.uploadButton : {}), null))]), createVNode(ImageViewer, mergeProps({
"images": currentPreviewFile.value.map(function (t) {
return t.url || t.raw;
}),
"visible": !!currentPreviewFile.value.length,
"onClose": function onClose() {
currentPreviewFile.value = [];
},
"index": previewIndex.value,
"onIndexChange": function onIndexChange(val) {
return previewIndex.value = val;
}
}, props.imageViewerProps), null)]);
};
}
});
export { MultipleFlowList as default };
//# sourceMappingURL=multiple-flow-list.js.map