Commit c6bfc535a4d7795adb17788149f2c8f0d09af222

Authored by ww
1 parent 648aa8dd

feat: implement ApiUpload component

... ... @@ -33,6 +33,7 @@ import JAddInput from './externalCompns/components/JAddInput.vue';
33 33 import { JEasyCron } from './externalCompns/components/JEasyCron';
34 34 import ColorPicker from './components/ColorPicker.vue';
35 35 import IconDrawer from './components/IconDrawer.vue';
  36 +import ApiUpload from './components/ApiUpload.vue';
36 37
37 38 const componentMap = new Map<ComponentType, Component>();
38 39
... ... @@ -73,6 +74,7 @@ componentMap.set('JAddInput', JAddInput);
73 74 componentMap.set('JEasyCron', JEasyCron);
74 75 componentMap.set('ColorPicker', ColorPicker);
75 76 componentMap.set('IconDrawer', IconDrawer);
  77 +componentMap.set('ApiUpload', ApiUpload);
76 78
77 79 export function add(compName: ComponentType, component: Component) {
78 80 componentMap.set(compName, component);
... ...
... ... @@ -7,18 +7,21 @@
7 7 import { Upload, Spin } from 'ant-design-vue';
8 8 import { InboxOutlined } from '@ant-design/icons-vue';
9 9 import { useMessage } from '/@/hooks/web/useMessage';
10   - import { isBoolean, isFunction } from '/@/utils/is';
11   - import { computed, ref, unref } from 'vue';
  10 + import { computed, ref, unref, useAttrs } from 'vue';
12 11 import { cloneDeep } from 'lodash-es';
13   - interface FileItem {
  12 + import { isFunction, isObject } from '/@/utils/is';
  13 +
  14 + export interface FileItem {
14 15 uid: string;
15   - name?: string;
  16 + name: string;
16 17 status?: string;
17 18 response?: string;
18 19 url?: string;
19 20 }
20 21
21   - const emit = defineEmits(['update:fileList']);
  22 + const emit = defineEmits(['update:fileList', 'preview', 'download']);
  23 +
  24 + const attrs = useAttrs();
22 25
23 26 const { createMessage } = useMessage();
24 27
... ... @@ -26,8 +29,9 @@
26 29
27 30 const componentDisabled = ref(false);
28 31
29   - const setLoading = (spin: boolean) => {
30   - loading.value = spin;
  32 + const setUploadStatus = (status: boolean) => {
  33 + loading.value = status;
  34 + componentDisabled.value = status;
31 35 };
32 36
33 37 const props = withDefaults(
... ... @@ -60,28 +64,28 @@
60 64
61 65 const getDisabled = computed(() => {
62 66 const { disabled } = props;
63   - if (isBoolean(disabled)) {
64   - return disabled ? componentDisabled.value : disabled;
65   - }
66   - return componentDisabled.value;
  67 + return disabled ? disabled : unref(componentDisabled);
67 68 });
68 69
69 70 const handleUpload = async (file: File | string | Blob | Promise<string | Blob | File>) => {
70 71 try {
71   - setLoading(true);
72   - componentDisabled.value = true;
73   - console.log({ componentDisabled: unref(componentDisabled), getDisabled: unref(getDisabled) });
  72 + setUploadStatus(true);
74 73 const { transformFile, api } = props;
75 74 if (transformFile && isFunction(transformFile)) file = await transformFile(file as File);
76 75 if (api && isFunction(api)) {
77 76 const data = await api(file);
78   - emit('update:fileList', cloneDeep([...props.fileList, data]));
  77 + if (isObject(data) && Reflect.has(data, 'uid') && Reflect.has(data, 'name')) {
  78 + emit('update:fileList', cloneDeep([...props.fileList, data]));
  79 + return;
  80 + }
  81 + window.console.error(
  82 + `The ApiUpload component's api properties need to return an object, that object requires a uid field and a name field`
  83 + );
79 84 }
80 85 } catch (error) {
81 86 window.console.error(error);
82 87 } finally {
83   - setLoading(false);
84   - componentDisabled.value = false;
  88 + setUploadStatus(false);
85 89 }
86 90 };
87 91
... ... @@ -92,17 +96,34 @@
92 96 emit('update:fileList', _fileList);
93 97 };
94 98
  99 + const defaultPreview = (file: FileItem) => {
  100 + console.log('default preview', file);
  101 + };
  102 +
  103 + const defaultDownload = (file: FileItem) => {
  104 + console.log('default download', file);
  105 + };
  106 +
95 107 const handlePreview = (file: FileItem) => {
96   - console.log('preview', file);
  108 + if (Reflect.has(attrs, 'preview')) {
  109 + emit('preview', file);
  110 + return;
  111 + }
  112 + defaultPreview(file);
97 113 };
98 114
99 115 const handleDownload = (file: FileItem) => {
100   - console.log('download', file);
  116 + if (Reflect.has(attrs, 'download')) {
  117 + emit('download', file);
  118 + return;
  119 + }
  120 + defaultDownload(file);
101 121 };
102 122 </script>
103 123
104 124 <template>
105 125 <Upload.Dragger
  126 + class="block"
106 127 :file-list="props.fileList"
107 128 :disabled="getDisabled"
108 129 :before-upload="handleBeforeUpload"
... ... @@ -111,7 +132,6 @@
111 132 :remove="handleRemove"
112 133 >
113 134 <Spin :spinning="loading">
114   - {{ getDisabled }}
115 135 <div class="w-full h-full flex flex-col justify-center content-center">
116 136 <InboxOutlined class="text-[3rem] !text-blue-500" />
117 137 <div class="m-2 text-gray-400">点击上传或拖拽上传</div>
... ... @@ -119,3 +139,5 @@
119 139 </Spin>
120 140 </Upload.Dragger>
121 141 </template>
  142 +
  143 +<style></style>
... ...
... ... @@ -114,4 +114,5 @@ export type ComponentType =
114 114 | 'JAddInput'
115 115 | 'Rate'
116 116 | 'ColorPicker'
117   - | 'IconDrawer';
  117 + | 'IconDrawer'
  118 + | 'ApiUpload';
... ...
... ... @@ -7,7 +7,7 @@ export enum PackageField {
7 7 DEVICE_CONFIGURATION = 'deviceConfiguration',
8 8 PACKAGE_TYPE = 'packageType',
9 9 PACKAGE_UPDATE_TYPE = 'PackageUpdateType',
10   - PACKAGE_BINARY_FILE = 'packageBinaryFile',
  10 + PACKAGE_BINARY_FILE = 'fileList',
11 11 PACKAGE_EXTERNAL_URL = 'packageEexternalUrl',
12 12 CHECK_SUM_WAY = 'checkSumWay',
13 13 ALG = 'alg',
... ... @@ -119,9 +119,11 @@ export const formSchema: FormSchema[] = [
119 119 ifShow: ({ model }) => {
120 120 return model[PackageField.PACKAGE_UPDATE_TYPE] === PackageUpdateType.BINARY_FILE;
121 121 },
122   - component: 'Upload',
  122 + component: 'ApiUpload',
  123 + valueField: PackageField.PACKAGE_BINARY_FILE,
  124 + changeEvent: `update:${PackageField.PACKAGE_BINARY_FILE}`,
123 125 componentProps: {
124   - api: () => {
  126 + api: (_file: File) => {
125 127 return {};
126 128 },
127 129 },
... ...
... ... @@ -5,8 +5,6 @@
5 5 import { BasicTable, useTable } from '/@/components/Table';
6 6 import PackageDetailModal from './components/PackageDetailModal.vue';
7 7 import { useModal } from '/@/components/Modal';
8   - // import { ApiUpload } from '/@/components/Form';
9   - // import { ref } from 'vue';
10 8
11 9 const [register] = useTable({
12 10 columns,
... ... @@ -24,28 +22,10 @@
24 22 const handleCreatePackage = () => {
25 23 openModal(true);
26 24 };
27   -
28   - // const fileList = ref([]);
29   - // const handleUpload = async (file: File) => {
30   - // console.log(file);
31   - // return new Promise((resolve) => {
32   - // setTimeout(() => {
33   - // resolve({
34   - // uid: file.uid,
35   - // type: file.type,
36   - // name: file.name,
37   - // linkProps: { download: 'http://www.baidu.cn' },
38   - // });
39   - // }, 3000);
40   - // });
41   - // };
42 25 </script>
43 26
44 27 <template>
45 28 <PageWrapper dense contentFullHeight contentClass="flex flex-col">
46   - <!-- <div class="w-40 h-40">
47   - <ApiUpload v-model:file-list="fileList" :api="handleUpload" />
48   - </div> -->
49 29 <BasicTable @register="register">
50 30 <template #toolbar>
51 31 <Button @click="handleCreatePackage" type="primary">新增包</Button>
... ...