|
|
|
@ -27,12 +27,7 @@ |
|
|
|
|
:data-cy-files-list-row-name="source.basename" |
|
|
|
|
:draggable="canDrag" |
|
|
|
|
class="files-list__row" |
|
|
|
|
@contextmenu="onRightClick" |
|
|
|
|
@dragover="onDragOver" |
|
|
|
|
@dragleave="onDragLeave" |
|
|
|
|
@dragstart="onDragStart" |
|
|
|
|
@dragend="onDragEnd" |
|
|
|
|
@drop="onDrop"> |
|
|
|
|
v-on="rowListeners"> |
|
|
|
|
<!-- Failed indicator --> |
|
|
|
|
<span v-if="source.attributes.failed" class="files-list__row--failed" /> |
|
|
|
|
|
|
|
|
@ -110,7 +105,7 @@ import { showError } from '@nextcloud/dialogs' |
|
|
|
|
import { translate as t } from '@nextcloud/l10n' |
|
|
|
|
import { vOnClickOutside } from '@vueuse/components' |
|
|
|
|
import moment from '@nextcloud/moment' |
|
|
|
|
import Vue from 'vue' |
|
|
|
|
import Vue, { defineComponent } from 'vue' |
|
|
|
|
|
|
|
|
|
import { action as sidebarAction } from '../actions/sidebarAction.ts' |
|
|
|
|
import { getDragAndDropPreview } from '../utils/dragUtils.ts' |
|
|
|
@ -132,7 +127,7 @@ import logger from '../logger.js' |
|
|
|
|
|
|
|
|
|
Vue.directive('onClickOutside', vOnClickOutside) |
|
|
|
|
|
|
|
|
|
export default Vue.extend({ |
|
|
|
|
export default defineComponent({ |
|
|
|
|
name: 'FileEntry', |
|
|
|
|
|
|
|
|
|
components: { |
|
|
|
@ -194,6 +189,26 @@ export default Vue.extend({ |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
computed: { |
|
|
|
|
/** |
|
|
|
|
* Conditionally add drag and drop listeners |
|
|
|
|
* Do not add drag start and over listeners on renaming to allow to drag and drop text |
|
|
|
|
*/ |
|
|
|
|
rowListeners() { |
|
|
|
|
const conditionals = this.isRenaming |
|
|
|
|
? {} |
|
|
|
|
: { |
|
|
|
|
dragstart: this.onDragStart, |
|
|
|
|
dragover: this.onDragOver, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
...conditionals, |
|
|
|
|
contextmenu: this.onRightClick, |
|
|
|
|
dragleave: this.onDragLeave, |
|
|
|
|
dragend: this.onDragEnd, |
|
|
|
|
drop: this.onDrop, |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
currentView(): View { |
|
|
|
|
return this.$navigation.active as View |
|
|
|
|
}, |
|
|
|
@ -303,6 +318,10 @@ export default Vue.extend({ |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
canDrag() { |
|
|
|
|
if (this.isRenaming) { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const canDrag = (node: Node): boolean => { |
|
|
|
|
return (node?.permissions & Permission.UPDATE) !== 0 |
|
|
|
|
} |
|
|
|
@ -449,7 +468,12 @@ export default Vue.extend({ |
|
|
|
|
logger.debug('Drag ended') |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
async onDrop(event) { |
|
|
|
|
async onDrop(event: DragEvent) { |
|
|
|
|
// skip if native drop like text drag and drop from files names |
|
|
|
|
if (!this.draggingFiles && !event.dataTransfer?.files?.length) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
event.preventDefault() |
|
|
|
|
event.stopPropagation() |
|
|
|
|
|
|
|
|
|