2525 class =" files-list__drag-drop-notice"
2626 @drop =" onDrop" >
2727 <div class =" files-list__drag-drop-notice-wrapper" >
28- <TrayArrowDownIcon :size =" 48" />
29- <h3 class =" files-list-drag-drop-notice__title" >
30- {{ t('files', 'Drag and drop files here to upload') }}
31- </h3 >
28+ <template v-if =" canUpload && ! isQuotaExceeded " >
29+ <TrayArrowDownIcon :size =" 48" />
30+ <h3 class =" files-list-drag-drop-notice__title" >
31+ {{ t('files', 'Drag and drop files here to upload') }}
32+ </h3 >
33+ </template >
34+
35+ <!-- Not permitted to drop files here -->
36+ <template v-else >
37+ <h3 class =" files-list-drag-drop-notice__title" >
38+ {{ cantUploadLabel }}
39+ </h3 >
40+ </template >
3241 </div >
3342 </div >
3443</template >
3544
3645<script lang="ts">
37- import { translate as t } from ' @nextcloud/l10n'
3846import { defineComponent } from ' vue'
47+ import { Folder , Permission } from ' @nextcloud/files'
48+ import { showError , showSuccess } from ' @nextcloud/dialogs'
49+ import { translate as t } from ' @nextcloud/l10n'
3950
4051import TrayArrowDownIcon from ' vue-material-design-icons/TrayArrowDown.vue'
4152
4253import logger from ' ../logger.js'
4354import { handleDrop } from ' ../services/DropService'
44- import { showSuccess } from ' @nextcloud/dialogs'
4555
4656export default defineComponent ({
4757 name: ' DragAndDropNotice' ,
@@ -52,7 +62,7 @@ export default defineComponent({
5262
5363 props: {
5464 currentFolder: {
55- type: Object ,
65+ type: Folder ,
5666 required: true ,
5767 },
5868 },
@@ -63,35 +73,86 @@ export default defineComponent({
6373 }
6474 },
6575
76+ computed: {
77+ /**
78+ * Check if the current folder has create permissions
79+ */
80+ canUpload() {
81+ return this .currentFolder && (this .currentFolder .permissions & Permission .CREATE ) !== 0
82+ },
83+ isQuotaExceeded() {
84+ return this .currentFolder ?.attributes ?.[' quota-available-bytes' ] === 0
85+ },
86+
87+ cantUploadLabel() {
88+ if (this .isQuotaExceeded ) {
89+ return this .t (' files' , ' Your have used your space quota and cannot upload files anymore' )
90+ } else if (! this .canUpload ) {
91+ return this .t (' files' , ' You don’t have permission to upload or create files here' )
92+ }
93+ return null
94+ },
95+ },
96+
6697 mounted() {
6798 // Add events on parent to cover both the table and DragAndDrop notice
6899 const mainContent = window .document .querySelector (' main.app-content' ) as HTMLElement
69100 mainContent .addEventListener (' dragover' , this .onDragOver )
70101 mainContent .addEventListener (' dragleave' , this .onDragLeave )
102+ mainContent .addEventListener (' drop' , this .onContentDrop )
71103 },
72104
73105 beforeDestroy() {
74106 const mainContent = window .document .querySelector (' main.app-content' ) as HTMLElement
75107 mainContent .removeEventListener (' dragover' , this .onDragOver )
76108 mainContent .removeEventListener (' dragleave' , this .onDragLeave )
109+ mainContent .removeEventListener (' drop' , this .onContentDrop )
77110 },
78111
79112 methods: {
80113 onDragOver(event : DragEvent ) {
114+ // Needed to keep the drag/drop events chain working
115+ event .preventDefault ()
116+
81117 const isForeignFile = event .dataTransfer ?.types .includes (' Files' )
118+
119+ logger .debug (' Drag over DragAndDropNotice' , { isForeignFile , event })
82120 if (isForeignFile ) {
83- // Only handle uploading
121+ // Only handle uploading of outside files (not Nextcloud files)
84122 this .dragover = true
85123 }
86124 },
87125
88- onDragLeave(/* event: DragEvent */ ) {
126+ onDragLeave(event : DragEvent ) {
127+ // Counter bubbling, make sure we're ending the drag
128+ // only when we're leaving the current element
129+ // Avoid flickering
130+ const currentTarget = event .currentTarget as HTMLElement
131+ if (currentTarget ?.contains (event .relatedTarget as HTMLElement )) {
132+ return
133+ }
134+
135+ if (this .dragover ) {
136+ this .dragover = false
137+ }
138+ },
139+
140+ onContentDrop(event : DragEvent ) {
141+ logger .debug (' Drag and drop cancelled, dropped on empty space' , { event })
142+ event .preventDefault ()
89143 if (this .dragover ) {
90144 this .dragover = false
91145 }
92146 },
93147
94148 onDrop(event : DragEvent ) {
149+ logger .debug (' Dropped on DragAndDropNotice' , { event , error: this .cantUploadLabel })
150+
151+ if (! this .canUpload || this .isQuotaExceeded ) {
152+ showError (this .cantUploadLabel )
153+ return
154+ }
155+
95156 if (this .$el .querySelector (' tbody' )?.contains (event .target as Node )) {
96157 return
97158 }
0 commit comments