import { ref, computed, watch } from 'vue';
|
|
import { getToken } from '/@/utils/auth';
|
import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
|
import { JVxeComponent } from '../../types/JVxeComponent';
|
import { useJVxeComponent } from '../useJVxeComponent';
|
|
/**
|
* use 公共上传组件
|
* @param props
|
* @param options 组件选项,token:默认是否传递token,action:默认上传路径,multiple:是否允许多文件
|
*/
|
export function useJVxeUploadCell(props: JVxeComponent.Props, options?) {
|
const setup = useJVxeComponent(props);
|
const { innerValue, originColumn, handleChangeCommon } = setup;
|
|
const innerFile = ref<any>(null);
|
|
/** upload headers */
|
const uploadHeaders = computed(() => {
|
let headers = {};
|
if ((originColumn.value.token ?? options?.token ?? false) === true) {
|
headers['X-Access-Token'] = getToken();
|
}
|
return headers;
|
});
|
|
/** 上传请求地址 */
|
const uploadAction = computed(() => {
|
if (!originColumn.value.action) {
|
return options?.action ?? '';
|
} else {
|
return originColumn.value.action;
|
}
|
});
|
const hasFile = computed(() => innerFile.value != null);
|
const responseName = computed(() => originColumn.value.responseName ?? 'message');
|
|
watch(
|
innerValue,
|
(val) => {
|
if (val) {
|
innerFile.value = val;
|
} else {
|
innerFile.value = null;
|
}
|
},
|
{ immediate: true }
|
);
|
|
function handleChangeUpload(info) {
|
let { file } = info;
|
let value = {
|
name: file.name,
|
type: file.type,
|
size: file.size,
|
status: file.status,
|
percent: file.percent,
|
path: innerFile.value?.path ?? '',
|
};
|
if (file.response) {
|
value['responseName'] = file.response[responseName.value];
|
}
|
let paths: string[] = [];
|
if (options?.multiple && innerFile.value && innerFile.value.path) {
|
paths = innerFile.value.path.split(',');
|
}
|
if (file.status === 'done') {
|
if (typeof file.response.success === 'boolean') {
|
if (file.response.success) {
|
paths.push(file.response[responseName.value]);
|
value['path'] = paths.join(',');
|
handleChangeCommon(value);
|
} else {
|
value['status'] = 'error';
|
value['message'] = file.response.message || '未知错误';
|
}
|
} else {
|
// 考虑到如果设置action上传路径为非jeecg-boot后台,可能不会返回 success 属性的情况,就默认为成功
|
paths.push(file.response[responseName.value]);
|
value['path'] = paths.join(',');
|
handleChangeCommon(value);
|
}
|
} else if (file.status === 'error') {
|
value['message'] = file.response.message || '未知错误';
|
}
|
innerFile.value = value;
|
}
|
|
function handleClickDownloadFile() {
|
let { url, path } = innerFile.value || {};
|
if (!url || url.length === 0) {
|
if (path && path.length > 0) {
|
url = getFileAccessHttpUrl(path.split(',')[0]);
|
}
|
}
|
if (url) {
|
window.open(url);
|
}
|
}
|
|
function handleClickDeleteFile() {
|
handleChangeCommon(null);
|
}
|
|
return {
|
...setup,
|
innerFile,
|
uploadAction,
|
uploadHeaders,
|
hasFile,
|
responseName,
|
handleChangeUpload,
|
handleClickDownloadFile,
|
handleClickDeleteFile,
|
};
|
}
|
|
export function fileGetValue(value) {
|
if (value && value.path) {
|
return value.path;
|
}
|
return value;
|
}
|
|
export function fileSetValue(value) {
|
if (value) {
|
let first = value.split(',')[0];
|
let name = first.substring(first.lastIndexOf('/') + 1);
|
return {
|
name: name,
|
path: value,
|
status: 'done',
|
};
|
}
|
return value;
|
}
|