diff options
Diffstat (limited to 'src')
7 files changed, 146 insertions, 152 deletions
diff --git a/src/web/app/common/views/components/messaging-room.form.vue b/src/web/app/common/views/components/messaging-room.form.vue index 3698ccd5b2..edcda069a3 100644 --- a/src/web/app/common/views/components/messaging-room.form.vue +++ b/src/web/app/common/views/components/messaging-room.form.vue @@ -1,7 +1,7 @@ <template> <div class="mk-messaging-form" - @dragover.prevent.stop="onDragover" - @drop.prevent.stop="onDrop" + @dragover.stop="onDragover" + @drop.stop="onDrop" > <textarea v-model="text" @@ -89,34 +89,33 @@ export default Vue.extend({ }, onDragover(e) { - e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; + const isFile = e.dataTransfer.items[0].kind == 'file'; + const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file'; + if (isFile || isDriveFile) { + e.preventDefault(); + e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; + } }, onDrop(e): void { // ファイルだったら if (e.dataTransfer.files.length == 1) { + e.preventDefault(); this.upload(e.dataTransfer.files[0]); return; } else if (e.dataTransfer.files.length > 1) { + e.preventDefault(); alert('メッセージに添付できるのはひとつのファイルのみです'); return; } - // データ取得 - const data = e.dataTransfer.getData('text'); - if (data == null) return; - - try { - // パース - const obj = JSON.parse(data); - - // (ドライブの)ファイルだったら - if (obj.type == 'file') { - this.file = obj.file; - } - } catch (e) { - // not a json, so noop + //#region ドライブのファイル + const driveFile = e.dataTransfer.getData('mk_drive_file'); + if (driveFile != null && driveFile != '') { + this.file = JSON.parse(driveFile); + e.preventDefault(); } + //#endregion }, onKeypress(e) { diff --git a/src/web/app/common/views/components/messaging-room.vue b/src/web/app/common/views/components/messaging-room.vue index fb67d126cb..f7f31c557c 100644 --- a/src/web/app/common/views/components/messaging-room.vue +++ b/src/web/app/common/views/components/messaging-room.vue @@ -88,7 +88,14 @@ export default Vue.extend({ methods: { onDragover(e) { - e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; + const isFile = e.dataTransfer.items[0].kind == 'file'; + const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file'; + + if (isFile || isDriveFile) { + e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; + } else { + e.dataTransfer.dropEffect = 'none'; + } }, onDrop(e): void { @@ -101,21 +108,13 @@ export default Vue.extend({ return; } - // データ取得 - const data = e.dataTransfer.getData('text'); - if (data == null) return; - - try { - // パース - const obj = JSON.parse(data); - - // (ドライブの)ファイルだったら - if (obj.type == 'file') { - this.form.file = obj.file; - } - } catch (e) { - // not a json, so noop + //#region ドライブのファイル + const driveFile = e.dataTransfer.getData('mk_drive_file'); + if (driveFile != null && driveFile != '') { + const file = JSON.parse(driveFile); + this.form.file = file; } + //#endregion }, fetchMessages() { diff --git a/src/web/app/desktop/views/components/drive.file.vue b/src/web/app/desktop/views/components/drive.file.vue index cc423477e9..6390ed3514 100644 --- a/src/web/app/desktop/views/components/drive.file.vue +++ b/src/web/app/desktop/views/components/drive.file.vue @@ -115,11 +115,7 @@ export default Vue.extend({ onDragstart(e) { e.dataTransfer.effectAllowed = 'move'; - e.dataTransfer.setData('text', JSON.stringify({ - type: 'file', - id: this.file.id, - file: this.file - })); + e.dataTransfer.setData('mk_drive_file', JSON.stringify(this.file)); this.isDragging = true; // 親ブラウザに対して、ドラッグが開始されたフラグを立てる diff --git a/src/web/app/desktop/views/components/drive.folder.vue b/src/web/app/desktop/views/components/drive.folder.vue index 4e57d1ca66..d5f4b11ee1 100644 --- a/src/web/app/desktop/views/components/drive.folder.vue +++ b/src/web/app/desktop/views/components/drive.folder.vue @@ -92,19 +92,22 @@ export default Vue.extend({ }, onDragover(e) { - // 自分自身がドラッグされていない場合 - if (!this.isDragging) { - // ドラッグされてきたものがファイルだったら - if (e.dataTransfer.effectAllowed === 'all') { - e.dataTransfer.dropEffect = 'copy'; - } else { - e.dataTransfer.dropEffect = 'move'; - } - } else { + // 自分自身がドラッグされている場合 + if (this.isDragging) { // 自分自身にはドロップさせない e.dataTransfer.dropEffect = 'none'; + return; + } + + const isFile = e.dataTransfer.items[0].kind == 'file'; + const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file'; + const isDriveFolder = e.dataTransfer.types[0] == 'mk_drive_folder'; + + if (isFile || isDriveFile || isDriveFolder) { + e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; + } else { + e.dataTransfer.dropEffect = 'none'; } - return false; }, onDragenter() { @@ -123,36 +126,35 @@ export default Vue.extend({ Array.from(e.dataTransfer.files).forEach(file => { this.browser.upload(file, this.folder); }); - return false; + return; } - // データ取得 - const data = e.dataTransfer.getData('text'); - if (data == null) return false; - - // パース - // TODO: Validate JSON - const obj = JSON.parse(data); - - // (ドライブの)ファイルだったら - if (obj.type == 'file') { - const file = obj.id; - this.browser.removeFile(file); + //#region ドライブのファイル + const driveFile = e.dataTransfer.getData('mk_drive_file'); + if (driveFile != null && driveFile != '') { + const file = JSON.parse(driveFile); + this.browser.removeFile(file.id); (this as any).api('drive/files/update', { - file_id: file, + file_id: file.id, folder_id: this.folder.id }); - // (ドライブの)フォルダーだったら - } else if (obj.type == 'folder') { - const folder = obj.id; + } + //#endregion + + //#region ドライブのフォルダ + const driveFolder = e.dataTransfer.getData('mk_drive_folder'); + if (driveFolder != null && driveFolder != '') { + const folder = JSON.parse(driveFolder); + // 移動先が自分自身ならreject - if (folder == this.folder.id) return false; - this.browser.removeFolder(folder); + if (folder.id == this.folder.id) return; + + this.browser.removeFolder(folder.id); (this as any).api('drive/folders/update', { - folder_id: folder, + folder_id: folder.id, parent_id: this.folder.id }).then(() => { - // something + // noop }).catch(err => { switch (err) { case 'detected-circular-definition': @@ -169,16 +171,12 @@ export default Vue.extend({ } }); } - - return false; + //#endregion }, onDragstart(e) { e.dataTransfer.effectAllowed = 'move'; - e.dataTransfer.setData('text', JSON.stringify({ - type: 'folder', - id: this.folder.id - })); + e.dataTransfer.setData('mk_drive_folder', JSON.stringify(this.folder)); this.isDragging = true; // 親ブラウザに対して、ドラッグが開始されたフラグを立てる diff --git a/src/web/app/desktop/views/components/drive.nav-folder.vue b/src/web/app/desktop/views/components/drive.nav-folder.vue index 4c51285881..a5677dcb4d 100644 --- a/src/web/app/desktop/views/components/drive.nav-folder.vue +++ b/src/web/app/desktop/views/components/drive.nav-folder.vue @@ -41,13 +41,17 @@ export default Vue.extend({ // このフォルダがルートかつカレントディレクトリならドロップ禁止 if (this.folder == null && this.browser.folder == null) { e.dataTransfer.dropEffect = 'none'; - // ドラッグされてきたものがファイルだったら - } else if (e.dataTransfer.effectAllowed == 'all') { - e.dataTransfer.dropEffect = 'copy'; + } + + const isFile = e.dataTransfer.items[0].kind == 'file'; + const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file'; + const isDriveFolder = e.dataTransfer.types[0] == 'mk_drive_folder'; + + if (isFile || isDriveFile || isDriveFolder) { + e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; } else { - e.dataTransfer.dropEffect = 'move'; + e.dataTransfer.dropEffect = 'none'; } - return false; }, onDragenter() { if (this.folder || this.browser.folder) this.draghover = true; @@ -63,38 +67,34 @@ export default Vue.extend({ Array.from(e.dataTransfer.files).forEach(file => { this.browser.upload(file, this.folder); }); - return false; - }; - - // データ取得 - const data = e.dataTransfer.getData('text'); - if (data == null) return false; - - // パース - // TODO: Validate JSON - const obj = JSON.parse(data); + return; + } - // (ドライブの)ファイルだったら - if (obj.type == 'file') { - const file = obj.id; - this.browser.removeFile(file); + //#region ドライブのファイル + const driveFile = e.dataTransfer.getData('mk_drive_file'); + if (driveFile != null && driveFile != '') { + const file = JSON.parse(driveFile); + this.browser.removeFile(file.id); (this as any).api('drive/files/update', { - file_id: file, + file_id: file.id, folder_id: this.folder ? this.folder.id : null }); - // (ドライブの)フォルダーだったら - } else if (obj.type == 'folder') { - const folder = obj.id; + } + //#endregion + + //#region ドライブのフォルダ + const driveFolder = e.dataTransfer.getData('mk_drive_folder'); + if (driveFolder != null && driveFolder != '') { + const folder = JSON.parse(driveFolder); // 移動先が自分自身ならreject - if (this.folder && folder == this.folder.id) return false; - this.browser.removeFolder(folder); + if (this.folder && folder.id == this.folder.id) return; + this.browser.removeFolder(folder.id); (this as any).api('drive/folders/update', { - folder_id: folder, + folder_id: folder.id, parent_id: this.folder ? this.folder.id : null }); } - - return false; + //#endregion } } }); diff --git a/src/web/app/desktop/views/components/drive.vue b/src/web/app/desktop/views/components/drive.vue index ffe0c68dec..7c4b08d3f0 100644 --- a/src/web/app/desktop/views/components/drive.vue +++ b/src/web/app/desktop/views/components/drive.vue @@ -235,15 +235,21 @@ export default Vue.extend({ }, onDragover(e): any { - // ドラッグ元が自分自身の所有するアイテムかどうか - if (!this.isDragSource) { - // ドラッグされてきたものがファイルだったら + // ドラッグ元が自分自身の所有するアイテムだったら + if (this.isDragSource) { + // 自分自身にはドロップさせない + e.dataTransfer.dropEffect = 'none'; + return; + } + + const isFile = e.dataTransfer.items[0].kind == 'file'; + const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file'; + const isDriveFolder = e.dataTransfer.types[0] == 'mk_drive_folder'; + + if (isFile || isDriveFile || isDriveFolder) { e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; - this.draghover = true; } else { - // 自分自身にはドロップさせない e.dataTransfer.dropEffect = 'none'; - return false; } }, @@ -263,38 +269,36 @@ export default Vue.extend({ Array.from(e.dataTransfer.files).forEach(file => { this.upload(file, this.folder); }); - return false; + return; } - // データ取得 - const data = e.dataTransfer.getData('text'); - if (data == null) return false; - - // パース - // TODO: JSONじゃなかったら中断 - const obj = JSON.parse(data); - - // (ドライブの)ファイルだったら - if (obj.type == 'file') { - const file = obj.id; - if (this.files.some(f => f.id == file)) return false; - this.removeFile(file); + //#region ドライブのファイル + const driveFile = e.dataTransfer.getData('mk_drive_file'); + if (driveFile != null && driveFile != '') { + const file = JSON.parse(driveFile); + if (this.files.some(f => f.id == file.id)) return; + this.removeFile(file.id); (this as any).api('drive/files/update', { - file_id: file, + file_id: file.id, folder_id: this.folder ? this.folder.id : null }); - // (ドライブの)フォルダーだったら - } else if (obj.type == 'folder') { - const folder = obj.id; + } + //#endregion + + //#region ドライブのフォルダ + const driveFolder = e.dataTransfer.getData('mk_drive_folder'); + if (driveFolder != null && driveFolder != '') { + const folder = JSON.parse(driveFolder); + // 移動先が自分自身ならreject - if (this.folder && folder == this.folder.id) return false; - if (this.folders.some(f => f.id == folder)) return false; - this.removeFolder(folder); + if (this.folder && folder.id == this.folder.id) return false; + if (this.folders.some(f => f.id == folder.id)) return false; + this.removeFolder(folder.id); (this as any).api('drive/folders/update', { - folder_id: folder, + folder_id: folder.id, parent_id: this.folder ? this.folder.id : null }).then(() => { - // something + // noop }).catch(err => { switch (err) { case 'detected-circular-definition': @@ -311,8 +315,7 @@ export default Vue.extend({ } }); } - - return false; + //#endregion }, selectLocalFile() { diff --git a/src/web/app/desktop/views/components/post-form.vue b/src/web/app/desktop/views/components/post-form.vue index 4d43d98d75..b94b0f8533 100644 --- a/src/web/app/desktop/views/components/post-form.vue +++ b/src/web/app/desktop/views/components/post-form.vue @@ -1,9 +1,9 @@ <template> <div class="mk-post-form" - @dragover.prevent.stop="onDragover" + @dragover.stop="onDragover" @dragenter="onDragenter" @dragleave="onDragleave" - @drop.prevent.stop="onDrop" + @drop.stop="onDrop" > <div class="content"> <textarea :class="{ with: (files.length != 0 || poll) }" @@ -159,8 +159,13 @@ export default Vue.extend({ }); }, onDragover(e) { - this.draghover = true; - e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; + const isFile = e.dataTransfer.items[0].kind == 'file'; + const isDriveFile = e.dataTransfer.types[0] == 'mk_drive_file'; + if (isFile || isDriveFile) { + e.preventDefault(); + this.draghover = true; + e.dataTransfer.dropEffect = e.dataTransfer.effectAllowed == 'all' ? 'copy' : 'move'; + } }, onDragenter(e) { this.draghover = true; @@ -173,26 +178,20 @@ export default Vue.extend({ // ファイルだったら if (e.dataTransfer.files.length > 0) { + e.preventDefault(); Array.from(e.dataTransfer.files).forEach(this.upload); return; } - // データ取得 - const data = e.dataTransfer.getData('text'); - if (data == null) return; - - try { - // パース - const obj = JSON.parse(data); - - // (ドライブの)ファイルだったら - if (obj.type == 'file') { - this.files.push(obj.file); - this.$emit('change-attached-media', this.files); - } - } catch (e) { - // not a json, so noop + //#region ドライブのファイル + const driveFile = e.dataTransfer.getData('mk_drive_file'); + if (driveFile != null && driveFile != '') { + const file = JSON.parse(driveFile); + this.files.push(file); + this.$emit('change-attached-media', this.files); + e.preventDefault(); } + //#endregion }, post() { this.posting = true; |