@chayns-components/core 5.5.57 → 5.5.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -111,15 +111,12 @@ const FileSelect = ({
111
111
  }, [fileTypes, handleAddFiles, handleOpenEditor, isDisabled, maxFileSizeInMB, shouldPreventImageUpload]);
112
112
  const handleDrop = (0, _react.useCallback)(e => {
113
113
  e.preventDefault();
114
- const draggedFiles = Array.from(e.dataTransfer.files).filter(file => {
115
- if (fileTypes && !(0, _file.isValidFileType)({
116
- file,
117
- types: fileTypes
118
- })) {
119
- return false;
120
- }
121
- return !(maxFileSizeInMB && file.size > maxFileSizeInMB * 1024 * 1024);
122
- });
114
+ const eventFiles = Array.from(e.dataTransfer.files);
115
+ let draggedFiles = (0, _fileDialog.filterFilesBySize)(eventFiles, maxFileSizeInMB);
116
+ draggedFiles = draggedFiles.filter(file => !(fileTypes && !(0, _file.isValidFileType)({
117
+ file,
118
+ types: fileTypes
119
+ })));
123
120
  if (draggedFiles.length === 1 && draggedFiles[0] && draggedFiles[0].type.startsWith('image') && !shouldPreventImageUpload) {
124
121
  void handleOpenEditor(draggedFiles[0]);
125
122
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"FileSelect.js","names":["_chaynsApi","require","_react","_interopRequireWildcard","_file","_fileDialog","_useFocusRingPortal","_useKeyboardFocusHighlighting","_Icon","_interopRequireDefault","_FileSelect","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DialogView","FileSelect","fileSelectionIcons","imageSelectIcons","fileTypes","isDisabled","maxFileSizeInMB","onAdd","fileSelectionPlaceholder","imageSelectPlaceholder","shouldPreventImageUpload","shouldEnableKeyboardHighlighting","fileSelectionRef","useRef","imageSelectionRef","shouldShowKeyboardHighlighting","useKeyboardFocusHighlighting","useFocusRingPortal","isEnabled","Boolean","handleAddImages","useCallback","images","handleAddFiles","newFiles","handleOpenEditor","file","buttonType","result","createDialog","dialogInput","upload","initialView","EDITOR","imageArrayBuffer","type","DialogType","MODULE","system","url","scope","module","buttons","open","size","name","handleImageSelectionClick","PIXABAY","handleFileSelectionClick","selectFiles","multiple","length","startsWith","handleDrop","preventDefault","draggedFiles","Array","from","dataTransfer","files","filter","isValidFileType","types","handleFileSelectionKeyDown","event","key","handleImageSelectionKeyDown","useMemo","createElement","StyledFileSelect","StyledFileSelectWrapper","$isDisabled","StyledFileSelectContainer","ref","onClick","onKeyDown","onDragOver","onDrop","role","tabIndex","icons","StyledFileSelectText","$isImageSelection","displayName","_default","exports"],"sources":["../../../../src/components/file-select/FileSelect.tsx"],"sourcesContent":["import { createDialog, DialogType } from 'chayns-api';\nimport React, { DragEvent, FC, KeyboardEventHandler, useCallback, useMemo, useRef } from 'react';\nimport type { ImageDialogResult } from '../../types/fileInput';\nimport { isValidFileType } from '../../utils/file';\nimport { selectFiles } from '../../utils/fileDialog';\nimport { useFocusRingPortal } from '../../hooks/useFocusRingPortal';\nimport { useKeyboardFocusHighlighting } from '../../hooks/useKeyboardFocusHighlighting';\nimport Icon from '../icon/Icon';\nimport {\n StyledFileSelect,\n StyledFileSelectContainer,\n StyledFileSelectText,\n StyledFileSelectWrapper,\n} from './FileSelect.styles';\n\nenum DialogView {\n PIXABAY = 'pixabay',\n EDITOR = 'editor',\n}\n\ntype DialogInput = {\n upload: boolean;\n initialView: DialogView;\n imageArrayBuffer?: File;\n};\n\nexport interface UploadedFile {\n url: string;\n size?: number;\n name?: string;\n}\n\nexport type FileSelectProps = {\n /**\n * An array of icons that should be displayed inside the FileInput\n */\n fileSelectionIcons?: string[];\n /**\n * The text that should be displayed inside the FileInput.\n */\n fileSelectionPlaceholder?: string;\n /**\n * The filetypes that could be selected. Example for multiple types: 'image/*, video/*'.\n */\n fileTypes?: string;\n /**\n * The icon of the image selection.\n */\n imageSelectIcons?: string[];\n /**\n * If set, pictures can be select via Pixabay.\n */\n imageSelectPlaceholder?: string;\n /**\n * Whether the FileInput is disabled.\n */\n isDisabled?: boolean;\n /**\n * The maximum amount of Files that can be uploaded.\n */\n maxFiles?: number;\n /**\n * The maximum size of a file in MB.\n */\n maxFileSizeInMB?: number;\n /**\n * A function to be executed when files are added.\n */\n onAdd?: (files: File[] | UploadedFile[]) => void;\n /**\n * Whether the image upload should be prevented.\n */\n shouldPreventImageUpload?: boolean;\n /**\n * Enables keyboard-only focus highlighting for selection triggers.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n};\n\nconst FileSelect: FC<FileSelectProps> = ({\n fileSelectionIcons = ['fa fa-upload'],\n imageSelectIcons = ['ts-image'],\n fileTypes,\n isDisabled,\n maxFileSizeInMB,\n onAdd,\n fileSelectionPlaceholder = 'Dateien hochladen',\n imageSelectPlaceholder,\n shouldPreventImageUpload = false,\n shouldEnableKeyboardHighlighting,\n}) => {\n const fileSelectionRef = useRef<HTMLDivElement>(null);\n const imageSelectionRef = useRef<HTMLDivElement>(null);\n\n const shouldShowKeyboardHighlighting = useKeyboardFocusHighlighting(\n shouldEnableKeyboardHighlighting && !isDisabled,\n );\n useFocusRingPortal(fileSelectionRef, { isEnabled: shouldShowKeyboardHighlighting });\n useFocusRingPortal(imageSelectionRef, {\n isEnabled: shouldShowKeyboardHighlighting && Boolean(imageSelectPlaceholder),\n });\n\n const handleAddImages = useCallback(\n (images: UploadedFile[]) => {\n if (typeof onAdd === 'function') {\n onAdd(images);\n }\n },\n [onAdd],\n );\n\n const handleAddFiles = useCallback(\n (newFiles: File[]) => {\n if (typeof onAdd === 'function') {\n onAdd(newFiles);\n }\n },\n [onAdd],\n );\n\n const handleOpenEditor = useCallback(\n async (file: File) => {\n const { buttonType, result } = (await createDialog<DialogInput>({\n dialogInput: {\n upload: true,\n initialView: DialogView.EDITOR,\n imageArrayBuffer: file,\n },\n type: DialogType.MODULE,\n system: {\n url: 'https://tapp.chayns-static.space/api/dialog-image-editor/v1/remoteEntry.js',\n scope: 'dialog_image_editor',\n module: './ImageEditorEntry',\n },\n buttons: [],\n }).open()) as ImageDialogResult;\n\n if (buttonType === 1 && result?.url)\n handleAddImages([\n {\n url: result.url,\n size: file.size,\n name: file.name,\n },\n ]);\n },\n [handleAddImages],\n );\n\n const handleImageSelectionClick = useCallback(async () => {\n if (isDisabled) return;\n\n const { buttonType, result } = (await createDialog<DialogInput>({\n dialogInput: { upload: true, initialView: DialogView.PIXABAY },\n type: DialogType.MODULE,\n system: {\n url: 'https://tapp.chayns-static.space/api/dialog-image-editor/v1/remoteEntry.js',\n scope: 'dialog_image_editor',\n module: './ImageEditorEntry',\n },\n buttons: [],\n }).open()) as ImageDialogResult;\n\n if (buttonType === 1 && result?.url) handleAddImages([{ url: result.url }]);\n }, [handleAddImages, isDisabled]);\n\n const handleFileSelectionClick = useCallback(async () => {\n if (isDisabled) return;\n\n const newFiles = await selectFiles({ multiple: true, type: fileTypes, maxFileSizeInMB });\n\n if (\n newFiles.length === 1 &&\n newFiles[0] &&\n newFiles[0].type.startsWith('image') &&\n !shouldPreventImageUpload\n ) {\n void handleOpenEditor(newFiles[0]);\n\n return;\n }\n\n handleAddFiles(newFiles);\n }, [\n fileTypes,\n handleAddFiles,\n handleOpenEditor,\n isDisabled,\n maxFileSizeInMB,\n shouldPreventImageUpload,\n ]);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n const draggedFiles = Array.from(e.dataTransfer.files).filter((file) => {\n if (fileTypes && !isValidFileType({ file, types: fileTypes })) {\n return false;\n }\n\n return !(maxFileSizeInMB && file.size > maxFileSizeInMB * 1024 * 1024);\n });\n\n if (\n draggedFiles.length === 1 &&\n draggedFiles[0] &&\n draggedFiles[0].type.startsWith('image') &&\n !shouldPreventImageUpload\n ) {\n void handleOpenEditor(draggedFiles[0]);\n\n return;\n }\n\n handleAddFiles(draggedFiles);\n },\n [shouldPreventImageUpload, handleAddFiles, fileTypes, maxFileSizeInMB, handleOpenEditor],\n );\n\n const handleFileSelectionKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleFileSelectionClick();\n }\n },\n [handleFileSelectionClick],\n );\n\n const handleImageSelectionKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleImageSelectionClick();\n }\n },\n [handleImageSelectionClick],\n );\n\n return useMemo(\n () => (\n <StyledFileSelect>\n <StyledFileSelectWrapper $isDisabled={isDisabled}>\n <StyledFileSelectContainer\n ref={fileSelectionRef}\n onClick={() => void handleFileSelectionClick()}\n onKeyDown={handleFileSelectionKeyDown}\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <Icon icons={fileSelectionIcons} />\n <StyledFileSelectText>{fileSelectionPlaceholder}</StyledFileSelectText>\n </StyledFileSelectContainer>\n {imageSelectPlaceholder && (\n <StyledFileSelectContainer\n ref={imageSelectionRef}\n $isImageSelection\n onClick={() => void handleImageSelectionClick()}\n onKeyDown={handleImageSelectionKeyDown}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <Icon icons={imageSelectIcons} />\n <StyledFileSelectText>{imageSelectPlaceholder}</StyledFileSelectText>\n </StyledFileSelectContainer>\n )}\n </StyledFileSelectWrapper>\n </StyledFileSelect>\n ),\n [\n isDisabled,\n fileSelectionIcons,\n fileSelectionPlaceholder,\n imageSelectPlaceholder,\n imageSelectIcons,\n handleFileSelectionClick,\n handleDrop,\n handleFileSelectionKeyDown,\n handleImageSelectionClick,\n handleImageSelectionKeyDown,\n ],\n );\n};\n\nFileSelect.displayName = 'FileSelect';\n\nexport default FileSelect;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FileSelect.js","names":["_chaynsApi","require","_react","_interopRequireWildcard","_file","_fileDialog","_useFocusRingPortal","_useKeyboardFocusHighlighting","_Icon","_interopRequireDefault","_FileSelect","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DialogView","FileSelect","fileSelectionIcons","imageSelectIcons","fileTypes","isDisabled","maxFileSizeInMB","onAdd","fileSelectionPlaceholder","imageSelectPlaceholder","shouldPreventImageUpload","shouldEnableKeyboardHighlighting","fileSelectionRef","useRef","imageSelectionRef","shouldShowKeyboardHighlighting","useKeyboardFocusHighlighting","useFocusRingPortal","isEnabled","Boolean","handleAddImages","useCallback","images","handleAddFiles","newFiles","handleOpenEditor","file","buttonType","result","createDialog","dialogInput","upload","initialView","EDITOR","imageArrayBuffer","type","DialogType","MODULE","system","url","scope","module","buttons","open","size","name","handleImageSelectionClick","PIXABAY","handleFileSelectionClick","selectFiles","multiple","length","startsWith","handleDrop","preventDefault","eventFiles","Array","from","dataTransfer","files","draggedFiles","filterFilesBySize","filter","isValidFileType","types","handleFileSelectionKeyDown","event","key","handleImageSelectionKeyDown","useMemo","createElement","StyledFileSelect","StyledFileSelectWrapper","$isDisabled","StyledFileSelectContainer","ref","onClick","onKeyDown","onDragOver","onDrop","role","tabIndex","icons","StyledFileSelectText","$isImageSelection","displayName","_default","exports"],"sources":["../../../../src/components/file-select/FileSelect.tsx"],"sourcesContent":["import { createDialog, DialogType } from 'chayns-api';\nimport React, { DragEvent, FC, KeyboardEventHandler, useCallback, useMemo, useRef } from 'react';\nimport type { ImageDialogResult } from '../../types/fileInput';\nimport { isValidFileType } from '../../utils/file';\nimport { filterFilesBySize, selectFiles } from '../../utils/fileDialog';\nimport { useFocusRingPortal } from '../../hooks/useFocusRingPortal';\nimport { useKeyboardFocusHighlighting } from '../../hooks/useKeyboardFocusHighlighting';\nimport Icon from '../icon/Icon';\nimport {\n StyledFileSelect,\n StyledFileSelectContainer,\n StyledFileSelectText,\n StyledFileSelectWrapper,\n} from './FileSelect.styles';\n\nenum DialogView {\n PIXABAY = 'pixabay',\n EDITOR = 'editor',\n}\n\ntype DialogInput = {\n upload: boolean;\n initialView: DialogView;\n imageArrayBuffer?: File;\n};\n\nexport interface UploadedFile {\n url: string;\n size?: number;\n name?: string;\n}\n\nexport type FileSelectProps = {\n /**\n * An array of icons that should be displayed inside the FileInput\n */\n fileSelectionIcons?: string[];\n /**\n * The text that should be displayed inside the FileInput.\n */\n fileSelectionPlaceholder?: string;\n /**\n * The filetypes that could be selected. Example for multiple types: 'image/*, video/*'.\n */\n fileTypes?: string;\n /**\n * The icon of the image selection.\n */\n imageSelectIcons?: string[];\n /**\n * If set, pictures can be select via Pixabay.\n */\n imageSelectPlaceholder?: string;\n /**\n * Whether the FileInput is disabled.\n */\n isDisabled?: boolean;\n /**\n * The maximum amount of Files that can be uploaded.\n */\n maxFiles?: number;\n /**\n * The maximum size of a file in MB.\n */\n maxFileSizeInMB?: number;\n /**\n * A function to be executed when files are added.\n */\n onAdd?: (files: File[] | UploadedFile[]) => void;\n /**\n * Whether the image upload should be prevented.\n */\n shouldPreventImageUpload?: boolean;\n /**\n * Enables keyboard-only focus highlighting for selection triggers.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n};\n\nconst FileSelect: FC<FileSelectProps> = ({\n fileSelectionIcons = ['fa fa-upload'],\n imageSelectIcons = ['ts-image'],\n fileTypes,\n isDisabled,\n maxFileSizeInMB,\n onAdd,\n fileSelectionPlaceholder = 'Dateien hochladen',\n imageSelectPlaceholder,\n shouldPreventImageUpload = false,\n shouldEnableKeyboardHighlighting,\n}) => {\n const fileSelectionRef = useRef<HTMLDivElement>(null);\n const imageSelectionRef = useRef<HTMLDivElement>(null);\n\n const shouldShowKeyboardHighlighting = useKeyboardFocusHighlighting(\n shouldEnableKeyboardHighlighting && !isDisabled,\n );\n useFocusRingPortal(fileSelectionRef, { isEnabled: shouldShowKeyboardHighlighting });\n useFocusRingPortal(imageSelectionRef, {\n isEnabled: shouldShowKeyboardHighlighting && Boolean(imageSelectPlaceholder),\n });\n\n const handleAddImages = useCallback(\n (images: UploadedFile[]) => {\n if (typeof onAdd === 'function') {\n onAdd(images);\n }\n },\n [onAdd],\n );\n\n const handleAddFiles = useCallback(\n (newFiles: File[]) => {\n if (typeof onAdd === 'function') {\n onAdd(newFiles);\n }\n },\n [onAdd],\n );\n\n const handleOpenEditor = useCallback(\n async (file: File) => {\n const { buttonType, result } = (await createDialog<DialogInput>({\n dialogInput: {\n upload: true,\n initialView: DialogView.EDITOR,\n imageArrayBuffer: file,\n },\n type: DialogType.MODULE,\n system: {\n url: 'https://tapp.chayns-static.space/api/dialog-image-editor/v1/remoteEntry.js',\n scope: 'dialog_image_editor',\n module: './ImageEditorEntry',\n },\n buttons: [],\n }).open()) as ImageDialogResult;\n\n if (buttonType === 1 && result?.url)\n handleAddImages([\n {\n url: result.url,\n size: file.size,\n name: file.name,\n },\n ]);\n },\n [handleAddImages],\n );\n\n const handleImageSelectionClick = useCallback(async () => {\n if (isDisabled) return;\n\n const { buttonType, result } = (await createDialog<DialogInput>({\n dialogInput: { upload: true, initialView: DialogView.PIXABAY },\n type: DialogType.MODULE,\n system: {\n url: 'https://tapp.chayns-static.space/api/dialog-image-editor/v1/remoteEntry.js',\n scope: 'dialog_image_editor',\n module: './ImageEditorEntry',\n },\n buttons: [],\n }).open()) as ImageDialogResult;\n\n if (buttonType === 1 && result?.url) handleAddImages([{ url: result.url }]);\n }, [handleAddImages, isDisabled]);\n\n const handleFileSelectionClick = useCallback(async () => {\n if (isDisabled) return;\n\n const newFiles = await selectFiles({ multiple: true, type: fileTypes, maxFileSizeInMB });\n\n if (\n newFiles.length === 1 &&\n newFiles[0] &&\n newFiles[0].type.startsWith('image') &&\n !shouldPreventImageUpload\n ) {\n void handleOpenEditor(newFiles[0]);\n\n return;\n }\n\n handleAddFiles(newFiles);\n }, [\n fileTypes,\n handleAddFiles,\n handleOpenEditor,\n isDisabled,\n maxFileSizeInMB,\n shouldPreventImageUpload,\n ]);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n const eventFiles = Array.from(e.dataTransfer.files);\n\n let draggedFiles = filterFilesBySize(eventFiles, maxFileSizeInMB);\n\n draggedFiles = draggedFiles.filter(\n (file) => !(fileTypes && !isValidFileType({ file, types: fileTypes })),\n );\n\n if (\n draggedFiles.length === 1 &&\n draggedFiles[0] &&\n draggedFiles[0].type.startsWith('image') &&\n !shouldPreventImageUpload\n ) {\n void handleOpenEditor(draggedFiles[0]);\n\n return;\n }\n\n handleAddFiles(draggedFiles);\n },\n [shouldPreventImageUpload, handleAddFiles, fileTypes, maxFileSizeInMB, handleOpenEditor],\n );\n\n const handleFileSelectionKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleFileSelectionClick();\n }\n },\n [handleFileSelectionClick],\n );\n\n const handleImageSelectionKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleImageSelectionClick();\n }\n },\n [handleImageSelectionClick],\n );\n\n return useMemo(\n () => (\n <StyledFileSelect>\n <StyledFileSelectWrapper $isDisabled={isDisabled}>\n <StyledFileSelectContainer\n ref={fileSelectionRef}\n onClick={() => void handleFileSelectionClick()}\n onKeyDown={handleFileSelectionKeyDown}\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <Icon icons={fileSelectionIcons} />\n <StyledFileSelectText>{fileSelectionPlaceholder}</StyledFileSelectText>\n </StyledFileSelectContainer>\n {imageSelectPlaceholder && (\n <StyledFileSelectContainer\n ref={imageSelectionRef}\n $isImageSelection\n onClick={() => void handleImageSelectionClick()}\n onKeyDown={handleImageSelectionKeyDown}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <Icon icons={imageSelectIcons} />\n <StyledFileSelectText>{imageSelectPlaceholder}</StyledFileSelectText>\n </StyledFileSelectContainer>\n )}\n </StyledFileSelectWrapper>\n </StyledFileSelect>\n ),\n [\n isDisabled,\n fileSelectionIcons,\n fileSelectionPlaceholder,\n imageSelectPlaceholder,\n imageSelectIcons,\n handleFileSelectionClick,\n handleDrop,\n handleFileSelectionKeyDown,\n handleImageSelectionClick,\n handleImageSelectionKeyDown,\n ],\n );\n};\n\nFileSelect.displayName = 'FileSelect';\n\nexport default FileSelect;\n"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.selectFiles = exports.getFileAsArrayBuffer = exports.filterFilesByMimeType = void 0;
6
+ exports.selectFiles = exports.getFileAsArrayBuffer = exports.filterFilesBySize = exports.filterFilesByMimeType = void 0;
7
7
  var _chaynsApi = require("chayns-api");
8
8
  const selectFiles = ({
9
9
  type,
@@ -49,22 +49,7 @@ const selectFiles = ({
49
49
  }
50
50
  return file;
51
51
  });
52
- let filteredFileArray = fileArray.filter(file => {
53
- const sizeInMB = file.size / 1024 / 1024;
54
- if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {
55
- return false;
56
- }
57
- if (file.type.includes('video/') && sizeInMB > 500) {
58
- return false;
59
- }
60
- return !(file.type.includes('image/') && sizeInMB > 64);
61
- });
62
- if (fileArray.length !== filteredFileArray.length) {
63
- void (0, _chaynsApi.createDialog)({
64
- type: _chaynsApi.DialogType.ALERT,
65
- text: 'Einige Deiner ausgewählten Dateien sind zu groß.'
66
- }).open();
67
- }
52
+ let filteredFileArray = filterFilesBySize(fileArray, maxFileSizeInMB);
68
53
  if (typeof type === 'string') {
69
54
  filteredFileArray = filterFilesByMimeType(filteredFileArray, type);
70
55
  }
@@ -84,6 +69,26 @@ const selectFiles = ({
84
69
  input.click();
85
70
  });
86
71
  exports.selectFiles = selectFiles;
72
+ const filterFilesBySize = (files, maxFileSizeInMB) => {
73
+ const filteredFiles = files.filter(file => {
74
+ const sizeInMB = file.size / 1024 / 1024;
75
+ if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {
76
+ return false;
77
+ }
78
+ if (file.type.includes('video/') && sizeInMB > 500) {
79
+ return false;
80
+ }
81
+ return !(file.type.includes('image/') && sizeInMB > 64);
82
+ });
83
+ if (files.length !== filteredFiles.length) {
84
+ void (0, _chaynsApi.createDialog)({
85
+ type: _chaynsApi.DialogType.ALERT,
86
+ text: 'Einige Deiner ausgewählten Dateien sind zu groß.'
87
+ }).open();
88
+ }
89
+ return filteredFiles;
90
+ };
91
+ exports.filterFilesBySize = filterFilesBySize;
87
92
  const filterFilesByMimeType = (files, mimeTypes) => {
88
93
  const allowedTypes = mimeTypes.split(',').map(type => type.trim());
89
94
  const isAllowedType = fileType => allowedTypes.some(allowedType => {
@@ -1 +1 @@
1
- {"version":3,"file":"fileDialog.js","names":["_chaynsApi","require","selectFiles","type","multiple","maxFileSizeInMB","Promise","resolve","reject","input","document","createElement","style","visibility","width","height","display","accept","body","appendChild","abortController","AbortController","signal","onChange","event","removeChild","abort","target","files","fileArray","Object","values","map","file","File","name","getMimeType","filteredFileArray","filter","sizeInMB","size","includes","length","createDialog","DialogType","ALERT","text","open","filterFilesByMimeType","onCancel","Error","addEventListener","click","exports","mimeTypes","allowedTypes","split","trim","isAllowedType","fileType","some","allowedType","endsWith","convertedAllowedType","startsWith","Array","from","getFileAsArrayBuffer","reader","FileReader","onload","e","_e$target","result","onerror","readAsArrayBuffer","extensionToMime","txt","md","csv","json","xml","yaml","yml","html","htm","css","js","ts","jpg","jpeg","png","gif","webp","bmp","svg","ico","mp3","wav","ogg","flac","m4a","mp4","webm","avi","mov","mkv","pdf","doc","docx","xls","xlsx","ppt","pptx","zip","rar","tar","gz","exe","_file$name$split$pop","ext","pop","toLowerCase"],"sources":["../../../src/utils/fileDialog.ts"],"sourcesContent":["import { createDialog, DialogType } from 'chayns-api';\n\ninterface SelectFilesOptions {\n type?: string;\n multiple: boolean;\n maxFileSizeInMB?: number;\n}\n\nexport const selectFiles = ({\n type,\n multiple,\n maxFileSizeInMB,\n}: SelectFilesOptions): Promise<File[]> =>\n new Promise((resolve, reject) => {\n const input = document.createElement('input');\n\n input.type = 'file';\n input.style.visibility = 'none';\n input.style.width = '0';\n input.style.height = '0';\n input.style.display = 'none';\n\n if (type !== '*/*' && type) {\n input.accept = type;\n }\n\n if (multiple) {\n input.multiple = true;\n }\n\n document.body.appendChild(input);\n\n const abortController = new AbortController();\n const { signal } = abortController;\n\n const onChange = (event: Event) => {\n document.body.removeChild(input);\n abortController.abort();\n\n if (!event.target) {\n resolve([]);\n return;\n }\n\n const { files } = event.target as HTMLInputElement;\n\n if (!files) {\n resolve([]);\n\n return;\n }\n\n const fileArray = Object.values(files).map((file) => {\n if (file.type === '') {\n return new File([file], file.name, { type: getMimeType(file) });\n }\n\n return file;\n });\n\n let filteredFileArray = fileArray.filter((file) => {\n const sizeInMB = file.size / 1024 / 1024;\n\n if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {\n return false;\n }\n\n if (file.type.includes('video/') && sizeInMB > 500) {\n return false;\n }\n\n return !(file.type.includes('image/') && sizeInMB > 64);\n });\n\n if (fileArray.length !== filteredFileArray.length) {\n void createDialog({\n type: DialogType.ALERT,\n text: 'Einige Deiner ausgewählten Dateien sind zu groß.',\n }).open();\n }\n\n if (typeof type === 'string') {\n filteredFileArray = filterFilesByMimeType(filteredFileArray, type) as File[];\n }\n\n resolve(filteredFileArray);\n };\n\n const onCancel = () => {\n document.body.removeChild(input);\n abortController.abort();\n reject(new Error('File selection was cancelled.'));\n };\n\n input.addEventListener('change', onChange, { signal });\n input.addEventListener('focusout', onCancel, { signal });\n\n input.click();\n });\n\nexport const filterFilesByMimeType = (\n files: FileList | File[],\n mimeTypes: string,\n): FileList | File[] => {\n const allowedTypes = mimeTypes.split(',').map((type) => type.trim());\n\n const isAllowedType = (fileType: string) =>\n allowedTypes.some((allowedType) => {\n if (allowedType.endsWith('/*')) {\n const convertedAllowedType = allowedType.split('/*')[0];\n\n if (!convertedAllowedType) {\n return false;\n }\n\n return fileType.startsWith(convertedAllowedType);\n }\n\n return fileType === allowedType;\n });\n\n return Array.from(files).filter((file) => isAllowedType(file.type));\n};\n\nexport const getFileAsArrayBuffer = (file: File): Promise<string | ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e) => {\n if (e.target?.result) {\n resolve(e.target.result);\n } else {\n reject(Error('Could not get array buffer.'));\n }\n };\n\n reader.onerror = reject;\n\n reader.readAsArrayBuffer(file);\n });\n\n/**\n * Mapping file extensions to MIME types\n * (expandable if necessary)\n */\nconst extensionToMime: Record<string, string> = {\n // Text & Code\n txt: 'text/plain',\n md: 'text/markdown',\n csv: 'text/csv',\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'application/x-yaml',\n yml: 'application/x-yaml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n\n // Image\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n ico: 'image/x-icon',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n flac: 'audio/flac',\n m4a: 'audio/mp4',\n\n // Video\n mp4: 'video/mp4',\n webm: 'video/webm',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n\n // Document\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\n // Archive & binary\n zip: 'application/zip',\n rar: 'application/vnd.rar',\n '7z': 'application/x-7z-compressed',\n tar: 'application/x-tar',\n gz: 'application/gzip',\n exe: 'application/vnd.microsoft.portable-executable',\n};\n\n/**\n * Ermittelt den MIME-Type eines Files\n * - nutzt File.type, falls vorhanden\n * - sonst Fallback über Dateiendung\n */\nconst getMimeType = (file: File): string => {\n if (file.type) return file.type;\n\n const ext = file.name.split('.').pop()?.toLowerCase() ?? '';\n\n return extensionToMime[ext] || '';\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fileDialog.js","names":["_chaynsApi","require","selectFiles","type","multiple","maxFileSizeInMB","Promise","resolve","reject","input","document","createElement","style","visibility","width","height","display","accept","body","appendChild","abortController","AbortController","signal","onChange","event","removeChild","abort","target","files","fileArray","Object","values","map","file","File","name","getMimeType","filteredFileArray","filterFilesBySize","filterFilesByMimeType","onCancel","Error","addEventListener","click","exports","filteredFiles","filter","sizeInMB","size","includes","length","createDialog","DialogType","ALERT","text","open","mimeTypes","allowedTypes","split","trim","isAllowedType","fileType","some","allowedType","endsWith","convertedAllowedType","startsWith","Array","from","getFileAsArrayBuffer","reader","FileReader","onload","e","_e$target","result","onerror","readAsArrayBuffer","extensionToMime","txt","md","csv","json","xml","yaml","yml","html","htm","css","js","ts","jpg","jpeg","png","gif","webp","bmp","svg","ico","mp3","wav","ogg","flac","m4a","mp4","webm","avi","mov","mkv","pdf","doc","docx","xls","xlsx","ppt","pptx","zip","rar","tar","gz","exe","_file$name$split$pop","ext","pop","toLowerCase"],"sources":["../../../src/utils/fileDialog.ts"],"sourcesContent":["import { createDialog, DialogType } from 'chayns-api';\n\ninterface SelectFilesOptions {\n type?: string;\n multiple: boolean;\n maxFileSizeInMB?: number;\n}\n\nexport const selectFiles = ({\n type,\n multiple,\n maxFileSizeInMB,\n}: SelectFilesOptions): Promise<File[]> =>\n new Promise((resolve, reject) => {\n const input = document.createElement('input');\n\n input.type = 'file';\n input.style.visibility = 'none';\n input.style.width = '0';\n input.style.height = '0';\n input.style.display = 'none';\n\n if (type !== '*/*' && type) {\n input.accept = type;\n }\n\n if (multiple) {\n input.multiple = true;\n }\n\n document.body.appendChild(input);\n\n const abortController = new AbortController();\n const { signal } = abortController;\n\n const onChange = (event: Event) => {\n document.body.removeChild(input);\n abortController.abort();\n\n if (!event.target) {\n resolve([]);\n return;\n }\n\n const { files } = event.target as HTMLInputElement;\n\n if (!files) {\n resolve([]);\n\n return;\n }\n\n const fileArray = Object.values(files).map((file) => {\n if (file.type === '') {\n return new File([file], file.name, { type: getMimeType(file) });\n }\n\n return file;\n });\n\n let filteredFileArray = filterFilesBySize(fileArray, maxFileSizeInMB);\n\n if (typeof type === 'string') {\n filteredFileArray = filterFilesByMimeType(filteredFileArray, type) as File[];\n }\n\n resolve(filteredFileArray);\n };\n\n const onCancel = () => {\n document.body.removeChild(input);\n abortController.abort();\n reject(new Error('File selection was cancelled.'));\n };\n\n input.addEventListener('change', onChange, { signal });\n input.addEventListener('focusout', onCancel, { signal });\n\n input.click();\n });\n\nexport const filterFilesBySize = (files: File[], maxFileSizeInMB?: number) => {\n const filteredFiles = files.filter((file) => {\n const sizeInMB = file.size / 1024 / 1024;\n\n if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {\n return false;\n }\n\n if (file.type.includes('video/') && sizeInMB > 500) {\n return false;\n }\n\n return !(file.type.includes('image/') && sizeInMB > 64);\n });\n\n if (files.length !== filteredFiles.length) {\n void createDialog({\n type: DialogType.ALERT,\n text: 'Einige Deiner ausgewählten Dateien sind zu groß.',\n }).open();\n }\n\n return filteredFiles;\n};\n\nexport const filterFilesByMimeType = (\n files: FileList | File[],\n mimeTypes: string,\n): FileList | File[] => {\n const allowedTypes = mimeTypes.split(',').map((type) => type.trim());\n\n const isAllowedType = (fileType: string) =>\n allowedTypes.some((allowedType) => {\n if (allowedType.endsWith('/*')) {\n const convertedAllowedType = allowedType.split('/*')[0];\n\n if (!convertedAllowedType) {\n return false;\n }\n\n return fileType.startsWith(convertedAllowedType);\n }\n\n return fileType === allowedType;\n });\n\n return Array.from(files).filter((file) => isAllowedType(file.type));\n};\n\nexport const getFileAsArrayBuffer = (file: File): Promise<string | ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e) => {\n if (e.target?.result) {\n resolve(e.target.result);\n } else {\n reject(Error('Could not get array buffer.'));\n }\n };\n\n reader.onerror = reject;\n\n reader.readAsArrayBuffer(file);\n });\n\n/**\n * Mapping file extensions to MIME types\n * (expandable if necessary)\n */\nconst extensionToMime: Record<string, string> = {\n // Text & Code\n txt: 'text/plain',\n md: 'text/markdown',\n csv: 'text/csv',\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'application/x-yaml',\n yml: 'application/x-yaml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n\n // Image\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n ico: 'image/x-icon',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n flac: 'audio/flac',\n m4a: 'audio/mp4',\n\n // Video\n mp4: 'video/mp4',\n webm: 'video/webm',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n\n // Document\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\n // Archive & binary\n zip: 'application/zip',\n rar: 'application/vnd.rar',\n '7z': 'application/x-7z-compressed',\n tar: 'application/x-tar',\n gz: 'application/gzip',\n exe: 'application/vnd.microsoft.portable-executable',\n};\n\n/**\n * Ermittelt den MIME-Type eines Files\n * - nutzt File.type, falls vorhanden\n * - sonst Fallback über Dateiendung\n */\nconst getMimeType = (file: File): string => {\n if (file.type) return file.type;\n\n const ext = file.name.split('.').pop()?.toLowerCase() ?? '';\n\n return extensionToMime[ext] || '';\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import { createDialog, DialogType } from 'chayns-api';
2
2
  import React, { useCallback, useMemo, useRef } from 'react';
3
3
  import { isValidFileType } from '../../utils/file';
4
- import { selectFiles } from '../../utils/fileDialog';
4
+ import { filterFilesBySize, selectFiles } from '../../utils/fileDialog';
5
5
  import { useFocusRingPortal } from '../../hooks/useFocusRingPortal';
6
6
  import { useKeyboardFocusHighlighting } from '../../hooks/useKeyboardFocusHighlighting';
7
7
  import Icon from '../icon/Icon';
@@ -103,15 +103,12 @@ const FileSelect = ({
103
103
  }, [fileTypes, handleAddFiles, handleOpenEditor, isDisabled, maxFileSizeInMB, shouldPreventImageUpload]);
104
104
  const handleDrop = useCallback(e => {
105
105
  e.preventDefault();
106
- const draggedFiles = Array.from(e.dataTransfer.files).filter(file => {
107
- if (fileTypes && !isValidFileType({
108
- file,
109
- types: fileTypes
110
- })) {
111
- return false;
112
- }
113
- return !(maxFileSizeInMB && file.size > maxFileSizeInMB * 1024 * 1024);
114
- });
106
+ const eventFiles = Array.from(e.dataTransfer.files);
107
+ let draggedFiles = filterFilesBySize(eventFiles, maxFileSizeInMB);
108
+ draggedFiles = draggedFiles.filter(file => !(fileTypes && !isValidFileType({
109
+ file,
110
+ types: fileTypes
111
+ })));
115
112
  if (draggedFiles.length === 1 && draggedFiles[0] && draggedFiles[0].type.startsWith('image') && !shouldPreventImageUpload) {
116
113
  void handleOpenEditor(draggedFiles[0]);
117
114
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"FileSelect.js","names":["createDialog","DialogType","React","useCallback","useMemo","useRef","isValidFileType","selectFiles","useFocusRingPortal","useKeyboardFocusHighlighting","Icon","StyledFileSelect","StyledFileSelectContainer","StyledFileSelectText","StyledFileSelectWrapper","DialogView","FileSelect","fileSelectionIcons","imageSelectIcons","fileTypes","isDisabled","maxFileSizeInMB","onAdd","fileSelectionPlaceholder","imageSelectPlaceholder","shouldPreventImageUpload","shouldEnableKeyboardHighlighting","fileSelectionRef","imageSelectionRef","shouldShowKeyboardHighlighting","isEnabled","Boolean","handleAddImages","images","handleAddFiles","newFiles","handleOpenEditor","file","buttonType","result","dialogInput","upload","initialView","EDITOR","imageArrayBuffer","type","MODULE","system","url","scope","module","buttons","open","size","name","handleImageSelectionClick","PIXABAY","handleFileSelectionClick","multiple","length","startsWith","handleDrop","e","preventDefault","draggedFiles","Array","from","dataTransfer","files","filter","types","handleFileSelectionKeyDown","event","key","handleImageSelectionKeyDown","createElement","$isDisabled","ref","onClick","onKeyDown","onDragOver","onDrop","role","tabIndex","icons","$isImageSelection","displayName"],"sources":["../../../../src/components/file-select/FileSelect.tsx"],"sourcesContent":["import { createDialog, DialogType } from 'chayns-api';\nimport React, { DragEvent, FC, KeyboardEventHandler, useCallback, useMemo, useRef } from 'react';\nimport type { ImageDialogResult } from '../../types/fileInput';\nimport { isValidFileType } from '../../utils/file';\nimport { selectFiles } from '../../utils/fileDialog';\nimport { useFocusRingPortal } from '../../hooks/useFocusRingPortal';\nimport { useKeyboardFocusHighlighting } from '../../hooks/useKeyboardFocusHighlighting';\nimport Icon from '../icon/Icon';\nimport {\n StyledFileSelect,\n StyledFileSelectContainer,\n StyledFileSelectText,\n StyledFileSelectWrapper,\n} from './FileSelect.styles';\n\nenum DialogView {\n PIXABAY = 'pixabay',\n EDITOR = 'editor',\n}\n\ntype DialogInput = {\n upload: boolean;\n initialView: DialogView;\n imageArrayBuffer?: File;\n};\n\nexport interface UploadedFile {\n url: string;\n size?: number;\n name?: string;\n}\n\nexport type FileSelectProps = {\n /**\n * An array of icons that should be displayed inside the FileInput\n */\n fileSelectionIcons?: string[];\n /**\n * The text that should be displayed inside the FileInput.\n */\n fileSelectionPlaceholder?: string;\n /**\n * The filetypes that could be selected. Example for multiple types: 'image/*, video/*'.\n */\n fileTypes?: string;\n /**\n * The icon of the image selection.\n */\n imageSelectIcons?: string[];\n /**\n * If set, pictures can be select via Pixabay.\n */\n imageSelectPlaceholder?: string;\n /**\n * Whether the FileInput is disabled.\n */\n isDisabled?: boolean;\n /**\n * The maximum amount of Files that can be uploaded.\n */\n maxFiles?: number;\n /**\n * The maximum size of a file in MB.\n */\n maxFileSizeInMB?: number;\n /**\n * A function to be executed when files are added.\n */\n onAdd?: (files: File[] | UploadedFile[]) => void;\n /**\n * Whether the image upload should be prevented.\n */\n shouldPreventImageUpload?: boolean;\n /**\n * Enables keyboard-only focus highlighting for selection triggers.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n};\n\nconst FileSelect: FC<FileSelectProps> = ({\n fileSelectionIcons = ['fa fa-upload'],\n imageSelectIcons = ['ts-image'],\n fileTypes,\n isDisabled,\n maxFileSizeInMB,\n onAdd,\n fileSelectionPlaceholder = 'Dateien hochladen',\n imageSelectPlaceholder,\n shouldPreventImageUpload = false,\n shouldEnableKeyboardHighlighting,\n}) => {\n const fileSelectionRef = useRef<HTMLDivElement>(null);\n const imageSelectionRef = useRef<HTMLDivElement>(null);\n\n const shouldShowKeyboardHighlighting = useKeyboardFocusHighlighting(\n shouldEnableKeyboardHighlighting && !isDisabled,\n );\n useFocusRingPortal(fileSelectionRef, { isEnabled: shouldShowKeyboardHighlighting });\n useFocusRingPortal(imageSelectionRef, {\n isEnabled: shouldShowKeyboardHighlighting && Boolean(imageSelectPlaceholder),\n });\n\n const handleAddImages = useCallback(\n (images: UploadedFile[]) => {\n if (typeof onAdd === 'function') {\n onAdd(images);\n }\n },\n [onAdd],\n );\n\n const handleAddFiles = useCallback(\n (newFiles: File[]) => {\n if (typeof onAdd === 'function') {\n onAdd(newFiles);\n }\n },\n [onAdd],\n );\n\n const handleOpenEditor = useCallback(\n async (file: File) => {\n const { buttonType, result } = (await createDialog<DialogInput>({\n dialogInput: {\n upload: true,\n initialView: DialogView.EDITOR,\n imageArrayBuffer: file,\n },\n type: DialogType.MODULE,\n system: {\n url: 'https://tapp.chayns-static.space/api/dialog-image-editor/v1/remoteEntry.js',\n scope: 'dialog_image_editor',\n module: './ImageEditorEntry',\n },\n buttons: [],\n }).open()) as ImageDialogResult;\n\n if (buttonType === 1 && result?.url)\n handleAddImages([\n {\n url: result.url,\n size: file.size,\n name: file.name,\n },\n ]);\n },\n [handleAddImages],\n );\n\n const handleImageSelectionClick = useCallback(async () => {\n if (isDisabled) return;\n\n const { buttonType, result } = (await createDialog<DialogInput>({\n dialogInput: { upload: true, initialView: DialogView.PIXABAY },\n type: DialogType.MODULE,\n system: {\n url: 'https://tapp.chayns-static.space/api/dialog-image-editor/v1/remoteEntry.js',\n scope: 'dialog_image_editor',\n module: './ImageEditorEntry',\n },\n buttons: [],\n }).open()) as ImageDialogResult;\n\n if (buttonType === 1 && result?.url) handleAddImages([{ url: result.url }]);\n }, [handleAddImages, isDisabled]);\n\n const handleFileSelectionClick = useCallback(async () => {\n if (isDisabled) return;\n\n const newFiles = await selectFiles({ multiple: true, type: fileTypes, maxFileSizeInMB });\n\n if (\n newFiles.length === 1 &&\n newFiles[0] &&\n newFiles[0].type.startsWith('image') &&\n !shouldPreventImageUpload\n ) {\n void handleOpenEditor(newFiles[0]);\n\n return;\n }\n\n handleAddFiles(newFiles);\n }, [\n fileTypes,\n handleAddFiles,\n handleOpenEditor,\n isDisabled,\n maxFileSizeInMB,\n shouldPreventImageUpload,\n ]);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n const draggedFiles = Array.from(e.dataTransfer.files).filter((file) => {\n if (fileTypes && !isValidFileType({ file, types: fileTypes })) {\n return false;\n }\n\n return !(maxFileSizeInMB && file.size > maxFileSizeInMB * 1024 * 1024);\n });\n\n if (\n draggedFiles.length === 1 &&\n draggedFiles[0] &&\n draggedFiles[0].type.startsWith('image') &&\n !shouldPreventImageUpload\n ) {\n void handleOpenEditor(draggedFiles[0]);\n\n return;\n }\n\n handleAddFiles(draggedFiles);\n },\n [shouldPreventImageUpload, handleAddFiles, fileTypes, maxFileSizeInMB, handleOpenEditor],\n );\n\n const handleFileSelectionKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleFileSelectionClick();\n }\n },\n [handleFileSelectionClick],\n );\n\n const handleImageSelectionKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleImageSelectionClick();\n }\n },\n [handleImageSelectionClick],\n );\n\n return useMemo(\n () => (\n <StyledFileSelect>\n <StyledFileSelectWrapper $isDisabled={isDisabled}>\n <StyledFileSelectContainer\n ref={fileSelectionRef}\n onClick={() => void handleFileSelectionClick()}\n onKeyDown={handleFileSelectionKeyDown}\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <Icon icons={fileSelectionIcons} />\n <StyledFileSelectText>{fileSelectionPlaceholder}</StyledFileSelectText>\n </StyledFileSelectContainer>\n {imageSelectPlaceholder && (\n <StyledFileSelectContainer\n ref={imageSelectionRef}\n $isImageSelection\n onClick={() => void handleImageSelectionClick()}\n onKeyDown={handleImageSelectionKeyDown}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <Icon icons={imageSelectIcons} />\n <StyledFileSelectText>{imageSelectPlaceholder}</StyledFileSelectText>\n </StyledFileSelectContainer>\n )}\n </StyledFileSelectWrapper>\n </StyledFileSelect>\n ),\n [\n isDisabled,\n fileSelectionIcons,\n fileSelectionPlaceholder,\n imageSelectPlaceholder,\n imageSelectIcons,\n handleFileSelectionClick,\n handleDrop,\n handleFileSelectionKeyDown,\n handleImageSelectionClick,\n handleImageSelectionKeyDown,\n ],\n );\n};\n\nFileSelect.displayName = 'FileSelect';\n\nexport default FileSelect;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FileSelect.js","names":["createDialog","DialogType","React","useCallback","useMemo","useRef","isValidFileType","filterFilesBySize","selectFiles","useFocusRingPortal","useKeyboardFocusHighlighting","Icon","StyledFileSelect","StyledFileSelectContainer","StyledFileSelectText","StyledFileSelectWrapper","DialogView","FileSelect","fileSelectionIcons","imageSelectIcons","fileTypes","isDisabled","maxFileSizeInMB","onAdd","fileSelectionPlaceholder","imageSelectPlaceholder","shouldPreventImageUpload","shouldEnableKeyboardHighlighting","fileSelectionRef","imageSelectionRef","shouldShowKeyboardHighlighting","isEnabled","Boolean","handleAddImages","images","handleAddFiles","newFiles","handleOpenEditor","file","buttonType","result","dialogInput","upload","initialView","EDITOR","imageArrayBuffer","type","MODULE","system","url","scope","module","buttons","open","size","name","handleImageSelectionClick","PIXABAY","handleFileSelectionClick","multiple","length","startsWith","handleDrop","e","preventDefault","eventFiles","Array","from","dataTransfer","files","draggedFiles","filter","types","handleFileSelectionKeyDown","event","key","handleImageSelectionKeyDown","createElement","$isDisabled","ref","onClick","onKeyDown","onDragOver","onDrop","role","tabIndex","icons","$isImageSelection","displayName"],"sources":["../../../../src/components/file-select/FileSelect.tsx"],"sourcesContent":["import { createDialog, DialogType } from 'chayns-api';\nimport React, { DragEvent, FC, KeyboardEventHandler, useCallback, useMemo, useRef } from 'react';\nimport type { ImageDialogResult } from '../../types/fileInput';\nimport { isValidFileType } from '../../utils/file';\nimport { filterFilesBySize, selectFiles } from '../../utils/fileDialog';\nimport { useFocusRingPortal } from '../../hooks/useFocusRingPortal';\nimport { useKeyboardFocusHighlighting } from '../../hooks/useKeyboardFocusHighlighting';\nimport Icon from '../icon/Icon';\nimport {\n StyledFileSelect,\n StyledFileSelectContainer,\n StyledFileSelectText,\n StyledFileSelectWrapper,\n} from './FileSelect.styles';\n\nenum DialogView {\n PIXABAY = 'pixabay',\n EDITOR = 'editor',\n}\n\ntype DialogInput = {\n upload: boolean;\n initialView: DialogView;\n imageArrayBuffer?: File;\n};\n\nexport interface UploadedFile {\n url: string;\n size?: number;\n name?: string;\n}\n\nexport type FileSelectProps = {\n /**\n * An array of icons that should be displayed inside the FileInput\n */\n fileSelectionIcons?: string[];\n /**\n * The text that should be displayed inside the FileInput.\n */\n fileSelectionPlaceholder?: string;\n /**\n * The filetypes that could be selected. Example for multiple types: 'image/*, video/*'.\n */\n fileTypes?: string;\n /**\n * The icon of the image selection.\n */\n imageSelectIcons?: string[];\n /**\n * If set, pictures can be select via Pixabay.\n */\n imageSelectPlaceholder?: string;\n /**\n * Whether the FileInput is disabled.\n */\n isDisabled?: boolean;\n /**\n * The maximum amount of Files that can be uploaded.\n */\n maxFiles?: number;\n /**\n * The maximum size of a file in MB.\n */\n maxFileSizeInMB?: number;\n /**\n * A function to be executed when files are added.\n */\n onAdd?: (files: File[] | UploadedFile[]) => void;\n /**\n * Whether the image upload should be prevented.\n */\n shouldPreventImageUpload?: boolean;\n /**\n * Enables keyboard-only focus highlighting for selection triggers.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n};\n\nconst FileSelect: FC<FileSelectProps> = ({\n fileSelectionIcons = ['fa fa-upload'],\n imageSelectIcons = ['ts-image'],\n fileTypes,\n isDisabled,\n maxFileSizeInMB,\n onAdd,\n fileSelectionPlaceholder = 'Dateien hochladen',\n imageSelectPlaceholder,\n shouldPreventImageUpload = false,\n shouldEnableKeyboardHighlighting,\n}) => {\n const fileSelectionRef = useRef<HTMLDivElement>(null);\n const imageSelectionRef = useRef<HTMLDivElement>(null);\n\n const shouldShowKeyboardHighlighting = useKeyboardFocusHighlighting(\n shouldEnableKeyboardHighlighting && !isDisabled,\n );\n useFocusRingPortal(fileSelectionRef, { isEnabled: shouldShowKeyboardHighlighting });\n useFocusRingPortal(imageSelectionRef, {\n isEnabled: shouldShowKeyboardHighlighting && Boolean(imageSelectPlaceholder),\n });\n\n const handleAddImages = useCallback(\n (images: UploadedFile[]) => {\n if (typeof onAdd === 'function') {\n onAdd(images);\n }\n },\n [onAdd],\n );\n\n const handleAddFiles = useCallback(\n (newFiles: File[]) => {\n if (typeof onAdd === 'function') {\n onAdd(newFiles);\n }\n },\n [onAdd],\n );\n\n const handleOpenEditor = useCallback(\n async (file: File) => {\n const { buttonType, result } = (await createDialog<DialogInput>({\n dialogInput: {\n upload: true,\n initialView: DialogView.EDITOR,\n imageArrayBuffer: file,\n },\n type: DialogType.MODULE,\n system: {\n url: 'https://tapp.chayns-static.space/api/dialog-image-editor/v1/remoteEntry.js',\n scope: 'dialog_image_editor',\n module: './ImageEditorEntry',\n },\n buttons: [],\n }).open()) as ImageDialogResult;\n\n if (buttonType === 1 && result?.url)\n handleAddImages([\n {\n url: result.url,\n size: file.size,\n name: file.name,\n },\n ]);\n },\n [handleAddImages],\n );\n\n const handleImageSelectionClick = useCallback(async () => {\n if (isDisabled) return;\n\n const { buttonType, result } = (await createDialog<DialogInput>({\n dialogInput: { upload: true, initialView: DialogView.PIXABAY },\n type: DialogType.MODULE,\n system: {\n url: 'https://tapp.chayns-static.space/api/dialog-image-editor/v1/remoteEntry.js',\n scope: 'dialog_image_editor',\n module: './ImageEditorEntry',\n },\n buttons: [],\n }).open()) as ImageDialogResult;\n\n if (buttonType === 1 && result?.url) handleAddImages([{ url: result.url }]);\n }, [handleAddImages, isDisabled]);\n\n const handleFileSelectionClick = useCallback(async () => {\n if (isDisabled) return;\n\n const newFiles = await selectFiles({ multiple: true, type: fileTypes, maxFileSizeInMB });\n\n if (\n newFiles.length === 1 &&\n newFiles[0] &&\n newFiles[0].type.startsWith('image') &&\n !shouldPreventImageUpload\n ) {\n void handleOpenEditor(newFiles[0]);\n\n return;\n }\n\n handleAddFiles(newFiles);\n }, [\n fileTypes,\n handleAddFiles,\n handleOpenEditor,\n isDisabled,\n maxFileSizeInMB,\n shouldPreventImageUpload,\n ]);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n\n const eventFiles = Array.from(e.dataTransfer.files);\n\n let draggedFiles = filterFilesBySize(eventFiles, maxFileSizeInMB);\n\n draggedFiles = draggedFiles.filter(\n (file) => !(fileTypes && !isValidFileType({ file, types: fileTypes })),\n );\n\n if (\n draggedFiles.length === 1 &&\n draggedFiles[0] &&\n draggedFiles[0].type.startsWith('image') &&\n !shouldPreventImageUpload\n ) {\n void handleOpenEditor(draggedFiles[0]);\n\n return;\n }\n\n handleAddFiles(draggedFiles);\n },\n [shouldPreventImageUpload, handleAddFiles, fileTypes, maxFileSizeInMB, handleOpenEditor],\n );\n\n const handleFileSelectionKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleFileSelectionClick();\n }\n },\n [handleFileSelectionClick],\n );\n\n const handleImageSelectionKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n void handleImageSelectionClick();\n }\n },\n [handleImageSelectionClick],\n );\n\n return useMemo(\n () => (\n <StyledFileSelect>\n <StyledFileSelectWrapper $isDisabled={isDisabled}>\n <StyledFileSelectContainer\n ref={fileSelectionRef}\n onClick={() => void handleFileSelectionClick()}\n onKeyDown={handleFileSelectionKeyDown}\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <Icon icons={fileSelectionIcons} />\n <StyledFileSelectText>{fileSelectionPlaceholder}</StyledFileSelectText>\n </StyledFileSelectContainer>\n {imageSelectPlaceholder && (\n <StyledFileSelectContainer\n ref={imageSelectionRef}\n $isImageSelection\n onClick={() => void handleImageSelectionClick()}\n onKeyDown={handleImageSelectionKeyDown}\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n >\n <Icon icons={imageSelectIcons} />\n <StyledFileSelectText>{imageSelectPlaceholder}</StyledFileSelectText>\n </StyledFileSelectContainer>\n )}\n </StyledFileSelectWrapper>\n </StyledFileSelect>\n ),\n [\n isDisabled,\n fileSelectionIcons,\n fileSelectionPlaceholder,\n imageSelectPlaceholder,\n imageSelectIcons,\n handleFileSelectionClick,\n handleDrop,\n handleFileSelectionKeyDown,\n handleImageSelectionClick,\n handleImageSelectionKeyDown,\n ],\n );\n};\n\nFileSelect.displayName = 'FileSelect';\n\nexport default FileSelect;\n"],"mappings":"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","ignoreList":[]}
@@ -43,22 +43,7 @@ export const selectFiles = ({
43
43
  }
44
44
  return file;
45
45
  });
46
- let filteredFileArray = fileArray.filter(file => {
47
- const sizeInMB = file.size / 1024 / 1024;
48
- if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {
49
- return false;
50
- }
51
- if (file.type.includes('video/') && sizeInMB > 500) {
52
- return false;
53
- }
54
- return !(file.type.includes('image/') && sizeInMB > 64);
55
- });
56
- if (fileArray.length !== filteredFileArray.length) {
57
- void createDialog({
58
- type: DialogType.ALERT,
59
- text: 'Einige Deiner ausgewählten Dateien sind zu groß.'
60
- }).open();
61
- }
46
+ let filteredFileArray = filterFilesBySize(fileArray, maxFileSizeInMB);
62
47
  if (typeof type === 'string') {
63
48
  filteredFileArray = filterFilesByMimeType(filteredFileArray, type);
64
49
  }
@@ -77,6 +62,25 @@ export const selectFiles = ({
77
62
  });
78
63
  input.click();
79
64
  });
65
+ export const filterFilesBySize = (files, maxFileSizeInMB) => {
66
+ const filteredFiles = files.filter(file => {
67
+ const sizeInMB = file.size / 1024 / 1024;
68
+ if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {
69
+ return false;
70
+ }
71
+ if (file.type.includes('video/') && sizeInMB > 500) {
72
+ return false;
73
+ }
74
+ return !(file.type.includes('image/') && sizeInMB > 64);
75
+ });
76
+ if (files.length !== filteredFiles.length) {
77
+ void createDialog({
78
+ type: DialogType.ALERT,
79
+ text: 'Einige Deiner ausgewählten Dateien sind zu groß.'
80
+ }).open();
81
+ }
82
+ return filteredFiles;
83
+ };
80
84
  export const filterFilesByMimeType = (files, mimeTypes) => {
81
85
  const allowedTypes = mimeTypes.split(',').map(type => type.trim());
82
86
  const isAllowedType = fileType => allowedTypes.some(allowedType => {
@@ -1 +1 @@
1
- {"version":3,"file":"fileDialog.js","names":["createDialog","DialogType","selectFiles","type","multiple","maxFileSizeInMB","Promise","resolve","reject","input","document","createElement","style","visibility","width","height","display","accept","body","appendChild","abortController","AbortController","signal","onChange","event","removeChild","abort","target","files","fileArray","Object","values","map","file","File","name","getMimeType","filteredFileArray","filter","sizeInMB","size","includes","length","ALERT","text","open","filterFilesByMimeType","onCancel","Error","addEventListener","click","mimeTypes","allowedTypes","split","trim","isAllowedType","fileType","some","allowedType","endsWith","convertedAllowedType","startsWith","Array","from","getFileAsArrayBuffer","reader","FileReader","onload","e","result","onerror","readAsArrayBuffer","extensionToMime","txt","md","csv","json","xml","yaml","yml","html","htm","css","js","ts","jpg","jpeg","png","gif","webp","bmp","svg","ico","mp3","wav","ogg","flac","m4a","mp4","webm","avi","mov","mkv","pdf","doc","docx","xls","xlsx","ppt","pptx","zip","rar","tar","gz","exe","ext","pop","toLowerCase"],"sources":["../../../src/utils/fileDialog.ts"],"sourcesContent":["import { createDialog, DialogType } from 'chayns-api';\n\ninterface SelectFilesOptions {\n type?: string;\n multiple: boolean;\n maxFileSizeInMB?: number;\n}\n\nexport const selectFiles = ({\n type,\n multiple,\n maxFileSizeInMB,\n}: SelectFilesOptions): Promise<File[]> =>\n new Promise((resolve, reject) => {\n const input = document.createElement('input');\n\n input.type = 'file';\n input.style.visibility = 'none';\n input.style.width = '0';\n input.style.height = '0';\n input.style.display = 'none';\n\n if (type !== '*/*' && type) {\n input.accept = type;\n }\n\n if (multiple) {\n input.multiple = true;\n }\n\n document.body.appendChild(input);\n\n const abortController = new AbortController();\n const { signal } = abortController;\n\n const onChange = (event: Event) => {\n document.body.removeChild(input);\n abortController.abort();\n\n if (!event.target) {\n resolve([]);\n return;\n }\n\n const { files } = event.target as HTMLInputElement;\n\n if (!files) {\n resolve([]);\n\n return;\n }\n\n const fileArray = Object.values(files).map((file) => {\n if (file.type === '') {\n return new File([file], file.name, { type: getMimeType(file) });\n }\n\n return file;\n });\n\n let filteredFileArray = fileArray.filter((file) => {\n const sizeInMB = file.size / 1024 / 1024;\n\n if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {\n return false;\n }\n\n if (file.type.includes('video/') && sizeInMB > 500) {\n return false;\n }\n\n return !(file.type.includes('image/') && sizeInMB > 64);\n });\n\n if (fileArray.length !== filteredFileArray.length) {\n void createDialog({\n type: DialogType.ALERT,\n text: 'Einige Deiner ausgewählten Dateien sind zu groß.',\n }).open();\n }\n\n if (typeof type === 'string') {\n filteredFileArray = filterFilesByMimeType(filteredFileArray, type) as File[];\n }\n\n resolve(filteredFileArray);\n };\n\n const onCancel = () => {\n document.body.removeChild(input);\n abortController.abort();\n reject(new Error('File selection was cancelled.'));\n };\n\n input.addEventListener('change', onChange, { signal });\n input.addEventListener('focusout', onCancel, { signal });\n\n input.click();\n });\n\nexport const filterFilesByMimeType = (\n files: FileList | File[],\n mimeTypes: string,\n): FileList | File[] => {\n const allowedTypes = mimeTypes.split(',').map((type) => type.trim());\n\n const isAllowedType = (fileType: string) =>\n allowedTypes.some((allowedType) => {\n if (allowedType.endsWith('/*')) {\n const convertedAllowedType = allowedType.split('/*')[0];\n\n if (!convertedAllowedType) {\n return false;\n }\n\n return fileType.startsWith(convertedAllowedType);\n }\n\n return fileType === allowedType;\n });\n\n return Array.from(files).filter((file) => isAllowedType(file.type));\n};\n\nexport const getFileAsArrayBuffer = (file: File): Promise<string | ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e) => {\n if (e.target?.result) {\n resolve(e.target.result);\n } else {\n reject(Error('Could not get array buffer.'));\n }\n };\n\n reader.onerror = reject;\n\n reader.readAsArrayBuffer(file);\n });\n\n/**\n * Mapping file extensions to MIME types\n * (expandable if necessary)\n */\nconst extensionToMime: Record<string, string> = {\n // Text & Code\n txt: 'text/plain',\n md: 'text/markdown',\n csv: 'text/csv',\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'application/x-yaml',\n yml: 'application/x-yaml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n\n // Image\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n ico: 'image/x-icon',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n flac: 'audio/flac',\n m4a: 'audio/mp4',\n\n // Video\n mp4: 'video/mp4',\n webm: 'video/webm',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n\n // Document\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\n // Archive & binary\n zip: 'application/zip',\n rar: 'application/vnd.rar',\n '7z': 'application/x-7z-compressed',\n tar: 'application/x-tar',\n gz: 'application/gzip',\n exe: 'application/vnd.microsoft.portable-executable',\n};\n\n/**\n * Ermittelt den MIME-Type eines Files\n * - nutzt File.type, falls vorhanden\n * - sonst Fallback über Dateiendung\n */\nconst getMimeType = (file: File): string => {\n if (file.type) return file.type;\n\n const ext = file.name.split('.').pop()?.toLowerCase() ?? '';\n\n return extensionToMime[ext] || '';\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"fileDialog.js","names":["createDialog","DialogType","selectFiles","type","multiple","maxFileSizeInMB","Promise","resolve","reject","input","document","createElement","style","visibility","width","height","display","accept","body","appendChild","abortController","AbortController","signal","onChange","event","removeChild","abort","target","files","fileArray","Object","values","map","file","File","name","getMimeType","filteredFileArray","filterFilesBySize","filterFilesByMimeType","onCancel","Error","addEventListener","click","filteredFiles","filter","sizeInMB","size","includes","length","ALERT","text","open","mimeTypes","allowedTypes","split","trim","isAllowedType","fileType","some","allowedType","endsWith","convertedAllowedType","startsWith","Array","from","getFileAsArrayBuffer","reader","FileReader","onload","e","result","onerror","readAsArrayBuffer","extensionToMime","txt","md","csv","json","xml","yaml","yml","html","htm","css","js","ts","jpg","jpeg","png","gif","webp","bmp","svg","ico","mp3","wav","ogg","flac","m4a","mp4","webm","avi","mov","mkv","pdf","doc","docx","xls","xlsx","ppt","pptx","zip","rar","tar","gz","exe","ext","pop","toLowerCase"],"sources":["../../../src/utils/fileDialog.ts"],"sourcesContent":["import { createDialog, DialogType } from 'chayns-api';\n\ninterface SelectFilesOptions {\n type?: string;\n multiple: boolean;\n maxFileSizeInMB?: number;\n}\n\nexport const selectFiles = ({\n type,\n multiple,\n maxFileSizeInMB,\n}: SelectFilesOptions): Promise<File[]> =>\n new Promise((resolve, reject) => {\n const input = document.createElement('input');\n\n input.type = 'file';\n input.style.visibility = 'none';\n input.style.width = '0';\n input.style.height = '0';\n input.style.display = 'none';\n\n if (type !== '*/*' && type) {\n input.accept = type;\n }\n\n if (multiple) {\n input.multiple = true;\n }\n\n document.body.appendChild(input);\n\n const abortController = new AbortController();\n const { signal } = abortController;\n\n const onChange = (event: Event) => {\n document.body.removeChild(input);\n abortController.abort();\n\n if (!event.target) {\n resolve([]);\n return;\n }\n\n const { files } = event.target as HTMLInputElement;\n\n if (!files) {\n resolve([]);\n\n return;\n }\n\n const fileArray = Object.values(files).map((file) => {\n if (file.type === '') {\n return new File([file], file.name, { type: getMimeType(file) });\n }\n\n return file;\n });\n\n let filteredFileArray = filterFilesBySize(fileArray, maxFileSizeInMB);\n\n if (typeof type === 'string') {\n filteredFileArray = filterFilesByMimeType(filteredFileArray, type) as File[];\n }\n\n resolve(filteredFileArray);\n };\n\n const onCancel = () => {\n document.body.removeChild(input);\n abortController.abort();\n reject(new Error('File selection was cancelled.'));\n };\n\n input.addEventListener('change', onChange, { signal });\n input.addEventListener('focusout', onCancel, { signal });\n\n input.click();\n });\n\nexport const filterFilesBySize = (files: File[], maxFileSizeInMB?: number) => {\n const filteredFiles = files.filter((file) => {\n const sizeInMB = file.size / 1024 / 1024;\n\n if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {\n return false;\n }\n\n if (file.type.includes('video/') && sizeInMB > 500) {\n return false;\n }\n\n return !(file.type.includes('image/') && sizeInMB > 64);\n });\n\n if (files.length !== filteredFiles.length) {\n void createDialog({\n type: DialogType.ALERT,\n text: 'Einige Deiner ausgewählten Dateien sind zu groß.',\n }).open();\n }\n\n return filteredFiles;\n};\n\nexport const filterFilesByMimeType = (\n files: FileList | File[],\n mimeTypes: string,\n): FileList | File[] => {\n const allowedTypes = mimeTypes.split(',').map((type) => type.trim());\n\n const isAllowedType = (fileType: string) =>\n allowedTypes.some((allowedType) => {\n if (allowedType.endsWith('/*')) {\n const convertedAllowedType = allowedType.split('/*')[0];\n\n if (!convertedAllowedType) {\n return false;\n }\n\n return fileType.startsWith(convertedAllowedType);\n }\n\n return fileType === allowedType;\n });\n\n return Array.from(files).filter((file) => isAllowedType(file.type));\n};\n\nexport const getFileAsArrayBuffer = (file: File): Promise<string | ArrayBuffer> =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e) => {\n if (e.target?.result) {\n resolve(e.target.result);\n } else {\n reject(Error('Could not get array buffer.'));\n }\n };\n\n reader.onerror = reject;\n\n reader.readAsArrayBuffer(file);\n });\n\n/**\n * Mapping file extensions to MIME types\n * (expandable if necessary)\n */\nconst extensionToMime: Record<string, string> = {\n // Text & Code\n txt: 'text/plain',\n md: 'text/markdown',\n csv: 'text/csv',\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'application/x-yaml',\n yml: 'application/x-yaml',\n html: 'text/html',\n htm: 'text/html',\n css: 'text/css',\n js: 'application/javascript',\n ts: 'application/typescript',\n\n // Image\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n ico: 'image/x-icon',\n\n // Audio\n mp3: 'audio/mpeg',\n wav: 'audio/wav',\n ogg: 'audio/ogg',\n flac: 'audio/flac',\n m4a: 'audio/mp4',\n\n // Video\n mp4: 'video/mp4',\n webm: 'video/webm',\n avi: 'video/x-msvideo',\n mov: 'video/quicktime',\n mkv: 'video/x-matroska',\n\n // Document\n pdf: 'application/pdf',\n doc: 'application/msword',\n docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n xls: 'application/vnd.ms-excel',\n xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ppt: 'application/vnd.ms-powerpoint',\n pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n\n // Archive & binary\n zip: 'application/zip',\n rar: 'application/vnd.rar',\n '7z': 'application/x-7z-compressed',\n tar: 'application/x-tar',\n gz: 'application/gzip',\n exe: 'application/vnd.microsoft.portable-executable',\n};\n\n/**\n * Ermittelt den MIME-Type eines Files\n * - nutzt File.type, falls vorhanden\n * - sonst Fallback über Dateiendung\n */\nconst getMimeType = (file: File): string => {\n if (file.type) return file.type;\n\n const ext = file.name.split('.').pop()?.toLowerCase() ?? '';\n\n return extensionToMime[ext] || '';\n};\n"],"mappings":"AAAA,SAASA,YAAY,EAAEC,UAAU,QAAQ,YAAY;AAQrD,OAAO,MAAMC,WAAW,GAAGA,CAAC;EACxBC,IAAI;EACJC,QAAQ;EACRC;AACgB,CAAC,KACjB,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;EAC7B,MAAMC,KAAK,GAAGC,QAAQ,CAACC,aAAa,CAAC,OAAO,CAAC;EAE7CF,KAAK,CAACN,IAAI,GAAG,MAAM;EACnBM,KAAK,CAACG,KAAK,CAACC,UAAU,GAAG,MAAM;EAC/BJ,KAAK,CAACG,KAAK,CAACE,KAAK,GAAG,GAAG;EACvBL,KAAK,CAACG,KAAK,CAACG,MAAM,GAAG,GAAG;EACxBN,KAAK,CAACG,KAAK,CAACI,OAAO,GAAG,MAAM;EAE5B,IAAIb,IAAI,KAAK,KAAK,IAAIA,IAAI,EAAE;IACxBM,KAAK,CAACQ,MAAM,GAAGd,IAAI;EACvB;EAEA,IAAIC,QAAQ,EAAE;IACVK,KAAK,CAACL,QAAQ,GAAG,IAAI;EACzB;EAEAM,QAAQ,CAACQ,IAAI,CAACC,WAAW,CAACV,KAAK,CAAC;EAEhC,MAAMW,eAAe,GAAG,IAAIC,eAAe,CAAC,CAAC;EAC7C,MAAM;IAAEC;EAAO,CAAC,GAAGF,eAAe;EAElC,MAAMG,QAAQ,GAAIC,KAAY,IAAK;IAC/Bd,QAAQ,CAACQ,IAAI,CAACO,WAAW,CAAChB,KAAK,CAAC;IAChCW,eAAe,CAACM,KAAK,CAAC,CAAC;IAEvB,IAAI,CAACF,KAAK,CAACG,MAAM,EAAE;MACfpB,OAAO,CAAC,EAAE,CAAC;MACX;IACJ;IAEA,MAAM;MAAEqB;IAAM,CAAC,GAAGJ,KAAK,CAACG,MAA0B;IAElD,IAAI,CAACC,KAAK,EAAE;MACRrB,OAAO,CAAC,EAAE,CAAC;MAEX;IACJ;IAEA,MAAMsB,SAAS,GAAGC,MAAM,CAACC,MAAM,CAACH,KAAK,CAAC,CAACI,GAAG,CAAEC,IAAI,IAAK;MACjD,IAAIA,IAAI,CAAC9B,IAAI,KAAK,EAAE,EAAE;QAClB,OAAO,IAAI+B,IAAI,CAAC,CAACD,IAAI,CAAC,EAAEA,IAAI,CAACE,IAAI,EAAE;UAAEhC,IAAI,EAAEiC,WAAW,CAACH,IAAI;QAAE,CAAC,CAAC;MACnE;MAEA,OAAOA,IAAI;IACf,CAAC,CAAC;IAEF,IAAII,iBAAiB,GAAGC,iBAAiB,CAACT,SAAS,EAAExB,eAAe,CAAC;IAErE,IAAI,OAAOF,IAAI,KAAK,QAAQ,EAAE;MAC1BkC,iBAAiB,GAAGE,qBAAqB,CAACF,iBAAiB,EAAElC,IAAI,CAAW;IAChF;IAEAI,OAAO,CAAC8B,iBAAiB,CAAC;EAC9B,CAAC;EAED,MAAMG,QAAQ,GAAGA,CAAA,KAAM;IACnB9B,QAAQ,CAACQ,IAAI,CAACO,WAAW,CAAChB,KAAK,CAAC;IAChCW,eAAe,CAACM,KAAK,CAAC,CAAC;IACvBlB,MAAM,CAAC,IAAIiC,KAAK,CAAC,+BAA+B,CAAC,CAAC;EACtD,CAAC;EAEDhC,KAAK,CAACiC,gBAAgB,CAAC,QAAQ,EAAEnB,QAAQ,EAAE;IAAED;EAAO,CAAC,CAAC;EACtDb,KAAK,CAACiC,gBAAgB,CAAC,UAAU,EAAEF,QAAQ,EAAE;IAAElB;EAAO,CAAC,CAAC;EAExDb,KAAK,CAACkC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC;AAEN,OAAO,MAAML,iBAAiB,GAAGA,CAACV,KAAa,EAAEvB,eAAwB,KAAK;EAC1E,MAAMuC,aAAa,GAAGhB,KAAK,CAACiB,MAAM,CAAEZ,IAAI,IAAK;IACzC,MAAMa,QAAQ,GAAGb,IAAI,CAACc,IAAI,GAAG,IAAI,GAAG,IAAI;IAExC,IAAI1C,eAAe,IAAIA,eAAe,GAAGyC,QAAQ,EAAE;MAC/C,OAAO,KAAK;IAChB;IAEA,IAAIb,IAAI,CAAC9B,IAAI,CAAC6C,QAAQ,CAAC,QAAQ,CAAC,IAAIF,QAAQ,GAAG,GAAG,EAAE;MAChD,OAAO,KAAK;IAChB;IAEA,OAAO,EAAEb,IAAI,CAAC9B,IAAI,CAAC6C,QAAQ,CAAC,QAAQ,CAAC,IAAIF,QAAQ,GAAG,EAAE,CAAC;EAC3D,CAAC,CAAC;EAEF,IAAIlB,KAAK,CAACqB,MAAM,KAAKL,aAAa,CAACK,MAAM,EAAE;IACvC,KAAKjD,YAAY,CAAC;MACdG,IAAI,EAAEF,UAAU,CAACiD,KAAK;MACtBC,IAAI,EAAE;IACV,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC;EACb;EAEA,OAAOR,aAAa;AACxB,CAAC;AAED,OAAO,MAAML,qBAAqB,GAAGA,CACjCX,KAAwB,EACxByB,SAAiB,KACG;EACpB,MAAMC,YAAY,GAAGD,SAAS,CAACE,KAAK,CAAC,GAAG,CAAC,CAACvB,GAAG,CAAE7B,IAAI,IAAKA,IAAI,CAACqD,IAAI,CAAC,CAAC,CAAC;EAEpE,MAAMC,aAAa,GAAIC,QAAgB,IACnCJ,YAAY,CAACK,IAAI,CAAEC,WAAW,IAAK;IAC/B,IAAIA,WAAW,CAACC,QAAQ,CAAC,IAAI,CAAC,EAAE;MAC5B,MAAMC,oBAAoB,GAAGF,WAAW,CAACL,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;MAEvD,IAAI,CAACO,oBAAoB,EAAE;QACvB,OAAO,KAAK;MAChB;MAEA,OAAOJ,QAAQ,CAACK,UAAU,CAACD,oBAAoB,CAAC;IACpD;IAEA,OAAOJ,QAAQ,KAAKE,WAAW;EACnC,CAAC,CAAC;EAEN,OAAOI,KAAK,CAACC,IAAI,CAACrC,KAAK,CAAC,CAACiB,MAAM,CAAEZ,IAAI,IAAKwB,aAAa,CAACxB,IAAI,CAAC9B,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,OAAO,MAAM+D,oBAAoB,GAAIjC,IAAU,IAC3C,IAAI3B,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;EAC7B,MAAM2D,MAAM,GAAG,IAAIC,UAAU,CAAC,CAAC;EAE/BD,MAAM,CAACE,MAAM,GAAIC,CAAC,IAAK;IACnB,IAAIA,CAAC,CAAC3C,MAAM,EAAE4C,MAAM,EAAE;MAClBhE,OAAO,CAAC+D,CAAC,CAAC3C,MAAM,CAAC4C,MAAM,CAAC;IAC5B,CAAC,MAAM;MACH/D,MAAM,CAACiC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChD;EACJ,CAAC;EAED0B,MAAM,CAACK,OAAO,GAAGhE,MAAM;EAEvB2D,MAAM,CAACM,iBAAiB,CAACxC,IAAI,CAAC;AAClC,CAAC,CAAC;;AAEN;AACA;AACA;AACA;AACA,MAAMyC,eAAuC,GAAG;EAC5C;EACAC,GAAG,EAAE,YAAY;EACjBC,EAAE,EAAE,eAAe;EACnBC,GAAG,EAAE,UAAU;EACfC,IAAI,EAAE,kBAAkB;EACxBC,GAAG,EAAE,iBAAiB;EACtBC,IAAI,EAAE,oBAAoB;EAC1BC,GAAG,EAAE,oBAAoB;EACzBC,IAAI,EAAE,WAAW;EACjBC,GAAG,EAAE,WAAW;EAChBC,GAAG,EAAE,UAAU;EACfC,EAAE,EAAE,wBAAwB;EAC5BC,EAAE,EAAE,wBAAwB;EAE5B;EACAC,GAAG,EAAE,YAAY;EACjBC,IAAI,EAAE,YAAY;EAClBC,GAAG,EAAE,WAAW;EAChBC,GAAG,EAAE,WAAW;EAChBC,IAAI,EAAE,YAAY;EAClBC,GAAG,EAAE,WAAW;EAChBC,GAAG,EAAE,eAAe;EACpBC,GAAG,EAAE,cAAc;EAEnB;EACAC,GAAG,EAAE,YAAY;EACjBC,GAAG,EAAE,WAAW;EAChBC,GAAG,EAAE,WAAW;EAChBC,IAAI,EAAE,YAAY;EAClBC,GAAG,EAAE,WAAW;EAEhB;EACAC,GAAG,EAAE,WAAW;EAChBC,IAAI,EAAE,YAAY;EAClBC,GAAG,EAAE,iBAAiB;EACtBC,GAAG,EAAE,iBAAiB;EACtBC,GAAG,EAAE,kBAAkB;EAEvB;EACAC,GAAG,EAAE,iBAAiB;EACtBC,GAAG,EAAE,oBAAoB;EACzBC,IAAI,EAAE,yEAAyE;EAC/EC,GAAG,EAAE,0BAA0B;EAC/BC,IAAI,EAAE,mEAAmE;EACzEC,GAAG,EAAE,+BAA+B;EACpCC,IAAI,EAAE,2EAA2E;EAEjF;EACAC,GAAG,EAAE,iBAAiB;EACtBC,GAAG,EAAE,qBAAqB;EAC1B,IAAI,EAAE,6BAA6B;EACnCC,GAAG,EAAE,mBAAmB;EACxBC,EAAE,EAAE,kBAAkB;EACtBC,GAAG,EAAE;AACT,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAMhF,WAAW,GAAIH,IAAU,IAAa;EACxC,IAAIA,IAAI,CAAC9B,IAAI,EAAE,OAAO8B,IAAI,CAAC9B,IAAI;EAE/B,MAAMkH,GAAG,GAAGpF,IAAI,CAACE,IAAI,CAACoB,KAAK,CAAC,GAAG,CAAC,CAAC+D,GAAG,CAAC,CAAC,EAAEC,WAAW,CAAC,CAAC,IAAI,EAAE;EAE3D,OAAO7C,eAAe,CAAC2C,GAAG,CAAC,IAAI,EAAE;AACrC,CAAC","ignoreList":[]}
@@ -4,6 +4,7 @@ interface SelectFilesOptions {
4
4
  maxFileSizeInMB?: number;
5
5
  }
6
6
  export declare const selectFiles: ({ type, multiple, maxFileSizeInMB, }: SelectFilesOptions) => Promise<File[]>;
7
+ export declare const filterFilesBySize: (files: File[], maxFileSizeInMB?: number) => File[];
7
8
  export declare const filterFilesByMimeType: (files: FileList | File[], mimeTypes: string) => FileList | File[];
8
9
  export declare const getFileAsArrayBuffer: (file: File) => Promise<string | ArrayBuffer>;
9
10
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-components/core",
3
- "version": "5.5.57",
3
+ "version": "5.5.59",
4
4
  "description": "A set of beautiful React components for developing your own applications with chayns.",
5
5
  "sideEffects": false,
6
6
  "browserslist": [
@@ -93,5 +93,5 @@
93
93
  "publishConfig": {
94
94
  "access": "public"
95
95
  },
96
- "gitHead": "b459c22ff66328b82b7c504447ad4685200d47d4"
96
+ "gitHead": "46fe35b742c2a48451ed2392ec0bb58aa26985e2"
97
97
  }