feat: 文件支持拖动到列表上传

This commit is contained in:
kuaifan 2022-02-25 22:48:30 +08:00
parent 123ffd4e66
commit 356d40e640
14 changed files with 399 additions and 266 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "DooTask", "name": "DooTask",
"version": "0.9.70", "version": "0.9.73",
"description": "DooTask is task management system.", "description": "DooTask is task management system.",
"main": "electron.js", "main": "electron.js",
"license": "MIT", "license": "MIT",

View File

@ -1,6 +1,6 @@
{ {
"name": "DooTask", "name": "DooTask",
"version": "0.9.70", "version": "0.9.73",
"description": "DooTask is task management system.", "description": "DooTask is task management system.",
"scripts": { "scripts": {
"start": "./cmd dev", "start": "./cmd dev",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/js/build/510.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -57,6 +57,11 @@
</div> </div>
</div> </div>
<div
class="file-drag"
@drop.prevent="filePasteDrag($event, 'drag')"
@dragover.prevent="fileDragOver(true, $event)"
@dragleave.prevent="fileDragOver(false, $event)">
<div v-if="tableMode" class="file-table" @contextmenu.prevent="handleRightClick"> <div v-if="tableMode" class="file-table" @contextmenu.prevent="handleRightClick">
<Table <Table
:columns="columns" :columns="columns"
@ -124,6 +129,10 @@
</ul> </ul>
</div> </div>
</template> </template>
<div v-if="dialogDrag" class="drag-over" @click="dialogDrag=false">
<div class="drag-text">{{$L('拖动到这里发送')}}</div>
</div>
</div>
<div class="file-menu" :style="contextMenuStyles"> <div class="file-menu" :style="contextMenuStyles">
<Dropdown <Dropdown
@ -323,6 +332,21 @@
<FileContent v-else v-model="fileShow" :file="fileInfo"/> <FileContent v-else v-model="fileShow" :file="fileInfo"/>
</DrawerOverlay> </DrawerOverlay>
<!--拖动上传提示-->
<Modal
v-model="pasteShow"
:title="$L(pasteTitle)"
:cancel-text="$L('取消')"
:ok-text="$L('发送')"
:enter-ok="true"
@on-ok="pasteSend">
<div class="dialog-wrapper-paste">
<template v-for="item in pasteItem">
<img v-if="item.type == 'image'" :src="item.result"/>
<div v-else>{{$L('文件')}}: {{item.name}} ({{$A.bytesToSize(item.size)}})</div>
</template>
</div>
</Modal>
</div> </div>
</template> </template>
@ -457,6 +481,11 @@ export default {
shearIds: [], shearIds: [],
selectIds: [], selectIds: [],
dialogDrag: false,
pasteShow: false,
pasteFile: [],
pasteItem: [],
} }
}, },
@ -537,6 +566,18 @@ export default {
const {navigator} = this; const {navigator} = this;
return !!navigator.find(({share}) => share); return !!navigator.find(({share}) => share);
}, },
pasteTitle() {
const {pasteItem} = this;
let hasImage = pasteItem.find(({type}) => type == 'image')
let hasFile = pasteItem.find(({type}) => type != 'image')
if (hasImage && hasFile) {
return '上传文件/图片'
} else if (hasImage) {
return '上传图片'
}
return '上传文件'
}
}, },
watch: { watch: {
@ -1281,6 +1322,61 @@ export default {
this.selectIds = []; this.selectIds = [];
}, },
/********************拖动上传部分************************/
pasteDragNext(e, type) {
let files = type === 'drag' ? e.dataTransfer.files : e.clipboardData.files;
files = Array.prototype.slice.call(files);
if (files.length > 0) {
e.preventDefault();
if (files.length > 0) {
this.pasteFile = [];
this.pasteItem = [];
files.some(file => {
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = ({target}) => {
this.pasteFile.push(file)
this.pasteItem.push({
type: $A.getMiddle(file.type, null, '/'),
name: file.name,
size: file.size,
result: target.result
})
this.pasteShow = true
}
});
}
}
},
filePasteDrag(e, type) {
this.dialogDrag = false;
this.pasteDragNext(e, type);
},
fileDragOver(show, e) {
let random = (this.__dialogDrag = $A.randomString(8));
if (!show) {
setTimeout(() => {
if (random === this.__dialogDrag) {
this.dialogDrag = show;
}
}, 150);
} else {
if (e.dataTransfer.effectAllowed === 'move') {
return;
}
this.dialogDrag = true;
}
},
pasteSend() {
this.pasteFile.some(file => {
this.$refs.fileUpload.upload(file)
});
},
/********************文件上传部分************************/ /********************文件上传部分************************/
uploadUpdate(fileList) { uploadUpdate(fileList) {

View File

@ -90,24 +90,6 @@
} }
} }
} }
.file-no {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
margin-bottom: 5%;
opacity: 0.8;
> i {
font-size: 64px;
}
> p {
margin-top: 18px;
font-size: 14px;
font-weight: 500;
line-height: 1;
}
}
.file-navigator { .file-navigator {
display: flex; display: flex;
align-items: center; align-items: center;
@ -254,6 +236,30 @@
} }
} }
} }
.file-drag {
flex: 1;
height: 0;
display: flex;
flex-direction: column;
position: relative;
.file-no {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
margin-bottom: 5%;
opacity: 0.8;
> i {
font-size: 64px;
}
> p {
margin-top: 18px;
font-size: 14px;
font-weight: 500;
line-height: 1;
}
}
.file-table { .file-table {
flex: 1; flex: 1;
cursor: default; cursor: default;
@ -443,6 +449,35 @@
} }
} }
} }
.drag-over {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 3;
background-color: rgba(255, 255, 255, 0.78);
display: flex;
align-items: center;
justify-content: center;
margin: 16px 32px 32px;
&:before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
border: 2px dashed #7b7b7b;
border-radius: 12px;
}
.drag-text {
padding: 12px;
font-size: 18px;
color: #666666;
}
}
}
.file-menu { .file-menu {
position: absolute; position: absolute;
} }
@ -620,9 +655,11 @@
.file-navigator { .file-navigator {
margin: 0 24px 0; margin: 0 24px 0;
} }
.file-drag {
.file-table { .file-table {
margin: 16px 24px 24px; margin: 16px 24px 24px;
} }
} }
} }
} }
}