@chayns-components/core 5.5.59-beta.0 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"AnimatedNumber.js","names":["_react","_interopRequireWildcard","require","_react2","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_ROUND","Math","round","DEFAULT_EASE","AnimatedNumber","value","duration","delay","locale","format","startFrom","onComplete","ease","motionValue","useMotionValue","display","setDisplay","useState","formatter","useMemo","toLocaleString","useEffect","controls","animate","stop","unsub","on","v","createElement","Fragment","exports","displayName","_default"],"sources":["../../../../src/components/animated-number/AnimatedNumber.tsx"],"sourcesContent":["import React, { FC, useEffect, useMemo, useState } from 'react';\nimport { animate, useMotionValue } from 'motion/react';\nimport { Easing } from 'motion';\n\ntype Ease = [number, number, number, number] | ((t: number) => number) | string;\n\nexport interface AnimatedNumberProps {\n /**\n * Start delay of the animation in seconds.\n */\n delay?: number;\n /**\n * Total duration of the animation in seconds.\n */\n duration?: number;\n /**\n * Easing curve of the animation (e.g., cubic-bezier like [0.16, 1, 0.3, 1] or predefined easings).\n * Controls how the animation accelerates/decelerates.\n */\n ease?: Ease;\n /**\n * Custom formatter for the displayed value.\n * If provided, it overrides locale/toLocaleString and round.\n * Example: (n) => `${Math.round(n)} points`\n */\n format?: (n: number) => string;\n /**\n * Locale used by toLocaleString when no custom formatter is provided.\n */\n locale?: string;\n /**\n * Callback invoked when the animation completes.\n */\n onComplete?: () => void;\n /**\n * Custom rounding function when no custom formatter is provided.\n * Default: Math.round\n */\n round?: (n: number) => number;\n /**\n * Starting value for the animation.\n * Default: 0\n */\n startFrom?: number;\n /**\n * Target value to animate to.\n */\n value: number;\n}\n\nconst DEFAULT_ROUND = Math.round;\nconst DEFAULT_EASE: Ease = [0.16, 1, 0.3, 1];\n\nexport const AnimatedNumber: FC<AnimatedNumberProps> = ({\n value,\n duration = 2,\n delay = 0,\n locale = 'de',\n format,\n round = DEFAULT_ROUND,\n startFrom = 0,\n onComplete,\n ease = DEFAULT_EASE,\n}) => {\n const motionValue = useMotionValue(startFrom);\n\n const [display, setDisplay] = useState<number>(startFrom);\n\n const formatter = useMemo(() => {\n if (format) return format;\n\n return (n: number) => round(n).toLocaleString(locale);\n }, [format, locale, round]);\n\n useEffect(() => {\n motionValue.set(startFrom);\n\n const controls = animate(motionValue, value, {\n duration,\n delay,\n ease: ease as Easing,\n onComplete,\n });\n\n return () => controls.stop();\n }, [value, duration, delay, startFrom, onComplete, ease, motionValue]);\n\n useEffect(() => {\n const unsub = motionValue.on('change', (v) => setDisplay(v));\n\n return () => unsub();\n }, [motionValue]);\n\n return <>{formatter(display)}</>;\n};\n\nAnimatedNumber.displayName = 'AnimatedNumber';\n\nexport default AnimatedNumber;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"AnimatedNumber.js","names":["_react","_interopRequireWildcard","require","_react2","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_ROUND","Math","round","DEFAULT_EASE","AnimatedNumber","value","duration","delay","locale","format","startFrom","onComplete","ease","motionValue","useMotionValue","display","setDisplay","useState","formatter","useMemo","toLocaleString","useEffect","controls","animate","stop","unsub","on","v","createElement","Fragment","exports","displayName","_default"],"sources":["../../../../src/components/animated-number/AnimatedNumber.tsx"],"sourcesContent":["import React, { FC, useEffect, useMemo, useState } from 'react';\nimport { animate, useMotionValue } from 'motion/react';\nimport { Easing, MotionValue, ObjectTarget } from 'motion';\n\ntype Ease = [number, number, number, number] | ((t: number) => number) | string;\n\nexport interface AnimatedNumberProps {\n /**\n * Start delay of the animation in seconds.\n */\n delay?: number;\n /**\n * Total duration of the animation in seconds.\n */\n duration?: number;\n /**\n * Easing curve of the animation (e.g., cubic-bezier like [0.16, 1, 0.3, 1] or predefined easings).\n * Controls how the animation accelerates/decelerates.\n */\n ease?: Ease;\n /**\n * Custom formatter for the displayed value.\n * If provided, it overrides locale/toLocaleString and round.\n * Example: (n) => `${Math.round(n)} points`\n */\n format?: (n: number) => string;\n /**\n * Locale used by toLocaleString when no custom formatter is provided.\n */\n locale?: string;\n /**\n * Callback invoked when the animation completes.\n */\n onComplete?: () => void;\n /**\n * Custom rounding function when no custom formatter is provided.\n * Default: Math.round\n */\n round?: (n: number) => number;\n /**\n * Starting value for the animation.\n * Default: 0\n */\n startFrom?: number;\n /**\n * Target value to animate to.\n */\n value: number;\n}\n\nconst DEFAULT_ROUND = Math.round;\nconst DEFAULT_EASE: Ease = [0.16, 1, 0.3, 1];\n\nexport const AnimatedNumber: FC<AnimatedNumberProps> = ({\n value,\n duration = 2,\n delay = 0,\n locale = 'de',\n format,\n round = DEFAULT_ROUND,\n startFrom = 0,\n onComplete,\n ease = DEFAULT_EASE,\n}) => {\n const motionValue = useMotionValue(startFrom);\n\n const [display, setDisplay] = useState<number>(startFrom);\n\n const formatter = useMemo(() => {\n if (format) return format;\n\n return (n: number) => round(n).toLocaleString(locale);\n }, [format, locale, round]);\n\n useEffect(() => {\n motionValue.set(startFrom);\n\n const controls = animate(motionValue, value as ObjectTarget<MotionValue<number>>, {\n duration,\n delay,\n ease: ease as Easing,\n onComplete,\n });\n\n return () => controls.stop();\n }, [value, duration, delay, startFrom, onComplete, ease, motionValue]);\n\n useEffect(() => {\n const unsub = motionValue.on('change', (v) => setDisplay(v));\n\n return () => unsub();\n }, [motionValue]);\n\n return <>{formatter(display)}</>;\n};\n\nAnimatedNumber.displayName = 'AnimatedNumber';\n\nexport default AnimatedNumber;\n"],"mappings":"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","ignoreList":[]}
@@ -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":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAQO,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,GAAGR,SAAS,CAACS,MAAM,CAAEL,IAAI,IAAK;MAC/C,MAAMM,QAAQ,GAAGN,IAAI,CAACO,IAAI,GAAG,IAAI,GAAG,IAAI;MAExC,IAAInC,eAAe,IAAIA,eAAe,GAAGkC,QAAQ,EAAE;QAC/C,OAAO,KAAK;MAChB;MAEA,IAAIN,IAAI,CAAC9B,IAAI,CAACsC,QAAQ,CAAC,QAAQ,CAAC,IAAIF,QAAQ,GAAG,GAAG,EAAE;QAChD,OAAO,KAAK;MAChB;MAEA,OAAO,EAAEN,IAAI,CAAC9B,IAAI,CAACsC,QAAQ,CAAC,QAAQ,CAAC,IAAIF,QAAQ,GAAG,EAAE,CAAC;IAC3D,CAAC,CAAC;IAEF,IAAIV,SAAS,CAACa,MAAM,KAAKL,iBAAiB,CAACK,MAAM,EAAE;MAC/C,KAAK,IAAAC,uBAAY,EAAC;QACdxC,IAAI,EAAEyC,qBAAU,CAACC,KAAK;QACtBC,IAAI,EAAE;MACV,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC;IACb;IAEA,IAAI,OAAO5C,IAAI,KAAK,QAAQ,EAAE;MAC1BkC,iBAAiB,GAAGW,qBAAqB,CAACX,iBAAiB,EAAElC,IAAI,CAAW;IAChF;IAEAI,OAAO,CAAC8B,iBAAiB,CAAC;EAC9B,CAAC;EAED,MAAMY,QAAQ,GAAGA,CAAA,KAAM;IACnBvC,QAAQ,CAACQ,IAAI,CAACO,WAAW,CAAChB,KAAK,CAAC;IAChCW,eAAe,CAACM,KAAK,CAAC,CAAC;IACvBlB,MAAM,CAAC,IAAI0C,KAAK,CAAC,+BAA+B,CAAC,CAAC;EACtD,CAAC;EAEDzC,KAAK,CAAC0C,gBAAgB,CAAC,QAAQ,EAAE5B,QAAQ,EAAE;IAAED;EAAO,CAAC,CAAC;EACtDb,KAAK,CAAC0C,gBAAgB,CAAC,UAAU,EAAEF,QAAQ,EAAE;IAAE3B;EAAO,CAAC,CAAC;EAExDb,KAAK,CAAC2C,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC;AAACC,OAAA,CAAAnD,WAAA,GAAAA,WAAA;AAEA,MAAM8C,qBAAqB,GAAGA,CACjCpB,KAAwB,EACxB0B,SAAiB,KACG;EACpB,MAAMC,YAAY,GAAGD,SAAS,CAACE,KAAK,CAAC,GAAG,CAAC,CAACxB,GAAG,CAAE7B,IAAI,IAAKA,IAAI,CAACsD,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,CAACtC,KAAK,CAAC,CAACU,MAAM,CAAEL,IAAI,IAAKyB,aAAa,CAACzB,IAAI,CAAC9B,IAAI,CAAC,CAAC;AACvE,CAAC;AAACkD,OAAA,CAAAL,qBAAA,GAAAA,qBAAA;AAEK,MAAMmB,oBAAoB,GAAIlC,IAAU,IAC3C,IAAI3B,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;EAC7B,MAAM4D,MAAM,GAAG,IAAIC,UAAU,CAAC,CAAC;EAE/BD,MAAM,CAACE,MAAM,GAAIC,CAAC,IAAK;IAAA,IAAAC,SAAA;IACnB,KAAAA,SAAA,GAAID,CAAC,CAAC5C,MAAM,cAAA6C,SAAA,eAARA,SAAA,CAAUC,MAAM,EAAE;MAClBlE,OAAO,CAACgE,CAAC,CAAC5C,MAAM,CAAC8C,MAAM,CAAC;IAC5B,CAAC,MAAM;MACHjE,MAAM,CAAC0C,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChD;EACJ,CAAC;EAEDkB,MAAM,CAACM,OAAO,GAAGlE,MAAM;EAEvB4D,MAAM,CAACO,iBAAiB,CAAC1C,IAAI,CAAC;AAClC,CAAC,CAAC;;AAEN;AACA;AACA;AACA;AAHAoB,OAAA,CAAAc,oBAAA,GAAAA,oBAAA;AAIA,MAAMS,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,MAAMlF,WAAW,GAAIH,IAAU,IAAa;EAAA,IAAAsF,oBAAA;EACxC,IAAItF,IAAI,CAAC9B,IAAI,EAAE,OAAO8B,IAAI,CAAC9B,IAAI;EAE/B,MAAMqH,GAAG,GAAG,EAAAD,oBAAA,GAAAtF,IAAI,CAACE,IAAI,CAACqB,KAAK,CAAC,GAAG,CAAC,CAACiE,GAAG,CAAC,CAAC,cAAAF,oBAAA,uBAA1BA,oBAAA,CAA4BG,WAAW,CAAC,CAAC,KAAI,EAAE;EAE3D,OAAO9C,eAAe,CAAC4C,GAAG,CAAC,IAAI,EAAE;AACrC,CAAC","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 +1 @@
1
- {"version":3,"file":"AnimatedNumber.js","names":["React","useEffect","useMemo","useState","animate","useMotionValue","DEFAULT_ROUND","Math","round","DEFAULT_EASE","AnimatedNumber","value","duration","delay","locale","format","startFrom","onComplete","ease","motionValue","display","setDisplay","formatter","n","toLocaleString","set","controls","stop","unsub","on","v","createElement","Fragment","displayName"],"sources":["../../../../src/components/animated-number/AnimatedNumber.tsx"],"sourcesContent":["import React, { FC, useEffect, useMemo, useState } from 'react';\nimport { animate, useMotionValue } from 'motion/react';\nimport { Easing } from 'motion';\n\ntype Ease = [number, number, number, number] | ((t: number) => number) | string;\n\nexport interface AnimatedNumberProps {\n /**\n * Start delay of the animation in seconds.\n */\n delay?: number;\n /**\n * Total duration of the animation in seconds.\n */\n duration?: number;\n /**\n * Easing curve of the animation (e.g., cubic-bezier like [0.16, 1, 0.3, 1] or predefined easings).\n * Controls how the animation accelerates/decelerates.\n */\n ease?: Ease;\n /**\n * Custom formatter for the displayed value.\n * If provided, it overrides locale/toLocaleString and round.\n * Example: (n) => `${Math.round(n)} points`\n */\n format?: (n: number) => string;\n /**\n * Locale used by toLocaleString when no custom formatter is provided.\n */\n locale?: string;\n /**\n * Callback invoked when the animation completes.\n */\n onComplete?: () => void;\n /**\n * Custom rounding function when no custom formatter is provided.\n * Default: Math.round\n */\n round?: (n: number) => number;\n /**\n * Starting value for the animation.\n * Default: 0\n */\n startFrom?: number;\n /**\n * Target value to animate to.\n */\n value: number;\n}\n\nconst DEFAULT_ROUND = Math.round;\nconst DEFAULT_EASE: Ease = [0.16, 1, 0.3, 1];\n\nexport const AnimatedNumber: FC<AnimatedNumberProps> = ({\n value,\n duration = 2,\n delay = 0,\n locale = 'de',\n format,\n round = DEFAULT_ROUND,\n startFrom = 0,\n onComplete,\n ease = DEFAULT_EASE,\n}) => {\n const motionValue = useMotionValue(startFrom);\n\n const [display, setDisplay] = useState<number>(startFrom);\n\n const formatter = useMemo(() => {\n if (format) return format;\n\n return (n: number) => round(n).toLocaleString(locale);\n }, [format, locale, round]);\n\n useEffect(() => {\n motionValue.set(startFrom);\n\n const controls = animate(motionValue, value, {\n duration,\n delay,\n ease: ease as Easing,\n onComplete,\n });\n\n return () => controls.stop();\n }, [value, duration, delay, startFrom, onComplete, ease, motionValue]);\n\n useEffect(() => {\n const unsub = motionValue.on('change', (v) => setDisplay(v));\n\n return () => unsub();\n }, [motionValue]);\n\n return <>{formatter(display)}</>;\n};\n\nAnimatedNumber.displayName = 'AnimatedNumber';\n\nexport default AnimatedNumber;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAQC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAC/D,SAASC,OAAO,EAAEC,cAAc,QAAQ,cAAc;AAiDtD,MAAMC,aAAa,GAAGC,IAAI,CAACC,KAAK;AAChC,MAAMC,YAAkB,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAE5C,OAAO,MAAMC,cAAuC,GAAGA,CAAC;EACpDC,KAAK;EACLC,QAAQ,GAAG,CAAC;EACZC,KAAK,GAAG,CAAC;EACTC,MAAM,GAAG,IAAI;EACbC,MAAM;EACNP,KAAK,GAAGF,aAAa;EACrBU,SAAS,GAAG,CAAC;EACbC,UAAU;EACVC,IAAI,GAAGT;AACX,CAAC,KAAK;EACF,MAAMU,WAAW,GAAGd,cAAc,CAACW,SAAS,CAAC;EAE7C,MAAM,CAACI,OAAO,EAAEC,UAAU,CAAC,GAAGlB,QAAQ,CAASa,SAAS,CAAC;EAEzD,MAAMM,SAAS,GAAGpB,OAAO,CAAC,MAAM;IAC5B,IAAIa,MAAM,EAAE,OAAOA,MAAM;IAEzB,OAAQQ,CAAS,IAAKf,KAAK,CAACe,CAAC,CAAC,CAACC,cAAc,CAACV,MAAM,CAAC;EACzD,CAAC,EAAE,CAACC,MAAM,EAAED,MAAM,EAAEN,KAAK,CAAC,CAAC;EAE3BP,SAAS,CAAC,MAAM;IACZkB,WAAW,CAACM,GAAG,CAACT,SAAS,CAAC;IAE1B,MAAMU,QAAQ,GAAGtB,OAAO,CAACe,WAAW,EAAER,KAAK,EAAE;MACzCC,QAAQ;MACRC,KAAK;MACLK,IAAI,EAAEA,IAAc;MACpBD;IACJ,CAAC,CAAC;IAEF,OAAO,MAAMS,QAAQ,CAACC,IAAI,CAAC,CAAC;EAChC,CAAC,EAAE,CAAChB,KAAK,EAAEC,QAAQ,EAAEC,KAAK,EAAEG,SAAS,EAAEC,UAAU,EAAEC,IAAI,EAAEC,WAAW,CAAC,CAAC;EAEtElB,SAAS,CAAC,MAAM;IACZ,MAAM2B,KAAK,GAAGT,WAAW,CAACU,EAAE,CAAC,QAAQ,EAAGC,CAAC,IAAKT,UAAU,CAACS,CAAC,CAAC,CAAC;IAE5D,OAAO,MAAMF,KAAK,CAAC,CAAC;EACxB,CAAC,EAAE,CAACT,WAAW,CAAC,CAAC;EAEjB,oBAAOnB,KAAA,CAAA+B,aAAA,CAAA/B,KAAA,CAAAgC,QAAA,QAAGV,SAAS,CAACF,OAAO,CAAI,CAAC;AACpC,CAAC;AAEDV,cAAc,CAACuB,WAAW,GAAG,gBAAgB;AAE7C,eAAevB,cAAc","ignoreList":[]}
1
+ {"version":3,"file":"AnimatedNumber.js","names":["React","useEffect","useMemo","useState","animate","useMotionValue","DEFAULT_ROUND","Math","round","DEFAULT_EASE","AnimatedNumber","value","duration","delay","locale","format","startFrom","onComplete","ease","motionValue","display","setDisplay","formatter","n","toLocaleString","set","controls","stop","unsub","on","v","createElement","Fragment","displayName"],"sources":["../../../../src/components/animated-number/AnimatedNumber.tsx"],"sourcesContent":["import React, { FC, useEffect, useMemo, useState } from 'react';\nimport { animate, useMotionValue } from 'motion/react';\nimport { Easing, MotionValue, ObjectTarget } from 'motion';\n\ntype Ease = [number, number, number, number] | ((t: number) => number) | string;\n\nexport interface AnimatedNumberProps {\n /**\n * Start delay of the animation in seconds.\n */\n delay?: number;\n /**\n * Total duration of the animation in seconds.\n */\n duration?: number;\n /**\n * Easing curve of the animation (e.g., cubic-bezier like [0.16, 1, 0.3, 1] or predefined easings).\n * Controls how the animation accelerates/decelerates.\n */\n ease?: Ease;\n /**\n * Custom formatter for the displayed value.\n * If provided, it overrides locale/toLocaleString and round.\n * Example: (n) => `${Math.round(n)} points`\n */\n format?: (n: number) => string;\n /**\n * Locale used by toLocaleString when no custom formatter is provided.\n */\n locale?: string;\n /**\n * Callback invoked when the animation completes.\n */\n onComplete?: () => void;\n /**\n * Custom rounding function when no custom formatter is provided.\n * Default: Math.round\n */\n round?: (n: number) => number;\n /**\n * Starting value for the animation.\n * Default: 0\n */\n startFrom?: number;\n /**\n * Target value to animate to.\n */\n value: number;\n}\n\nconst DEFAULT_ROUND = Math.round;\nconst DEFAULT_EASE: Ease = [0.16, 1, 0.3, 1];\n\nexport const AnimatedNumber: FC<AnimatedNumberProps> = ({\n value,\n duration = 2,\n delay = 0,\n locale = 'de',\n format,\n round = DEFAULT_ROUND,\n startFrom = 0,\n onComplete,\n ease = DEFAULT_EASE,\n}) => {\n const motionValue = useMotionValue(startFrom);\n\n const [display, setDisplay] = useState<number>(startFrom);\n\n const formatter = useMemo(() => {\n if (format) return format;\n\n return (n: number) => round(n).toLocaleString(locale);\n }, [format, locale, round]);\n\n useEffect(() => {\n motionValue.set(startFrom);\n\n const controls = animate(motionValue, value as ObjectTarget<MotionValue<number>>, {\n duration,\n delay,\n ease: ease as Easing,\n onComplete,\n });\n\n return () => controls.stop();\n }, [value, duration, delay, startFrom, onComplete, ease, motionValue]);\n\n useEffect(() => {\n const unsub = motionValue.on('change', (v) => setDisplay(v));\n\n return () => unsub();\n }, [motionValue]);\n\n return <>{formatter(display)}</>;\n};\n\nAnimatedNumber.displayName = 'AnimatedNumber';\n\nexport default AnimatedNumber;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAQC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAC/D,SAASC,OAAO,EAAEC,cAAc,QAAQ,cAAc;AAiDtD,MAAMC,aAAa,GAAGC,IAAI,CAACC,KAAK;AAChC,MAAMC,YAAkB,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AAE5C,OAAO,MAAMC,cAAuC,GAAGA,CAAC;EACpDC,KAAK;EACLC,QAAQ,GAAG,CAAC;EACZC,KAAK,GAAG,CAAC;EACTC,MAAM,GAAG,IAAI;EACbC,MAAM;EACNP,KAAK,GAAGF,aAAa;EACrBU,SAAS,GAAG,CAAC;EACbC,UAAU;EACVC,IAAI,GAAGT;AACX,CAAC,KAAK;EACF,MAAMU,WAAW,GAAGd,cAAc,CAACW,SAAS,CAAC;EAE7C,MAAM,CAACI,OAAO,EAAEC,UAAU,CAAC,GAAGlB,QAAQ,CAASa,SAAS,CAAC;EAEzD,MAAMM,SAAS,GAAGpB,OAAO,CAAC,MAAM;IAC5B,IAAIa,MAAM,EAAE,OAAOA,MAAM;IAEzB,OAAQQ,CAAS,IAAKf,KAAK,CAACe,CAAC,CAAC,CAACC,cAAc,CAACV,MAAM,CAAC;EACzD,CAAC,EAAE,CAACC,MAAM,EAAED,MAAM,EAAEN,KAAK,CAAC,CAAC;EAE3BP,SAAS,CAAC,MAAM;IACZkB,WAAW,CAACM,GAAG,CAACT,SAAS,CAAC;IAE1B,MAAMU,QAAQ,GAAGtB,OAAO,CAACe,WAAW,EAAER,KAAK,EAAuC;MAC9EC,QAAQ;MACRC,KAAK;MACLK,IAAI,EAAEA,IAAc;MACpBD;IACJ,CAAC,CAAC;IAEF,OAAO,MAAMS,QAAQ,CAACC,IAAI,CAAC,CAAC;EAChC,CAAC,EAAE,CAAChB,KAAK,EAAEC,QAAQ,EAAEC,KAAK,EAAEG,SAAS,EAAEC,UAAU,EAAEC,IAAI,EAAEC,WAAW,CAAC,CAAC;EAEtElB,SAAS,CAAC,MAAM;IACZ,MAAM2B,KAAK,GAAGT,WAAW,CAACU,EAAE,CAAC,QAAQ,EAAGC,CAAC,IAAKT,UAAU,CAACS,CAAC,CAAC,CAAC;IAE5D,OAAO,MAAMF,KAAK,CAAC,CAAC;EACxB,CAAC,EAAE,CAACT,WAAW,CAAC,CAAC;EAEjB,oBAAOnB,KAAA,CAAA+B,aAAA,CAAA/B,KAAA,CAAAgC,QAAA,QAAGV,SAAS,CAACF,OAAO,CAAI,CAAC;AACpC,CAAC;AAEDV,cAAc,CAACuB,WAAW,GAAG,gBAAgB;AAE7C,eAAevB,cAAc","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":"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","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.59-beta.0",
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": [
@@ -85,7 +85,7 @@
85
85
  },
86
86
  "peerDependencies": {
87
87
  "chayns-api": ">=2.2.0",
88
- "motion": "^12.4.1 || ^13.0.0",
88
+ "motion": ">=12.4.1",
89
89
  "react": ">=18.0.0",
90
90
  "react-dom": ">=18.0.0",
91
91
  "styled-components": ">=5.3.11"
@@ -93,5 +93,5 @@
93
93
  "publishConfig": {
94
94
  "access": "public"
95
95
  },
96
- "gitHead": "e8dc8555063d257462a88de3e45dc960fc212d79"
96
+ "gitHead": "46fe35b742c2a48451ed2392ec0bb58aa26985e2"
97
97
  }