Skip to content

Commit 38508e8

Browse files
authored
Merge pull request #6632 from LibreSign/feat/limit-max-upload-files
Feat: limit max upload files
2 parents a50c9a5 + 21c3b5f commit 38508e8

2 files changed

Lines changed: 38 additions & 2 deletions

File tree

src/components/Request/RequestPicker.vue

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,9 @@ import PlusIcon from 'vue-material-design-icons/Plus.vue'
109109
import UploadIcon from 'vue-material-design-icons/Upload.vue'
110110
111111
import { getCapabilities } from '@nextcloud/capabilities'
112+
import { loadState } from '@nextcloud/initial-state'
112113
import { showError } from '@nextcloud/dialogs'
113114
import { FilePickerVue as FilePicker } from '@nextcloud/dialogs/filepicker.js'
114-
import { loadState } from '@nextcloud/initial-state'
115115
116116
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
117117
import NcActions from '@nextcloud/vue/components/NcActions'
@@ -223,6 +223,18 @@ export default {
223223
},
224224
},
225225
methods: {
226+
getMaxFileUploads() {
227+
const capabilitiesMax = getCapabilities()?.libresign?.config?.upload?.['max-file-uploads']
228+
return Number.isFinite(capabilitiesMax) && capabilitiesMax > 0 ? Math.floor(capabilitiesMax) : 20
229+
},
230+
validateMaxFileUploads(filesCount) {
231+
const maxFileUploads = this.getMaxFileUploads()
232+
if (filesCount > maxFileUploads) {
233+
showError(t('libresign', 'You can upload at most {max} files at once.', { max: maxFileUploads }))
234+
return false
235+
}
236+
return true
237+
},
226238
handleEnvelopeNameSubmit() {
227239
const trimmedName = this.envelopeNameInput.trim()
228240
if (trimmedName.length >= ENVELOPE_NAME_MIN_LENGTH && this.pendingFiles.length > 0) {
@@ -250,6 +262,10 @@ export default {
250262
this.loading = false
251263
},
252264
async upload(files, envelopeName = null) {
265+
if (!this.validateMaxFileUploads(files.length)) {
266+
return
267+
}
268+
253269
this.loading = true
254270
this.isUploading = true
255271
this.uploadProgress = 0
@@ -318,10 +334,14 @@ export default {
318334
const input = document.createElement('input')
319335
input.accept = 'application/pdf'
320336
input.type = 'file'
321-
input.multiple = this.envelopeEnabled
337+
input.multiple = this.envelopeEnabled && this.getMaxFileUploads() > 1
322338
323339
input.onchange = async (ev) => {
324340
const files = Array.from(ev.target.files)
341+
if (!this.validateMaxFileUploads(files.length)) {
342+
input.remove()
343+
return
344+
}
325345
326346
if (files.length > 1 && this.envelopeEnabled) {
327347
this.pendingFiles = files

src/components/RightSidebar/EnvelopeFilesList.vue

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,19 @@ export default {
343343
this.clearMessages()
344344
this.errorMessage = message
345345
},
346+
getMaxFileUploads() {
347+
const capabilitiesMax = getCapabilities()?.libresign?.config?.upload?.['max-file-uploads']
348+
const max = Number.isFinite(capabilitiesMax) ? capabilitiesMax : 20
349+
return max > 0 ? Math.floor(max) : 20
350+
},
351+
validateMaxFileUploads(filesCount) {
352+
const maxFileUploads = this.getMaxFileUploads()
353+
if (filesCount > maxFileUploads) {
354+
this.showError(this.t('libresign', 'You can upload at most {max} files at once.', { max: maxFileUploads }))
355+
return false
356+
}
357+
return true
358+
},
346359
getPreviewUrl(file) {
347360
if (!file.nodeId) return null
348361
const url = new URL(
@@ -418,6 +431,9 @@ export default {
418431
input.onchange = async (e) => {
419432
const files = e.target.files
420433
if (!files || files.length === 0) return
434+
if (!this.validateMaxFileUploads(files.length)) {
435+
return
436+
}
421437
422438
this.hasLoading = true
423439
this.isUploading = true

0 commit comments

Comments
 (0)