From a92a1a705fde349b9837d3320dc06045e6da0be6 Mon Sep 17 00:00:00 2001 From: q404365631 <398291278@qq.com> Date: Sat, 25 Apr 2026 14:56:06 +0800 Subject: [PATCH 1/2] Add file upload view component --- src/documents/scripts/views/upload.js.coffee | 111 +++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/documents/scripts/views/upload.js.coffee diff --git a/src/documents/scripts/views/upload.js.coffee b/src/documents/scripts/views/upload.js.coffee new file mode 100644 index 0000000..96dacca --- /dev/null +++ b/src/documents/scripts/views/upload.js.coffee @@ -0,0 +1,111 @@ +# Import +$ = window.$ +{View} = require('./base') +{File} = require('../models/file') +{wait, thrower} = require('../util') + +# View +class FileUploadItem extends View + el: $('.file-upload').remove().first().prop('outerHTML') + + elements: + '.file-input': '$fileInput' + '.file-dropzone': '$dropzone' + '.upload-progress': '$progress' + '.upload-list': '$uploadList' + + events: + 'change .file-input': 'onFileSelect' + 'dragover .file-dropzone': 'onDragOver' + 'dragleave .file-dropzone': 'onDragLeave' + 'drop .file-dropzone': 'onFileDrop' + 'click .upload-button': 'onUploadClick' + + render: => + # Prepare + {site, $el, $fileInput, $dropzone} = @ + + # Setup drag and drop + $dropzone.on 'dragover', (e) => + e.preventDefault() + $dropzone.addClass('drag-over') + + $dropzone.on 'dragleave', (e) => + e.preventDefault() + $dropzone.removeClass('drag-over') + + $dropzone.on 'drop', (e) => + e.preventDefault() + $dropzone.removeClass('drag-over') + files = e.originalEvent.dataTransfer.files + @uploadFiles(files) + + # Chain + @ + + onFileSelect: (e) => + files = e.target.files + @uploadFiles(files) + + onUploadClick: (e) => + @$fileInput.click() + + uploadFiles: (files) => + return unless files?.length + + for file in files + @uploadFile(file) + + uploadFile: (file) => + {site} = @ + return unless site + + # Create form data + formData = new FormData() + formData.append('file', file) + formData.append('securityToken', site.get('token')) + + # Upload URL + uploadUrl = "#{site.get('url')}/restapi/upload" + + # Create upload item + $uploadItem = $('