mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-08-26 16:46:19 +08:00
fix: update upload component
This commit is contained in:
34
src/components/Upload/src/FileList.less
Normal file
34
src/components/Upload/src/FileList.less
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
@import (reference) '../../../design/index.less';
|
||||||
|
|
||||||
|
.file-table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
// border: 1px solid @border-color-light;
|
||||||
|
|
||||||
|
.center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-th,
|
||||||
|
&-td {
|
||||||
|
padding: 12px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
background-color: @background-color-dark;
|
||||||
|
}
|
||||||
|
|
||||||
|
table,
|
||||||
|
td,
|
||||||
|
th {
|
||||||
|
border: 1px solid @border-color-light;
|
||||||
|
}
|
||||||
|
}
|
57
src/components/Upload/src/FileList.tsx
Normal file
57
src/components/Upload/src/FileList.tsx
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import { defineComponent } from 'vue';
|
||||||
|
import { fileListProps } from './props';
|
||||||
|
import { isFunction } from '/@/utils/is';
|
||||||
|
import './FileList.less';
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: 'FileList',
|
||||||
|
props: fileListProps,
|
||||||
|
setup(props) {
|
||||||
|
return () => {
|
||||||
|
const { columns, actionColumn, dataSource } = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<table class="file-table">
|
||||||
|
<colgroup>
|
||||||
|
{[...columns, actionColumn].map((item) => {
|
||||||
|
const { width = 0 } = item;
|
||||||
|
return width ? (
|
||||||
|
<col style={'width:' + width + 'px;min-width:' + width + 'px;'} />
|
||||||
|
) : (
|
||||||
|
<col />
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</colgroup>
|
||||||
|
<thead>
|
||||||
|
<tr class="file-table-tr">
|
||||||
|
{[...columns, actionColumn].map((item) => {
|
||||||
|
const { title = '', align = 'center' } = item;
|
||||||
|
return <th class={['file-table-th', align]}>{title}</th>;
|
||||||
|
})}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{dataSource.map((record = {}) => {
|
||||||
|
return (
|
||||||
|
<tr class="file-table-tr">
|
||||||
|
{[...columns, actionColumn].map((item) => {
|
||||||
|
const { dataIndex = '', customRender, align = 'center' } = item;
|
||||||
|
if (customRender && isFunction(customRender)) {
|
||||||
|
return (
|
||||||
|
<td class={['file-table-td', align]}>
|
||||||
|
{customRender({ text: record[dataIndex], record })}
|
||||||
|
</td>
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return <td class={['file-table-td', align]}>{record[dataIndex]}</td>;
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
@@ -23,24 +23,25 @@
|
|||||||
{{ getUploadBtnText }}
|
{{ getUploadBtnText }}
|
||||||
</a-button>
|
</a-button>
|
||||||
</template>
|
</template>
|
||||||
|
<div class="upload-modal-toolbar">
|
||||||
<BasicTable @register="registerTable" :dataSource="fileListRef">
|
<Alert :message="getHelpText" type="info" banner class="upload-modal-toolbar__text"></Alert>
|
||||||
<template #toolbar>
|
<Upload
|
||||||
<Upload :accept="getStringAccept" :multiple="multiple" :before-upload="beforeUpload">
|
:accept="getStringAccept"
|
||||||
<a-button type="primary"> 选择文件 </a-button>
|
:multiple="multiple"
|
||||||
</Upload>
|
:before-upload="beforeUpload"
|
||||||
</template>
|
class="upload-modal-toolbar__btn"
|
||||||
<template #tableTitle>
|
>
|
||||||
<Alert :message="getHelpText" type="info" banner></Alert>
|
<a-button type="primary"> 选择文件 </a-button>
|
||||||
</template>
|
</Upload>
|
||||||
</BasicTable>
|
</div>
|
||||||
|
<FileList :dataSource="fileListRef" :columns="columns" :actionColumn="actionColumn" />
|
||||||
</BasicModal>
|
</BasicModal>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, reactive, ref, toRefs, unref, computed } from 'vue';
|
import { defineComponent, reactive, ref, toRefs, unref, computed } from 'vue';
|
||||||
import { Upload, Alert } from 'ant-design-vue';
|
import { Upload, Alert } from 'ant-design-vue';
|
||||||
import { BasicModal, useModalInner } from '/@/components/Modal';
|
import { BasicModal, useModalInner } from '/@/components/Modal';
|
||||||
import { BasicTable, useTable } from '/@/components/Table';
|
// import { BasicTable, useTable } from '/@/components/Table';
|
||||||
// hooks
|
// hooks
|
||||||
import { useUploadType } from './useUpload';
|
import { useUploadType } from './useUpload';
|
||||||
import { useMessage } from '/@/hooks/web/useMessage';
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
@@ -55,9 +56,9 @@
|
|||||||
import { uploadApi } from '/@/api/sys/upload';
|
import { uploadApi } from '/@/api/sys/upload';
|
||||||
import { isFunction } from '/@/utils/is';
|
import { isFunction } from '/@/utils/is';
|
||||||
import { warn } from '/@/utils/log';
|
import { warn } from '/@/utils/log';
|
||||||
|
import FileList from './FileList';
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: { BasicModal, Upload, BasicTable, Alert },
|
components: { BasicModal, Upload, Alert, FileList },
|
||||||
props: basicProps,
|
props: basicProps,
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
// 是否正在上传
|
// 是否正在上传
|
||||||
@@ -257,23 +258,25 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const [registerTable] = useTable({
|
// const [registerTable] = useTable({
|
||||||
|
// columns: createTableColumns(),
|
||||||
|
// actionColumn: createActionColumn(handleRemove, handlePreview),
|
||||||
|
// pagination: false,
|
||||||
|
// inset: true,
|
||||||
|
// scroll: {
|
||||||
|
// y: 3000,
|
||||||
|
// },
|
||||||
|
// });
|
||||||
|
return {
|
||||||
columns: createTableColumns(),
|
columns: createTableColumns(),
|
||||||
actionColumn: createActionColumn(handleRemove, handlePreview),
|
actionColumn: createActionColumn(handleRemove, handlePreview),
|
||||||
pagination: false,
|
|
||||||
inset: true,
|
|
||||||
scroll: {
|
|
||||||
y: 3000,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
return {
|
|
||||||
register,
|
register,
|
||||||
closeModal,
|
closeModal,
|
||||||
getHelpText,
|
getHelpText,
|
||||||
getStringAccept,
|
getStringAccept,
|
||||||
getOkButtonProps,
|
getOkButtonProps,
|
||||||
beforeUpload,
|
beforeUpload,
|
||||||
registerTable,
|
// registerTable,
|
||||||
fileListRef,
|
fileListRef,
|
||||||
state,
|
state,
|
||||||
isUploadingRef,
|
isUploadingRef,
|
||||||
@@ -295,5 +298,17 @@
|
|||||||
.ant-table-wrapper .ant-spin-nested-loading {
|
.ant-table-wrapper .ant-spin-nested-loading {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&-toolbar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
|
||||||
|
&__btn {
|
||||||
|
margin-left: 8px;
|
||||||
|
text-align: right;
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -7,13 +7,15 @@
|
|||||||
@register="register"
|
@register="register"
|
||||||
:showOkBtn="false"
|
:showOkBtn="false"
|
||||||
>
|
>
|
||||||
<BasicTable @register="registerTable" :dataSource="fileListRef" />
|
<FileList :dataSource="fileListRef" :columns="columns" :actionColumn="actionColumn" />
|
||||||
</BasicModal>
|
</BasicModal>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, watch, ref, unref } from 'vue';
|
import { defineComponent, watch, ref, unref } from 'vue';
|
||||||
|
|
||||||
import { BasicTable, useTable } from '/@/components/Table';
|
// import { BasicTable, useTable } from '/@/components/Table';
|
||||||
|
import FileList from './FileList';
|
||||||
|
|
||||||
import { BasicModal, useModalInner } from '/@/components/Modal';
|
import { BasicModal, useModalInner } from '/@/components/Modal';
|
||||||
import { previewProps } from './props';
|
import { previewProps } from './props';
|
||||||
import { PreviewFileItem } from './types';
|
import { PreviewFileItem } from './types';
|
||||||
@@ -22,7 +24,7 @@
|
|||||||
|
|
||||||
import { createPreviewColumns, createPreviewActionColumn } from './data';
|
import { createPreviewColumns, createPreviewActionColumn } from './data';
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: { BasicModal, BasicTable },
|
components: { BasicModal, FileList },
|
||||||
props: previewProps,
|
props: previewProps,
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
const [register, { closeModal }] = useModalInner();
|
const [register, { closeModal }] = useModalInner();
|
||||||
@@ -71,17 +73,12 @@
|
|||||||
downloadByUrl({ url });
|
downloadByUrl({ url });
|
||||||
}
|
}
|
||||||
|
|
||||||
const [registerTable] = useTable({
|
|
||||||
columns: createPreviewColumns(),
|
|
||||||
pagination: false,
|
|
||||||
actionColumn: createPreviewActionColumn({ handleRemove, handlePreview, handleDownload }),
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
register,
|
register,
|
||||||
closeModal,
|
closeModal,
|
||||||
fileListRef,
|
fileListRef,
|
||||||
registerTable,
|
columns: createPreviewColumns(),
|
||||||
|
actionColumn: createPreviewActionColumn({ handleRemove, handlePreview, handleDownload }),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@@ -12,7 +12,7 @@ export function createTableColumns(): BasicColumn[] {
|
|||||||
width: 100,
|
width: 100,
|
||||||
customRender: ({ record }) => {
|
customRender: ({ record }) => {
|
||||||
const { thumbUrl, type } = (record as FileItem) || {};
|
const { thumbUrl, type } = (record as FileItem) || {};
|
||||||
return <span>{thumbUrl ? <img style={{ maxWidth: '60px' }} src={thumbUrl} /> : type}</span>;
|
return <span>{thumbUrl ? <img style={{ maxWidth: '100%' }} src={thumbUrl} /> : type}</span>;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import type { PropType } from 'vue';
|
import type { PropType } from 'vue';
|
||||||
|
import { FileBasicColumn } from './types';
|
||||||
|
|
||||||
export const basicProps = {
|
export const basicProps = {
|
||||||
helpText: {
|
helpText: {
|
||||||
@@ -57,3 +58,18 @@ export const previewProps = {
|
|||||||
default: () => [],
|
default: () => [],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const fileListProps = {
|
||||||
|
columns: {
|
||||||
|
type: [Array] as PropType<FileBasicColumn[]>,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
actionColumn: {
|
||||||
|
type: Object as PropType<FileBasicColumn>,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
dataSource: {
|
||||||
|
type: Array as PropType<any[]>,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
@@ -23,3 +23,33 @@ export interface PreviewFileItem {
|
|||||||
name: string;
|
name: string;
|
||||||
type: string;
|
type: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface FileBasicColumn {
|
||||||
|
/**
|
||||||
|
* Renderer of the table cell. The return value should be a VNode, or an object for colSpan/rowSpan config
|
||||||
|
* @type Function | ScopedSlot
|
||||||
|
*/
|
||||||
|
customRender?: Function;
|
||||||
|
/**
|
||||||
|
* Title of this column
|
||||||
|
* @type any (string | slot)
|
||||||
|
*/
|
||||||
|
title: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Width of this column
|
||||||
|
* @type string | number
|
||||||
|
*/
|
||||||
|
width?: number;
|
||||||
|
/**
|
||||||
|
* Display field of the data record, could be set like a.b.c
|
||||||
|
* @type string
|
||||||
|
*/
|
||||||
|
dataIndex: string;
|
||||||
|
/**
|
||||||
|
* specify how content is aligned
|
||||||
|
* @default 'left'
|
||||||
|
* @type string
|
||||||
|
*/
|
||||||
|
align?: 'left' | 'right' | 'center';
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user