kui-vue
Version:
A lightweight desktop UI component library suitable for Vue.js 2.
133 lines (121 loc) • 4.36 kB
JSX
import { ref, defineComponent, inject, computed } from "vue";
import { DocumentTextOutline, Close, AlertCircle } from "kui-icons";
import zhCN from "../locale/zh-CN";
import Icon from "../icon";
import Tooltip from "../tooltip";
import Progress from "../progress";
import { v4 as uuid } from "uuid";
export default defineComponent({
name: "UploadFileList",
props: {
showUploadList: { type: Boolean, default: true },
type: {
type: String,
default: "list",
validator: (val) => ["list", "picture"].indexOf(val) >= 0,
},
fileList: Array,
disabled: Boolean,
},
setup(ps, { emit, slots }) {
const injectedLocale = inject("locale", zhCN);
const locale = computed(() => {
return injectedLocale instanceof Object && "value" in injectedLocale
? injectedLocale.value
: injectedLocale;
});
const defaultFileList = ref(ps.fileList || []);
const getPreview = (item) => {
if (item.preview == true && item.url) {
return <img src={item.url} />;
}
if (item.preview) {
return <img src={item.preview} />;
} else if (item.url) {
return <img src={item.url} />;
} else {
return null;
}
};
const remove = (i) => {
if (ps.disabled) return false;
let item = defaultFileList.value[i];
defaultFileList.value.splice(i, 1);
// delete uploadTemp[item.uid];
if (item.xhr) item.xhr.abort();
emit("remove", {
file: item,
fileList: defaultFileList.value,
});
};
return () => {
let { showUploadList, type } = ps;
let isPicture = type == "picture";
return (showUploadList && !isPicture) || isPicture ? (
<div class={`k-upload-${isPicture ? "picture" : "file"}-list`}>
{defaultFileList.value.map((item, i) => {
let statusText =
item.status == "success"
? locale?.value.k.upload.successful
: item.errorText || locale?.value.k.upload.failed;
delete item.errorText;
item.uid = item.uid || uuid();
return (
<div
class={[
`k-upload-file-${type}-item`,
`k-upload-file-status-${item.status}`,
]}
key={item.uid}
>
<div
class={`k-upload-${isPicture ? "picture" : "file"}-preview`}
>
{getPreview(item) || <Icon type={DocumentTextOutline} />}
</div>
<div class="k-upload-file-item-info">
{!isPicture ? (
<div class="k-upload-file-main">
<span class="k-upload-file-name">{item.filename}</span>
<span class="k-upload-file-size">{item.size}</span>
</div>
) : null}
{item.status != "wait" ? (
<div class="k-upload-file-status">
{item.status == "uploading" ? (
<Progress
percent={item.percent}
type={`${isPicture ? "circle" : "line"}`}
size="small"
showInfo={false}
status="active"
strokeWidth={15}
/>
) : statusText && !isPicture ? (
<div class="k-upload-file-status-text">
<Icon type={AlertCircle} />
{statusText}
</div>
) : null}
{isPicture && item.status == "error" ? (
<Tooltip title={statusText} placement="bottom">
<Icon type={AlertCircle} />
</Tooltip>
) : null}
</div>
) : null}
</div>
<Icon
type={Close}
class={`k-upload-file-${isPicture ? "picture" : "item"}-remove`}
onClick={() => remove(i)}
/>
</div>
);
})}
{isPicture && slots.selector?.()}
</div>
) : null;
};
},
});