UNPKG

@progress/kendo-angular-upload

Version:

Kendo UI Angular Upload Component

230 lines (229 loc) 6.26 kB
/**----------------------------------------------------------------------------------------- * Copyright © 2025 Progress Software Corporation. All rights reserved. * Licensed under commercial license. See LICENSE.md in the project root for more information *-------------------------------------------------------------------------------------------*/ /* eslint-disable no-bitwise */ import { FileState } from '../types'; import { guid } from '@progress/kendo-angular-common'; import { fileGroupMap } from '../types/file-groups'; /** * @hidden */ export const getTotalFilesSizeMessage = (files) => { let totalSize = 0; let i; if (typeof files[0].size === "number") { for (i = 0; i < files.length; i++) { if (files[i].size) { totalSize += files[i].size; } } } else { return ""; } totalSize /= 1024; if (totalSize < 1024) { return totalSize.toFixed(2) + " KB"; } else { return (totalSize / 1024).toFixed(2) + " MB"; } }; const stripPath = (name) => { const slashIndex = name.lastIndexOf("\\"); return (slashIndex !== -1) ? name.substr(slashIndex + 1) : name; }; const getFileExtension = (fileName) => { const rFileExtension = /\.([^\.]+)$/; const matches = fileName.match(rFileExtension); return matches ? matches[0] : ""; }; /** * @hidden */ export const validateInitialFileInfo = (file) => { if (file instanceof Object && file.hasOwnProperty("name")) { return true; } return false; }; /** * @hidden */ export const validateInitialFileSelectFile = (file) => { if (file instanceof File || validateInitialFileInfo(file)) { return true; } return false; }; /** * @hidden */ export const getInitialFileInfo = (fakeFile) => { fakeFile.extension = fakeFile.extension || getFileExtension(fakeFile.name); fakeFile.name = fakeFile.name; // eslint-disable-line no-self-assign fakeFile.size = fakeFile.size || 0; if (!fakeFile.hasOwnProperty("state")) { fakeFile.state = FileState.Initial; } if (!fakeFile.hasOwnProperty("uid")) { fakeFile.uid = guid(); } return fakeFile; }; /** * @hidden */ export const convertFileToFileInfo = (file) => { const fileInfo = getFileInfo(file); fileInfo.uid = guid(); // Used to differentiate initial FileInfo objects and actual Files fileInfo.state = FileState.Selected; return fileInfo; }; const getFileInfo = (rawFile) => { const fileName = rawFile.name; const fileSize = rawFile.size; return { extension: getFileExtension(fileName), name: fileName, rawFile: rawFile, size: fileSize, state: FileState.Selected }; }; /** * @hidden */ export const getAllFileInfo = (rawFiles) => { const allFileInfo = new Array(); let i; for (i = 0; i < rawFiles.length; i++) { allFileInfo.push(getFileInfo(rawFiles[i])); } return allFileInfo; }; /** * @hidden */ export const fileHasValidationErrors = (file) => { if (file.validationErrors && file.validationErrors.length > 0) { return true; } return false; }; /** * @hidden */ export const filesHaveValidationErrors = (files) => { for (const file of files) { if (fileHasValidationErrors(file)) { return true; } } return false; }; /** * @hidden */ export const inputFiles = (input) => { if (input.files) { return getAllFileInfo(input.files); } else { //Required for testing const fileNames = input.value.split("|").map((file, index) => { const fileName = file.trim(); return { extension: getFileExtension(fileName), name: stripPath(fileName), rawFile: null, size: (index + 1) * 1000, state: FileState.Selected }; }); return fileNames; } }; /** * @hidden */ export const assignGuidToFiles = (files, isUnique) => { const uid = guid(); return files.map((file) => { file.uid = isUnique ? guid() : uid; return file; }); }; /** * @hidden */ export const supportsFormData = () => { return typeof (FormData) !== "undefined"; }; /** * @hidden */ export const userAgent = () => { return navigator.userAgent; }; const focusableRegex = /^(?:a|input|select|textarea|button|object)$/i; /** * @hidden */ export const IGNORE_TARGET_CLASSES = 'k-icon k-select k-input k-multiselect-wrap'; /** * @hidden */ export const UPLOAD_CLASSES = 'k-upload-button k-clear-selected k-upload-selected k-upload-action k-file'; const isVisible = (element) => { const rect = element.getBoundingClientRect(); return !!(rect.width && rect.height) && window.getComputedStyle(element).visibility !== 'hidden'; }; const toClassList = (classNames) => String(classNames).trim().split(' '); /** * @hidden */ export const hasClasses = (element, classNames) => { const namesList = toClassList(classNames); return Boolean(toClassList(element.className).find((className) => namesList.indexOf(className) >= 0)); }; /** * @hidden */ export const isFocusable = (element, checkVisibility = true) => { if (element.tagName) { const tagName = element.tagName.toLowerCase(); const tabIndex = element.getAttribute('tabIndex'); const validTabIndex = tabIndex !== null && !isNaN(tabIndex) && tabIndex > -1; let focusable = false; if (focusableRegex.test(tagName)) { focusable = !element.disabled; } else { focusable = validTabIndex; } return focusable && (!checkVisibility || isVisible(element)); } return false; }; /** * @hidden */ export const getFileGroupCssClass = (fileExtension) => { const initial = 'file'; for (const group in fileGroupMap) { if (fileGroupMap[group].indexOf(fileExtension) >= 0) { if (group === 'discImage') { return `${initial}-disc-image`; } return `${initial}-${group}`; } } return initial; }; /** * @hidden */ export const isPresent = (value) => value !== null && value !== undefined;