'use strict'; // FIXME: remove once using react-components import fineUploader from 'exports?qq!./vendor/s3.fine-uploader'; import MimeTypes from '../../constants/mime_types'; // Re-export qq.status from FineUploader with an additional online // state that we use to keep track of files from S3. export const FileStatus = Object.assign({}, fineUploader.status, { ONLINE: 'online' }); export const formSubmissionValidation = { /** * Returns a boolean if there has been at least one file uploaded * successfully without it being deleted or canceled. * @param {array of files} files provided by react fine uploader * @return {boolean} */ atLeastOneUploadedFile(files) { files = files.filter((file) => { return file.status !== FileStatus.DELETED && file.status !== FileStatus.CANCELED && file.status != FileStatus.UPLOADED_FAILED }); if (files.length && files[0].status === FileStatus.UPLOAD_SUCCESSFUL) { return true; } else { return false; } }, /** * File submission for the form is optional, but if the user decides to submit a file * the form is not ready until there are no more files currently uploading. * @param {array of files} files files provided by react fine uploader * @return {boolean} [description] */ fileOptional(files) { const uploadingFiles = files.filter((file) => file.status === FileStatus.SUBMITTING); return uploadingFiles.length === 0; } }; /** * Filter function for filtering all deleted, canceled, and failed files * @param {object} file A file from filesToUpload that has status as a prop. * @return {boolean} */ export function displayValidFilesFilter(file) { return file.status !== FileStatus.DELETED && file.status !== FileStatus.CANCELED && file.status !== FileStatus.UPLOAD_FAILED; } /** * Filter function for filtering all files except for deleted, canceled, and failed files * @param {object} file A file from filesToUpload that has status as a prop. * @return {boolean} */ export function displayRemovedFilesFilter(file) { return file.status === FileStatus.DELETED || file.status === FileStatus.CANCELED || file.status === FileStatus.UPLOAD_FAILED; } /** * Filter function for which files to integrate in the progress process * @param {object} file A file from filesToUpload, that has a status as a prop. * @return {boolean} */ export function displayValidProgressFilesFilter(file) { return file.status !== FileStatus.DELETED && file.status !== FileStatus.CANCELED && file.status !== FileStatus.UPLOAD_FAILED && file.status !== FileStatus.ONLINE; } /** * Fineuploader allows to specify the file extensions that are allowed to upload. * For our self defined input, we can reuse those declarations to restrict which files * the user can pick from his hard drive. * * Takes an array of file extensions (['pdf', 'png', ...]) and transforms them into a string * that can be passed into an html5 input via its 'accept' prop. * @param {array} allowedExtensions Array of strings without a dot prefixed * @return {string} Joined string (comma-separated) of the passed-in array */ export function transformAllowedExtensionsToInputAcceptProp(allowedExtensions) { // Get the mime type of the extension if it's defined or add a dot in front of the extension // This is important for Safari as it doesn't understand just the extension. const prefixedAllowedExtensions = allowedExtensions.map((ext) => { return MimeTypes[ext] || ('.' + ext); }); // generate a comma separated list to add them to the DOM element // See: http://stackoverflow.com/questions/4328947/limit-file-format-when-using-input-type-file return prefixedAllowedExtensions.join(', '); }