(function(global) { 'use strict'; // Copy from clipboard global.copyFromClipboard = (function() { var UPLOADED_IMAGE = {}; var LOCATION = ''; function init(location) { LOCATION = location; global.addEventListener('paste', _listener, false); $.initTooltips(); }; function destroy() { global.removeEventListener('paste', _listener, false); } function _listener(pasteEvent) { _retrieveImageFromClipboardAsBlob(pasteEvent, function(imageBlob) { if(imageBlob){ _clipboardPasteModal().promise().done(function() { var canvas = document.getElementById('clipboardPreview'); var ctx = canvas.getContext('2d'); var img = new Image(); img.onload = function() { canvas.width = this.width; canvas.height = this.height; ctx.drawImage(img, 0, 0); }; var URLObj = window.URL || window.webkitURL; img.src = URLObj.createObjectURL(imageBlob); var extension = imageBlob.name.slice( (Math.max(0, imageBlob.name.lastIndexOf(".")) || Infinity) + 1 ); $('#image-name').html('.' + extension); // add extension near file name // temporary store image blob UPLOADED_IMAGE = imageBlob }); } }); } function _retrieveImageFromClipboardAsBlob(pasteEvent, callback){ if(pasteEvent.clipboardData == false) { if(typeof(callback) == "function"){ callback(undefined); } }; var items = pasteEvent.clipboardData.items; if(items == undefined){ if(typeof(callback) == "function"){ callback(undefined); } }; for (var i = 0; i < items.length; i++) { if (items[i].type.indexOf("image") == -1) continue; var blob = items[i].getAsFile(); if(typeof(callback) == "function") { callback(blob); } } }; // removes modal from dom function _destroyModalCallback() { var modal = $('#clipboardPreviewModal'); modal.on('hidden.bs.modal', function() { modal.modal('hide').promise().done(function() { modal.remove(); }); UPLOADED_IMAGE = {}; }); } function _closeModal() { _hideModalForGood(); $("#clipboardPreviewModal").remove(); } // $(..).modal('hide') don't work properly so here we manually remove the // displayed modal function _hideModalForGood(){ $("#clipboardPreviewModal").removeClass("in"); $(".modal-backdrop").remove(); $('body').removeClass('modal-open'); $('body').css('padding-right', ''); $("#clipboardPreviewModal").hide(); } function _addImageCallback() { $('[data-action="addImageFormClipboard"]').on('click', function() { var inputArray = []; var newName = $('#clipboardImageName').val(); // check if the name is set if( newName && newName.length > 0 ) { var extension = UPLOADED_IMAGE.name.slice( (Math.max(0, UPLOADED_IMAGE.name.lastIndexOf(".")) || Infinity) + 1 ); // hack to inject custom name in File object var name = newName + '.' + extension; var blob = UPLOADED_IMAGE.slice(0, UPLOADED_IMAGE.size, UPLOADED_IMAGE.type); // make new blob with the correct name; var newFile = new File([blob], name, { type: UPLOADED_IMAGE.type }); inputArray.push(newFile); } else { // return the default name inputArray.push(UPLOADED_IMAGE); } // close modal _closeModal(); // reuse file upload from drag'n drop :) if(LOCATION === 'steps') { DragNDropSteps.init(inputArray); } else { DragNDropResults.init(inputArray); } // clear all uploaded images UPLOADED_IMAGE = {}; }); } // Generate modal html and hook callbacks function _clipboardPasteModal() { var html = '
'; return $(html).appendTo($('body')).promise().done(function() { // display modal $('#clipboardPreviewModal').modal('show'); // add callback to remove modal from DOM _destroyModalCallback(); // add callback on image submit _addImageCallback(); }); } return Object.freeze({ init: init, destroy: destroy }); })(); // Module to handle file uploading in Steps global.DragNDropSteps = (function() { var droppedFiles = []; var filesValid = true; var totalSize = 0; var fileMaxSizeMb; var fileMaxSize; function init(files) { fileMaxSizeMb = $(document.body).data('file-max-size-mb'); fileMaxSize = fileMaxSizeMb * 1024 * 1024; for(var i = 0; i < files.length; i++) { droppedFiles.push(files[i]); } listItems(); } // return the status of files if they are ready to submit function filesStatus() { return filesValid; } function clearFiles() { droppedFiles = []; } // loops through a list of files and display each file in a separate panel function listItems() { totalSize = 0; _enableSubmitButton(); $('.attachment-placeholder.new').remove(); _dragNdropAssetsOff(); for(var i = 0; i < droppedFiles.length; i++) { $('.attachments.edit') .append(_uploadedAssetPreview(droppedFiles[i], i)) .promise() .done(function() { _removeItemHandler(i); }); } _validateTotalSize(); dragNdropAssetsInit('steps'); } // append the files to the form before submit function appendFilesToForm(ev) { var regex = /step\[assets_attributes\]\[[0-9]*\]\[id\]/; var prevEls = $('input').filter(function() { return this.name.match(regex); }); var fd = new FormData($(ev.target).closest('form').get(0)); for(var i = 0; i < droppedFiles.length; i++) { var index = i + prevEls.length; var name = 'step[assets_attributes][' + index + '][file]'; fd.append(name, droppedFiles[i]); } filesValid = true; totalSize = 0; _dragNdropAssetsOff(); return fd; } function _disableSubmitButton() { $('.step-save').prop('disabled', true); } function _enableSubmitButton() { $('.step-save').prop('disabled', false); } function _filerAndCheckFiles() { for(var i = 0; i < droppedFiles.length; i++) { if(droppedFiles[i].isValid == false) { return false; } } return (droppedFiles.length > 0); } function _validateFilesSize(file) { var fileSize = file.size; totalSize += parseInt(fileSize); if(fileSize > fileMaxSize) { file.isValid = false; _disableSubmitButton(); return "" + I18n.t('general.file.size_exceeded', { file_size: fileMaxSizeMb }) + '
'; } return ''; } function _validateTotalSize() { if(totalSize > fileMaxSize) { filesValid = false; _disableSubmitButton(); $.each($('.panel-step-attachment-new'), function() { if(!$(this).find('p').hasClass('dnd-total-error')) { $(this) .find('.panel-body') .append("" + I18n.t('general.file.total_size', { size: fileMaxSizeMb }) + '
'); } }); } else { $('.dnd-total-error').remove(); if(_filerAndCheckFiles()) { filesValid = true; _enableSubmitButton(); } } } function _uploadedAssetPreview(asset, i) { var html = ' '; return html; } function _removeItemHandler(id) { $('[data-item-id="' + id +'"]').off('click').on('click', function(e) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); var $el = $(this); var index = $el.data('item-id'); totalSize -= parseInt(droppedFiles[index].size); droppedFiles.splice(index, 1); listItems(); }); } function _dragNdropAssetsOff() { $('body').off('drag dragstart dragend dragover dragenter dragleave drop'); $('.is-dragover').hide(); // remove listeners for clipboard images copyFromClipboard.destroy(); } return Object.freeze({ init: init, appendFilesToForm: appendFilesToForm, listItems: listItems, filesStatus: filesStatus, clearFiles: clearFiles }); })(); // Module to handle file uploading in Results global.DragNDropResults = (function() { var droppedFiles = []; var isValid = true; var totalSize = 0; var fileMaxSizeMb; var fileMaxSize; function init(files) { fileMaxSizeMb = $(document.body).data('file-max-size-mb'); fileMaxSize = fileMaxSizeMb * 1024 * 1024; for(var i = 0; i < files.length; i++) { droppedFiles.push(files[i]); } listItems(); } // return the status of files if they are ready to submit function filesStatus() { return isValid; } // loops through a list of files and display each file in a separate panel function listItems() { totalSize = 0; $('.panel-result-attachment-new').remove(); if(droppedFiles.length < 1) { _disableSubmitButton(); } else { _dragNdropAssetsOff(); for(var i = 0; i < droppedFiles.length; i++) { $('#new-result-assets-select') .after(_uploadedAssetPreview(droppedFiles[i], i)) .promise() .done(function() { _removeItemHandler(i); }); } _validateTotalSize(); dragNdropAssetsInit('results'); } } // appent the files to the form before submit function _appendFilesToForm() { var regex = /result\[assets_attributes\]\[[0-9]*\]\[id\]/; var prevEls = $('input').filter(function() { return this.name.match(regex); }); var fd = new FormData(); var result_names = []; $.each($('input[rel="results[name]"]'), function() { result_names.push($(this).val()); }); result_names.reverse(); for(var i = 0; i < droppedFiles.length; i++) { var index = i + prevEls.length; var file_name = 'results_files[' + index + ']'; fd.append(file_name, droppedFiles[i]); fd.append('results_names[' + i + ']', result_names[i]); } destroyAll(); return fd; } function _disableSubmitButton() { $('.save-result').prop('disabled', true); } function _enableSubmitButton() { $('.save-result').prop('disabled', false); } function _filerAndCheckFiles() { for(var i = 0; i < droppedFiles.length; i++) { if(droppedFiles[i].isValid == false) { return false; } } return (droppedFiles.length > 0); } function _validateFilesSize(file) { var fileSize = file.size; totalSize += parseInt(fileSize); if(fileSize > fileMaxSize) { file.isValid = false; _disableSubmitButton(); return "" + I18n.t('general.file.size_exceeded', { file_size: fileMaxSizeMb }) + '
'; } return ''; } function _validateTotalSize() { if(totalSize > fileMaxSize) { isValid = false; _disableSubmitButton(); $.each($('.panel-result-attachment-new'), function() { if(!$(this).find('p').hasClass('dnd-total-error')) { $(this) .find('.panel-body') .append("" + I18n.t('general.file.total_size', { size: fileMaxSizeMb }) + '
'); } }); } else { $('.dnd-total-error').remove(); if(_filerAndCheckFiles()) { isValid = true; _enableSubmitButton(); } } } function validateTextSize(input) { if(input.value.length > <%= Constants::NAME_MAX_LENGTH %>) { $(input).parent().find('.dnd-error').remove(); $(input).after("<%= I18n.t('general.text.length_too_long', max_length: Constants::NAME_MAX_LENGTH) %>
"); isValid = false; } else { $(input).parent().find('.dnd-error').remove(); isValid = true; } } function _uploadedAssetPreview(asset, i) { var html = '