@chayns-components/core 5.0.0-beta.1222 → 5.0.0-beta.1223
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.
|
@@ -34,15 +34,21 @@ const selectFiles = ({
|
|
|
34
34
|
resolve([]);
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
|
-
const target = event.target;
|
|
38
37
|
const {
|
|
39
38
|
files
|
|
40
|
-
} = target;
|
|
39
|
+
} = event.target;
|
|
41
40
|
if (!files) {
|
|
42
41
|
resolve([]);
|
|
43
42
|
return;
|
|
44
43
|
}
|
|
45
|
-
const fileArray = Object.values(files)
|
|
44
|
+
const fileArray = Object.values(files).map(file => {
|
|
45
|
+
if (file.type === '') {
|
|
46
|
+
return new File([file], file.name, {
|
|
47
|
+
type: getMimeType(file)
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return file;
|
|
51
|
+
});
|
|
46
52
|
let filteredFileArray = fileArray.filter(file => {
|
|
47
53
|
const sizeInMB = file.size / 1024 / 1024;
|
|
48
54
|
if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {
|
|
@@ -106,5 +112,73 @@ const getFileAsArrayBuffer = file => new Promise((resolve, reject) => {
|
|
|
106
112
|
reader.onerror = reject;
|
|
107
113
|
reader.readAsArrayBuffer(file);
|
|
108
114
|
});
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Mapping file extensions to MIME types
|
|
118
|
+
* (expandable if necessary)
|
|
119
|
+
*/
|
|
109
120
|
exports.getFileAsArrayBuffer = getFileAsArrayBuffer;
|
|
121
|
+
const extensionToMime = {
|
|
122
|
+
// Text & Code
|
|
123
|
+
txt: 'text/plain',
|
|
124
|
+
md: 'text/markdown',
|
|
125
|
+
csv: 'text/csv',
|
|
126
|
+
json: 'application/json',
|
|
127
|
+
xml: 'application/xml',
|
|
128
|
+
yaml: 'application/x-yaml',
|
|
129
|
+
yml: 'application/x-yaml',
|
|
130
|
+
html: 'text/html',
|
|
131
|
+
htm: 'text/html',
|
|
132
|
+
css: 'text/css',
|
|
133
|
+
js: 'application/javascript',
|
|
134
|
+
ts: 'application/typescript',
|
|
135
|
+
// Image
|
|
136
|
+
jpg: 'image/jpeg',
|
|
137
|
+
jpeg: 'image/jpeg',
|
|
138
|
+
png: 'image/png',
|
|
139
|
+
gif: 'image/gif',
|
|
140
|
+
webp: 'image/webp',
|
|
141
|
+
bmp: 'image/bmp',
|
|
142
|
+
svg: 'image/svg+xml',
|
|
143
|
+
ico: 'image/x-icon',
|
|
144
|
+
// Audio
|
|
145
|
+
mp3: 'audio/mpeg',
|
|
146
|
+
wav: 'audio/wav',
|
|
147
|
+
ogg: 'audio/ogg',
|
|
148
|
+
flac: 'audio/flac',
|
|
149
|
+
m4a: 'audio/mp4',
|
|
150
|
+
// Video
|
|
151
|
+
mp4: 'video/mp4',
|
|
152
|
+
webm: 'video/webm',
|
|
153
|
+
avi: 'video/x-msvideo',
|
|
154
|
+
mov: 'video/quicktime',
|
|
155
|
+
mkv: 'video/x-matroska',
|
|
156
|
+
// Document
|
|
157
|
+
pdf: 'application/pdf',
|
|
158
|
+
doc: 'application/msword',
|
|
159
|
+
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
160
|
+
xls: 'application/vnd.ms-excel',
|
|
161
|
+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
162
|
+
ppt: 'application/vnd.ms-powerpoint',
|
|
163
|
+
pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
164
|
+
// Archive & binary
|
|
165
|
+
zip: 'application/zip',
|
|
166
|
+
rar: 'application/vnd.rar',
|
|
167
|
+
'7z': 'application/x-7z-compressed',
|
|
168
|
+
tar: 'application/x-tar',
|
|
169
|
+
gz: 'application/gzip',
|
|
170
|
+
exe: 'application/vnd.microsoft.portable-executable'
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Ermittelt den MIME-Type eines Files
|
|
175
|
+
* - nutzt File.type, falls vorhanden
|
|
176
|
+
* - sonst Fallback über Dateiendung
|
|
177
|
+
*/
|
|
178
|
+
const getMimeType = file => {
|
|
179
|
+
var _file$name$split$pop;
|
|
180
|
+
if (file.type) return file.type;
|
|
181
|
+
const ext = ((_file$name$split$pop = file.name.split('.').pop()) === null || _file$name$split$pop === void 0 ? void 0 : _file$name$split$pop.toLowerCase()) ?? '';
|
|
182
|
+
return extensionToMime[ext] || '';
|
|
183
|
+
};
|
|
110
184
|
//# sourceMappingURL=fileDialog.js.map
|
|
@@ -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","filteredFileArray","filter","file","sizeInMB","size","includes","length","createDialog","DialogType","ALERT","text","open","filterFilesByMimeType","onCancel","Error","addEventListener","click","exports","mimeTypes","allowedTypes","split","map","trim","isAllowedType","fileType","some","allowedType","endsWith","convertedAllowedType","startsWith","Array","from","getFileAsArrayBuffer","reader","FileReader","onload","e","_e$target","result","onerror","readAsArrayBuffer"],"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 target = event.target as HTMLInputElement;\n const { files } = target;\n\n if (!files) {\n resolve([]);\n return;\n }\n\n const fileArray = Object.values(files);\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"],"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","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":[]}
|
|
@@ -28,15 +28,21 @@ export const selectFiles = ({
|
|
|
28
28
|
resolve([]);
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
const target = event.target;
|
|
32
31
|
const {
|
|
33
32
|
files
|
|
34
|
-
} = target;
|
|
33
|
+
} = event.target;
|
|
35
34
|
if (!files) {
|
|
36
35
|
resolve([]);
|
|
37
36
|
return;
|
|
38
37
|
}
|
|
39
|
-
const fileArray = Object.values(files)
|
|
38
|
+
const fileArray = Object.values(files).map(file => {
|
|
39
|
+
if (file.type === '') {
|
|
40
|
+
return new File([file], file.name, {
|
|
41
|
+
type: getMimeType(file)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return file;
|
|
45
|
+
});
|
|
40
46
|
let filteredFileArray = fileArray.filter(file => {
|
|
41
47
|
const sizeInMB = file.size / 1024 / 1024;
|
|
42
48
|
if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {
|
|
@@ -97,4 +103,71 @@ export const getFileAsArrayBuffer = file => new Promise((resolve, reject) => {
|
|
|
97
103
|
reader.onerror = reject;
|
|
98
104
|
reader.readAsArrayBuffer(file);
|
|
99
105
|
});
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Mapping file extensions to MIME types
|
|
109
|
+
* (expandable if necessary)
|
|
110
|
+
*/
|
|
111
|
+
const extensionToMime = {
|
|
112
|
+
// Text & Code
|
|
113
|
+
txt: 'text/plain',
|
|
114
|
+
md: 'text/markdown',
|
|
115
|
+
csv: 'text/csv',
|
|
116
|
+
json: 'application/json',
|
|
117
|
+
xml: 'application/xml',
|
|
118
|
+
yaml: 'application/x-yaml',
|
|
119
|
+
yml: 'application/x-yaml',
|
|
120
|
+
html: 'text/html',
|
|
121
|
+
htm: 'text/html',
|
|
122
|
+
css: 'text/css',
|
|
123
|
+
js: 'application/javascript',
|
|
124
|
+
ts: 'application/typescript',
|
|
125
|
+
// Image
|
|
126
|
+
jpg: 'image/jpeg',
|
|
127
|
+
jpeg: 'image/jpeg',
|
|
128
|
+
png: 'image/png',
|
|
129
|
+
gif: 'image/gif',
|
|
130
|
+
webp: 'image/webp',
|
|
131
|
+
bmp: 'image/bmp',
|
|
132
|
+
svg: 'image/svg+xml',
|
|
133
|
+
ico: 'image/x-icon',
|
|
134
|
+
// Audio
|
|
135
|
+
mp3: 'audio/mpeg',
|
|
136
|
+
wav: 'audio/wav',
|
|
137
|
+
ogg: 'audio/ogg',
|
|
138
|
+
flac: 'audio/flac',
|
|
139
|
+
m4a: 'audio/mp4',
|
|
140
|
+
// Video
|
|
141
|
+
mp4: 'video/mp4',
|
|
142
|
+
webm: 'video/webm',
|
|
143
|
+
avi: 'video/x-msvideo',
|
|
144
|
+
mov: 'video/quicktime',
|
|
145
|
+
mkv: 'video/x-matroska',
|
|
146
|
+
// Document
|
|
147
|
+
pdf: 'application/pdf',
|
|
148
|
+
doc: 'application/msword',
|
|
149
|
+
docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
150
|
+
xls: 'application/vnd.ms-excel',
|
|
151
|
+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
152
|
+
ppt: 'application/vnd.ms-powerpoint',
|
|
153
|
+
pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
154
|
+
// Archive & binary
|
|
155
|
+
zip: 'application/zip',
|
|
156
|
+
rar: 'application/vnd.rar',
|
|
157
|
+
'7z': 'application/x-7z-compressed',
|
|
158
|
+
tar: 'application/x-tar',
|
|
159
|
+
gz: 'application/gzip',
|
|
160
|
+
exe: 'application/vnd.microsoft.portable-executable'
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Ermittelt den MIME-Type eines Files
|
|
165
|
+
* - nutzt File.type, falls vorhanden
|
|
166
|
+
* - sonst Fallback über Dateiendung
|
|
167
|
+
*/
|
|
168
|
+
const getMimeType = file => {
|
|
169
|
+
if (file.type) return file.type;
|
|
170
|
+
const ext = file.name.split('.').pop()?.toLowerCase() ?? '';
|
|
171
|
+
return extensionToMime[ext] || '';
|
|
172
|
+
};
|
|
100
173
|
//# sourceMappingURL=fileDialog.js.map
|
|
@@ -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","filteredFileArray","filter","file","sizeInMB","size","includes","length","ALERT","text","open","filterFilesByMimeType","onCancel","Error","addEventListener","click","mimeTypes","allowedTypes","split","map","trim","isAllowedType","fileType","some","allowedType","endsWith","convertedAllowedType","startsWith","Array","from","getFileAsArrayBuffer","reader","FileReader","onload","e","result","onerror","readAsArrayBuffer"],"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 target = event.target as HTMLInputElement;\n const { files } = target;\n\n if (!files) {\n resolve([]);\n return;\n }\n\n const fileArray = Object.values(files);\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"],"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","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":"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,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,KAAK1C,YAAY,CAAC;QACdG,IAAI,EAAEF,UAAU,CAAC0C,KAAK;QACtBC,IAAI,EAAE;MACV,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC;IACb;IAEA,IAAI,OAAO1C,IAAI,KAAK,QAAQ,EAAE;MAC1BkC,iBAAiB,GAAGS,qBAAqB,CAACT,iBAAiB,EAAElC,IAAI,CAAW;IAChF;IAEAI,OAAO,CAAC8B,iBAAiB,CAAC;EAC9B,CAAC;EAED,MAAMU,QAAQ,GAAGA,CAAA,KAAM;IACnBrC,QAAQ,CAACQ,IAAI,CAACO,WAAW,CAAChB,KAAK,CAAC;IAChCW,eAAe,CAACM,KAAK,CAAC,CAAC;IACvBlB,MAAM,CAAC,IAAIwC,KAAK,CAAC,+BAA+B,CAAC,CAAC;EACtD,CAAC;EAEDvC,KAAK,CAACwC,gBAAgB,CAAC,QAAQ,EAAE1B,QAAQ,EAAE;IAAED;EAAO,CAAC,CAAC;EACtDb,KAAK,CAACwC,gBAAgB,CAAC,UAAU,EAAEF,QAAQ,EAAE;IAAEzB;EAAO,CAAC,CAAC;EAExDb,KAAK,CAACyC,KAAK,CAAC,CAAC;AACjB,CAAC,CAAC;AAEN,OAAO,MAAMJ,qBAAqB,GAAGA,CACjClB,KAAwB,EACxBuB,SAAiB,KACG;EACpB,MAAMC,YAAY,GAAGD,SAAS,CAACE,KAAK,CAAC,GAAG,CAAC,CAACrB,GAAG,CAAE7B,IAAI,IAAKA,IAAI,CAACmD,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,CAACnC,KAAK,CAAC,CAACU,MAAM,CAAEL,IAAI,IAAKsB,aAAa,CAACtB,IAAI,CAAC9B,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,OAAO,MAAM6D,oBAAoB,GAAI/B,IAAU,IAC3C,IAAI3B,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;EAC7B,MAAMyD,MAAM,GAAG,IAAIC,UAAU,CAAC,CAAC;EAE/BD,MAAM,CAACE,MAAM,GAAIC,CAAC,IAAK;IACnB,IAAIA,CAAC,CAACzC,MAAM,EAAE0C,MAAM,EAAE;MAClB9D,OAAO,CAAC6D,CAAC,CAACzC,MAAM,CAAC0C,MAAM,CAAC;IAC5B,CAAC,MAAM;MACH7D,MAAM,CAACwC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChD;EACJ,CAAC;EAEDiB,MAAM,CAACK,OAAO,GAAG9D,MAAM;EAEvByD,MAAM,CAACM,iBAAiB,CAACtC,IAAI,CAAC;AAClC,CAAC,CAAC;;AAEN;AACA;AACA;AACA;AACA,MAAMuC,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,MAAM9E,WAAW,GAAIH,IAAU,IAAa;EACxC,IAAIA,IAAI,CAAC9B,IAAI,EAAE,OAAO8B,IAAI,CAAC9B,IAAI;EAE/B,MAAMgH,GAAG,GAAGlF,IAAI,CAACE,IAAI,CAACkB,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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chayns-components/core",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.1223",
|
|
4
4
|
"description": "A set of beautiful React components for developing your own applications with chayns.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"browserslist": [
|
|
@@ -85,5 +85,5 @@
|
|
|
85
85
|
"publishConfig": {
|
|
86
86
|
"access": "public"
|
|
87
87
|
},
|
|
88
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "c2a0c2e545cce18828686fda67c0c9d3869d80c4"
|
|
89
89
|
}
|