@progress/kendo-angular-upload
Version:
Kendo UI Angular Upload Component
230 lines (229 loc) • 6.26 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* 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;