2020 -
2121 -->
2222<template >
23- <Fragment >
24- <!-- Drag and drop notice -->
25- <DragAndDropNotice v-if =" canUpload && filesListWidth >= 512"
26- :current-folder =" currentFolder"
27- :dragover.sync =" dragover"
28- :style =" { height: dndNoticeHeight }" />
29-
30- <VirtualList ref =" table"
31- :data-component =" userConfig.grid_view ? FileEntryGrid : FileEntry"
32- :data-key =" 'source'"
33- :data-sources =" nodes"
34- :grid-mode =" userConfig.grid_view"
35- :extra-props =" {
36- isMtimeAvailable,
37- isSizeAvailable,
38- nodes,
39- filesListWidth,
40- }"
41- :scroll-to-index =" scrollToIndex"
42- :caption =" caption"
43- @scroll =" onScroll" >
44- <template #before >
45- <!-- Headers -->
46- <FilesListHeader v-for =" header in sortedHeaders"
47- :key =" header.id"
48- :current-folder =" currentFolder"
49- :current-view =" currentView"
50- :header =" header" />
51- </template >
52-
53- <!-- Thead-->
54- <template #header >
55- <!-- Table header and sort buttons -->
56- <FilesListTableHeader ref =" thead"
57- :files-list-width =" filesListWidth"
58- :is-mtime-available =" isMtimeAvailable"
59- :is-size-available =" isSizeAvailable"
60- :nodes =" nodes" />
61- </template >
62-
63- <!-- Tfoot-->
64- <template #footer >
65- <FilesListTableFooter :files-list-width =" filesListWidth"
66- :is-mtime-available =" isMtimeAvailable"
67- :is-size-available =" isSizeAvailable"
68- :nodes =" nodes"
69- :summary =" summary" />
70- </template >
71- </VirtualList >
72- </Fragment >
23+ <VirtualList ref =" table"
24+ :data-component =" userConfig.grid_view ? FileEntryGrid : FileEntry"
25+ :data-key =" 'source'"
26+ :data-sources =" nodes"
27+ :grid-mode =" userConfig.grid_view"
28+ :extra-props =" {
29+ isMtimeAvailable,
30+ isSizeAvailable,
31+ nodes,
32+ filesListWidth,
33+ }"
34+ :scroll-to-index =" scrollToIndex"
35+ :caption =" caption" >
36+ <template #before >
37+ <!-- Headers -->
38+ <FilesListHeader v-for =" header in sortedHeaders"
39+ :key =" header.id"
40+ :current-folder =" currentFolder"
41+ :current-view =" currentView"
42+ :header =" header" />
43+ </template >
44+
45+ <!-- Thead-->
46+ <template #header >
47+ <!-- Table header and sort buttons -->
48+ <FilesListTableHeader ref =" thead"
49+ :files-list-width =" filesListWidth"
50+ :is-mtime-available =" isMtimeAvailable"
51+ :is-size-available =" isSizeAvailable"
52+ :nodes =" nodes" />
53+ </template >
54+
55+ <!-- Tfoot-->
56+ <template #footer >
57+ <FilesListTableFooter :files-list-width =" filesListWidth"
58+ :is-mtime-available =" isMtimeAvailable"
59+ :is-size-available =" isSizeAvailable"
60+ :nodes =" nodes"
61+ :summary =" summary" />
62+ </template >
63+ </VirtualList >
7364</template >
7465
7566<script lang="ts">
7667import type { Node as NcNode } from ' @nextcloud/files'
7768import type { PropType } from ' vue'
78- import type { UserConfig } from ' ../types.ts '
69+ import type { UserConfig } from ' ../types'
7970
80- import { Fragment } from ' vue-frag'
81- import { getFileListHeaders , Folder , View , Permission , getFileActions } from ' @nextcloud/files'
71+ import { getFileListHeaders , Folder , View , getFileActions } from ' @nextcloud/files'
8272import { showError } from ' @nextcloud/dialogs'
8373import { loadState } from ' @nextcloud/initial-state'
8474import { translate as t , translatePlural as n } from ' @nextcloud/l10n'
85- import Vue from ' vue'
75+ import { defineComponent } from ' vue'
8676
8777import { action as sidebarAction } from ' ../actions/sidebarAction.ts'
8878import { useUserConfigStore } from ' ../store/userconfig.ts'
89- import DragAndDropNotice from ' ./DragAndDropNotice.vue '
79+
9080import FileEntry from ' ./FileEntry.vue'
9181import FileEntryGrid from ' ./FileEntryGrid.vue'
9282import FilesListHeader from ' ./FilesListHeader.vue'
9383import FilesListTableFooter from ' ./FilesListTableFooter.vue'
9484import FilesListTableHeader from ' ./FilesListTableHeader.vue'
9585import filesListWidthMixin from ' ../mixins/filesListWidth.ts'
96- import logger from ' ../logger.js'
9786import VirtualList from ' ./VirtualList.vue'
87+ import logger from ' ../logger.js'
9888
99- export default Vue . extend ({
89+ export default defineComponent ({
10090 name: ' FilesListVirtual' ,
10191
10292 components: {
103- DragAndDropNotice ,
10493 FilesListHeader ,
10594 FilesListTableFooter ,
10695 FilesListTableHeader ,
107- Fragment ,
10896 VirtualList ,
10997 },
11098
@@ -140,7 +128,6 @@ export default Vue.extend({
140128 FileEntryGrid ,
141129 headers: getFileListHeaders (),
142130 scrollToIndex: 0 ,
143- dragover: false ,
144131 dndNoticeHeight: 0 ,
145132 }
146133 },
@@ -192,10 +179,6 @@ export default Vue.extend({
192179 return [... this .headers ].sort ((a , b ) => a .order - b .order )
193180 },
194181
195- canUpload() {
196- return this .currentFolder && (this .currentFolder .permissions & Permission .CREATE ) !== 0
197- },
198-
199182 caption() {
200183 const defaultCaption = t (' files' , ' List of files and folders.' )
201184 const viewCaption = this .currentView .caption || defaultCaption
@@ -215,12 +198,15 @@ export default Vue.extend({
215198 // Add events on parent to cover both the table and DragAndDrop notice
216199 const mainContent = window .document .querySelector (' main.app-content' ) as HTMLElement
217200 mainContent .addEventListener (' dragover' , this .onDragOver )
218- mainContent .addEventListener (' dragleave' , this .onDragLeave )
219201
220202 this .scrollToFile (this .fileId )
221203 this .openSidebarForFile (this .fileId )
222204 this .handleOpenFile ()
205+ },
223206
207+ beforeDestroy() {
208+ const mainContent = window .document .querySelector (' main.app-content' ) as HTMLElement
209+ mainContent .removeEventListener (' dragover' , this .onDragOver )
224210 },
225211
226212 methods: {
@@ -274,9 +260,7 @@ export default Vue.extend({
274260 // Detect if we're only dragging existing files or not
275261 const isForeignFile = event .dataTransfer ?.types .includes (' Files' )
276262 if (isForeignFile ) {
277- this .dragover = true
278- } else {
279- this .dragover = false
263+ return
280264 }
281265
282266 event .preventDefault ()
@@ -296,21 +280,6 @@ export default Vue.extend({
296280 this .$refs .table .$el .scrollTop = this .$refs .table .$el .scrollTop + 25
297281 }
298282 },
299- onDragLeave(event : DragEvent ) {
300- // Counter bubbling, make sure we're ending the drag
301- // only when we're leaving the current element
302- const currentTarget = event .currentTarget as HTMLElement
303- if (currentTarget ?.contains (event .relatedTarget as HTMLElement )) {
304- return
305- }
306-
307- this .dragover = false
308- },
309-
310- onScroll() {
311- // Update the sticky position of the thead to adapt to the scroll
312- this .dndNoticeHeight = (this .$refs .thead .$el ?.getBoundingClientRect ?.()?.top ?? 0 ) + ' px'
313- },
314283
315284 t ,
316285 },
0 commit comments