@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":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-components/core",
3
- "version": "5.0.0-beta.1222",
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": "46bf5187cb3add34be1579d134bffe6251028c8d"
88
+ "gitHead": "c2a0c2e545cce18828686fda67c0c9d3869d80c4"
89
89
  }