{{-- Upload Handler — gerencia o fluxo de drop/captura de arquivo e envio --}} const handleDirectDroppedFile = (file) => { var isImage = file && file.type.startsWith('image/'); var isAudio = file && (file.type.startsWith('audio/') || ['application/ogg', 'application/x-cdf'].indexOf(file.type) !== -1); var isExcel = file && (file.name.endsWith('.xlsx') || file.name.endsWith('.xls') || file.name.endsWith('.csv') || file.type.indexOf('spreadsheet') !== -1 || file.type.indexOf('excel') !== -1); var isPdf = file && file.type === 'application/pdf'; fileToUpload = file; /* Oculta feedbacks anteriores */ $('#gallery-audio-wrapper-' + pickerId).hide(); $('#gallery-excel-wrapper-' + pickerId).hide(); $('#gallery-document-wrapper-' + pickerId).hide(); $('#gallery-cropper-wrapper-' + pickerId).hide(); /* Pré-preenche a descrição com o nome do arquivo */ $('#upload-media-desc-' + pickerId).val(file.name); if (isImage) { /* Interface com Cropper para imagens */ var reader = new FileReader(); reader.onload = function(event) { var $cropImage = $('#gallery-cropper-image-' + pickerId); $cropImage.attr('src', event.target.result); $('#upload-fields-container-' + pickerId).hide(); $('#gallery-cropper-wrapper-' + pickerId).show(); $('#btn-register-upload-' + pickerId).show(); if (cropperInstance) { cropperInstance.destroy(); } cropperInstance = new Cropper($cropImage[0], { viewMode: 1, autoCropArea: 1, responsive: true }); }; reader.readAsDataURL(file); } else { /* Não-imagem: oculta dropzone, mostra feedback e botão Registrar */ $('#upload-fields-container-' + pickerId).hide(); $('#btn-register-upload-' + pickerId).show(); if (isAudio) { $('#gallery-audio-filename-' + pickerId).text(file.name + ' (' + (file.size / 1024 / 1024).toFixed(2) + ' MB)'); $('#gallery-audio-wrapper-' + pickerId).show(); } else if (isExcel) { $('#gallery-excel-filename-' + pickerId).text(file.name + ' (' + (file.size / 1024).toFixed(2) + ' KB)'); $('#gallery-excel-wrapper-' + pickerId).show(); } else { $('#gallery-document-filename-' + pickerId).text(file.name + ' (' + (file.size / 1024 / 1024).toFixed(2) + ' MB)'); $('#gallery-document-wrapper-' + pickerId).show(); } } }; const performUpload = (file) => { var altText = $('#upload-media-alt-' + pickerId).val(); var desc = $('#upload-media-desc-' + pickerId).val(); var isShared = $('#upload-media-shared-' + pickerId).is(':checked') ? '1' : '0'; var formData = new FormData(); formData.append('file', file); formData.append('owner_module', ownerModule); formData.append('is_shared', isShared); formData.append('file_alt', altText); formData.append('description', desc); formData.append('allowed_mime_types', filterMimeTypes); formData.append('_token', csrfToken); $.ajax({ url: urls.store, type: 'POST', data: formData, processData: false, contentType: false, headers: { 'X-CSRF-TOKEN': csrfToken }, success: function(anexo) { selectMedia(anexo.id, '/storage/' + anexo.file_path, anexo.alt_text, anexo.mime_type || '', anexo.description || ''); if (typeof toastr !== 'undefined') toastr.success('Upload concluído!'); /* Reseta o input file para permitir novos uploads */ var container = document.getElementById('upload-drop-segment-' + pickerId); var fileInput = container ? container.querySelector('#media-input-gallery_file_' + pickerId) : null; if (fileInput) { fileInput.value = ''; } destroyCropper(); }, error: function(xhr) { var msg = xhr.responseJSON && xhr.responseJSON.message ? xhr.responseJSON.message : 'Erro ao realizar upload.'; if (typeof toastr !== 'undefined') toastr.error(msg); } }); }; /* Escuta alteração do input file interno do dropzone */ $(document).on('change', '#media-input-gallery_file_' + pickerId, function(e) { var file = e.target.files[0]; if (file) { handleDirectDroppedFile(file); } });