@chayns-components/core 5.0.0-beta.964 → 5.0.0-beta.965

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.
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.selectFiles = exports.getFileAsArrayBuffer = void 0;
6
+ exports.selectFiles = exports.getFileAsArrayBuffer = exports.filterFilesByMimeType = void 0;
7
7
  var _chaynsApi = require("chayns-api");
8
8
  const selectFiles = ({
9
9
  type,
@@ -43,7 +43,7 @@ const selectFiles = ({
43
43
  return;
44
44
  }
45
45
  const fileArray = Object.values(files);
46
- const filteredFileArray = fileArray.filter(file => {
46
+ let filteredFileArray = fileArray.filter(file => {
47
47
  const sizeInMB = file.size / 1024 / 1024;
48
48
  if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {
49
49
  return false;
@@ -59,6 +59,9 @@ const selectFiles = ({
59
59
  text: 'Einige Deiner ausgewählten Dateien sind zu groß.'
60
60
  }).open();
61
61
  }
62
+ if (typeof type === 'string') {
63
+ filteredFileArray = filterFilesByMimeType(filteredFileArray, type);
64
+ }
62
65
  resolve(filteredFileArray);
63
66
  };
64
67
  const onCancel = () => {
@@ -75,6 +78,21 @@ const selectFiles = ({
75
78
  input.click();
76
79
  });
77
80
  exports.selectFiles = selectFiles;
81
+ const filterFilesByMimeType = (files, mimeTypes) => {
82
+ const allowedTypes = mimeTypes.split(',').map(type => type.trim());
83
+ const isAllowedType = fileType => allowedTypes.some(allowedType => {
84
+ if (allowedType.endsWith('/*')) {
85
+ const convertedAllowedType = allowedType.split('/*')[0];
86
+ if (!convertedAllowedType) {
87
+ return false;
88
+ }
89
+ return fileType.startsWith(convertedAllowedType);
90
+ }
91
+ return fileType === allowedType;
92
+ });
93
+ return Array.from(files).filter(file => isAllowedType(file.type));
94
+ };
95
+ exports.filterFilesByMimeType = filterFilesByMimeType;
78
96
  const getFileAsArrayBuffer = file => new Promise((resolve, reject) => {
79
97
  const reader = new FileReader();
80
98
  reader.onload = e => {
@@ -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","onCancel","Error","addEventListener","click","exports","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 const 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 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 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","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);\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 = (files: FileList | File[], mimeTypes: string): 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":[]}
@@ -39,7 +39,7 @@ export const selectFiles = _ref => {
39
39
  return;
40
40
  }
41
41
  const fileArray = Object.values(files);
42
- const filteredFileArray = fileArray.filter(file => {
42
+ let filteredFileArray = fileArray.filter(file => {
43
43
  const sizeInMB = file.size / 1024 / 1024;
44
44
  if (maxFileSizeInMB && maxFileSizeInMB < sizeInMB) {
45
45
  return false;
@@ -55,6 +55,9 @@ export const selectFiles = _ref => {
55
55
  text: 'Einige Deiner ausgewählten Dateien sind zu groß.'
56
56
  }).open();
57
57
  }
58
+ if (typeof type === 'string') {
59
+ filteredFileArray = filterFilesByMimeType(filteredFileArray, type);
60
+ }
58
61
  resolve(filteredFileArray);
59
62
  };
60
63
  const onCancel = () => {
@@ -71,6 +74,20 @@ export const selectFiles = _ref => {
71
74
  input.click();
72
75
  });
73
76
  };
77
+ export const filterFilesByMimeType = (files, mimeTypes) => {
78
+ const allowedTypes = mimeTypes.split(',').map(type => type.trim());
79
+ const isAllowedType = fileType => allowedTypes.some(allowedType => {
80
+ if (allowedType.endsWith('/*')) {
81
+ const convertedAllowedType = allowedType.split('/*')[0];
82
+ if (!convertedAllowedType) {
83
+ return false;
84
+ }
85
+ return fileType.startsWith(convertedAllowedType);
86
+ }
87
+ return fileType === allowedType;
88
+ });
89
+ return Array.from(files).filter(file => isAllowedType(file.type));
90
+ };
74
91
  export const getFileAsArrayBuffer = file => new Promise((resolve, reject) => {
75
92
  const reader = new FileReader();
76
93
  reader.onload = e => {
@@ -1 +1 @@
1
- {"version":3,"file":"fileDialog.js","names":["createDialog","DialogType","selectFiles","_ref","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","onCancel","Error","addEventListener","click","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 const 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 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 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","_ref","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);\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 = (files: FileList | File[], mimeTypes: string): 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":[]}
@@ -4,5 +4,6 @@ interface SelectFilesOptions {
4
4
  maxFileSizeInMB?: number;
5
5
  }
6
6
  export declare const selectFiles: ({ type, multiple, maxFileSizeInMB, }: SelectFilesOptions) => Promise<File[]>;
7
+ export declare const filterFilesByMimeType: (files: FileList | File[], mimeTypes: string) => File[];
7
8
  export declare const getFileAsArrayBuffer: (file: File) => Promise<string | ArrayBuffer>;
8
9
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-components/core",
3
- "version": "5.0.0-beta.964",
3
+ "version": "5.0.0-beta.965",
4
4
  "description": "A set of beautiful React components for developing your own applications with chayns.",
5
5
  "sideEffects": false,
6
6
  "browserslist": [
@@ -87,5 +87,5 @@
87
87
  "publishConfig": {
88
88
  "access": "public"
89
89
  },
90
- "gitHead": "d253c5b9ab0e9f89ab927b43b8a1243c34655199"
90
+ "gitHead": "3d17e9e2dd344cc77c2e96e4db2ac6c03c76b2f3"
91
91
  }