@ainias42/react-bootstrap-mobile 0.1.15 → 0.1.17

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.
Files changed (81) hide show
  1. package/bin/updateCopies.js +9 -5
  2. package/bootstrapReactMobile.ts +13 -2
  3. package/dist/bootstrapReactMobile.d.ts +13 -2
  4. package/dist/bootstrapReactMobile.js +992 -395
  5. package/dist/bootstrapReactMobile.js.map +1 -1
  6. package/dist/src/Components/Clickable/Clickable.d.ts +7 -3
  7. package/dist/src/Components/Dialog/DialogBackground.d.ts +4 -5
  8. package/dist/src/Components/Dialog/DialogContainer.d.ts +7 -3
  9. package/dist/src/Components/DragAndDrop/DragItem.d.ts +1 -1
  10. package/dist/src/Components/Flavor.d.ts +4 -0
  11. package/dist/src/Components/FormElements/Button/Button.d.ts +8 -4
  12. package/dist/src/Components/FormElements/Button/ButtonType.d.ts +4 -0
  13. package/dist/src/Components/FormElements/Input/FileInput/FileInput.d.ts +12 -0
  14. package/dist/src/Components/FormElements/Input/FileInput/FileType.d.ts +7 -0
  15. package/dist/src/Components/FormElements/Input/FileInput/MultipleFileInput.d.ts +17 -0
  16. package/dist/src/Components/FormElements/Select/Select.d.ts +2 -1
  17. package/dist/src/Components/FormElements/Switch/Switch.d.ts +4 -4
  18. package/dist/src/Components/Hooks/useMousePosition.d.ts +5 -0
  19. package/dist/src/Components/Hooks/useWindowDimensions.d.ts +4 -0
  20. package/dist/src/Components/Icon/Icon.d.ts +2 -3
  21. package/dist/src/Components/Layout/Grid/Grid.d.ts +2 -1
  22. package/dist/src/Components/Layout/Grid/GridItem.d.ts +4 -1
  23. package/dist/src/Components/Menu/HoverMenu.d.ts +9 -0
  24. package/dist/src/Components/Menu/Menu.d.ts +16 -7
  25. package/dist/src/Components/Menu/MenuCloseContext.d.ts +3 -0
  26. package/dist/src/Components/Menu/MenuDivider.d.ts +2 -0
  27. package/dist/src/Components/Menu/MenuItem.d.ts +23 -0
  28. package/dist/src/Components/Menu/Submenu.d.ts +12 -0
  29. package/dist/src/Components/Menu/useMenu.d.ts +1 -1
  30. package/dist/src/Components/RbmComponentProps.d.ts +4 -0
  31. package/dist/src/Components/Text/Text.d.ts +1 -0
  32. package/dist/src/ListRow/ListRow.d.ts +1 -0
  33. package/package.json +8 -7
  34. package/src/Components/Clickable/Clickable.tsx +135 -19
  35. package/src/Components/Dialog/DialogBackground.tsx +5 -8
  36. package/src/Components/Dialog/DialogContainer.tsx +12 -8
  37. package/src/Components/Dialog/DialogContext.ts +1 -2
  38. package/src/Components/Dialog/dialogBackground.scss +5 -1
  39. package/src/Components/DragAndDrop/DragItem.tsx +7 -7
  40. package/src/Components/DragAndDrop/DropArea.tsx +2 -1
  41. package/src/Components/Flavor.ts +4 -0
  42. package/src/Components/FormElements/Button/Button.tsx +31 -13
  43. package/src/Components/FormElements/Button/ButtonType.ts +4 -0
  44. package/src/Components/FormElements/Button/button.scss +22 -5
  45. package/src/Components/FormElements/Input/FileInput/FileInput.tsx +55 -0
  46. package/src/Components/FormElements/Input/FileInput/FileType.ts +1 -0
  47. package/src/Components/FormElements/Input/FileInput/MultipleFileInput.tsx +281 -0
  48. package/src/Components/FormElements/{ImageInput/imageInput.scss → Input/FileInput/fileInput.scss} +37 -7
  49. package/src/Components/FormElements/Input/input.scss +1 -1
  50. package/src/Components/FormElements/SearchSelectInput/SearchSelectInput.tsx +2 -2
  51. package/src/Components/FormElements/SearchSelectInput/seachSelectInput.scss +1 -1
  52. package/src/Components/FormElements/Select/Select.tsx +3 -2
  53. package/src/Components/FormElements/Select/select.scss +5 -0
  54. package/src/Components/FormElements/Switch/Switch.tsx +9 -8
  55. package/src/Components/FormElements/Switch/switch.scss +1 -0
  56. package/src/Components/Hooks/useMousePosition.ts +13 -0
  57. package/src/Components/Hooks/useWindowDimensions.ts +17 -0
  58. package/src/Components/Icon/Icon.tsx +18 -14
  59. package/src/Components/Icon/icon.scss +9 -0
  60. package/src/Components/Layout/Grid/Grid.tsx +3 -2
  61. package/src/Components/Layout/Grid/GridItem.tsx +16 -1
  62. package/src/Components/Layout/Grid/grid.scss +113 -36
  63. package/src/Components/Menu/HoverMenu.tsx +82 -0
  64. package/src/Components/Menu/Menu.tsx +101 -47
  65. package/src/Components/Menu/MenuCloseContext.ts +10 -0
  66. package/src/Components/Menu/MenuDivider.tsx +22 -0
  67. package/src/Components/Menu/MenuItem.tsx +95 -0
  68. package/src/Components/Menu/Submenu.tsx +101 -0
  69. package/src/Components/Menu/menu.scss +99 -10
  70. package/src/Components/Menu/useMenu.ts +1 -1
  71. package/src/Components/RbmComponentProps.ts +6 -0
  72. package/src/Components/Text/Text.tsx +1 -0
  73. package/src/Components/Text/text.scss +13 -5
  74. package/src/ListRow/ListRow.tsx +20 -0
  75. package/src/WrongChildError.ts +0 -2
  76. package/src/scss/_colors.scss +1 -1
  77. package/src/scss/_flavorMixin.scss +10 -0
  78. package/dist/src/Components/FormElements/ImageInput/ImageInput.d.ts +0 -18
  79. package/dist/src/Components/FormElements/ImageInput/MultipleFileInput.d.ts +0 -21
  80. package/src/Components/FormElements/ImageInput/ImageInput.tsx +0 -98
  81. package/src/Components/FormElements/ImageInput/MultipleFileInput.tsx +0 -240
@@ -1,240 +0,0 @@
1
- import * as React from 'react';
2
- import { RbmComponentProps } from '../../RbmComponentProps';
3
- import { Override } from '../../../TypeHelpers';
4
- import { ChangeEventHandler, DragEvent, DragEventHandler, InputHTMLAttributes, useCallback, useRef } from 'react';
5
- import { Listener, useListenerWithExtractedProps } from '../../Hooks/useListener';
6
-
7
- import styles from './imageInput.scss';
8
- import { withMemo } from '../../../helper/withMemo';
9
- import classNames from 'classnames';
10
- import { Block } from '../../Layout/Block';
11
- import { Text } from '../../Text/Text';
12
- import { Flex } from '../../Layout/Flex';
13
- import { Grow } from '../../Layout/Grow';
14
- import { Icon } from '../../Icon/Icon';
15
- import { faPlus, faTimesCircle } from '@fortawesome/free-solid-svg-icons';
16
- import { Image } from '../../Image/Image';
17
- import { Clickable } from '../../Clickable/Clickable';
18
- import { Inline } from '../../Layout/Inline';
19
-
20
- export type FileType = { name: string; url: string; mimeType: string; uploaded?: boolean; blob?: Blob };
21
-
22
- export type MultipleImageInputProps<OnChangeFilesData> = RbmComponentProps<
23
- Override<
24
- Omit<InputHTMLAttributes<HTMLInputElement>, 'defaultValue' | 'onChange'>,
25
- {
26
- value: FileType[];
27
- label?: string;
28
- mimeTypes?: string[];
29
- maxFiles?: number;
30
- maxSizePerFile?: number;
31
- onError?: (error: string) => void;
32
- } & Listener<'onChangeFiles', OnChangeFilesData, FileType[]>
33
- >
34
- >;
35
-
36
- export const MultipleFileInput = withMemo(function MultipleImageInput<OnChangeData>({
37
- className,
38
- style,
39
- value,
40
- label,
41
- mimeTypes = ['image/*'],
42
- maxFiles = 1,
43
- maxSizePerFile = 1024 * 1024 * 10,
44
- onError,
45
- ...otherProps
46
- }: MultipleImageInputProps<OnChangeData>) {
47
- // Variables
48
-
49
- // Refs
50
- const inputRef = useRef<HTMLInputElement>(null);
51
-
52
- // States
53
-
54
- // Selectors
55
-
56
- // Callbacks
57
- const checkMimeType = useCallback(
58
- (fileType: string) => {
59
- return mimeTypes.some((type) => {
60
- if (type === '*/*' || type === '*') {
61
- return true;
62
- }
63
- if (type.endsWith('/*')) {
64
- return fileType.startsWith(type.substring(0, type.length - 2));
65
- }
66
- return fileType === type;
67
- });
68
- },
69
- [mimeTypes]
70
- );
71
-
72
- const [onChangeFiles, ...props] = useListenerWithExtractedProps('onChangeFiles', otherProps);
73
- const getBase64 = useCallback((inputFiles: Blob[]) => {
74
- const promises = inputFiles.map(
75
- (file) =>
76
- new Promise<string>((resolve, reject) => {
77
- const reader = new FileReader();
78
- reader.onload = () => {
79
- resolve(reader.result as string);
80
- };
81
- reader.onerror = reject;
82
- reader.readAsDataURL(file);
83
- })
84
- );
85
- return Promise.all(promises);
86
- }, []);
87
-
88
- const onNewFiles = useCallback(
89
- async (newFiles: File[]) => {
90
- if (newFiles.length + value.length > maxFiles) {
91
- onError?.(`Es sind nur ${maxFiles} Dateien erlaubt.`);
92
- return;
93
- }
94
-
95
- if (newFiles.some((file) => file.size > maxSizePerFile)) {
96
- onError?.(`Eine Datei ist zu groß. Jede Datei darf nur ${maxSizePerFile / 1024 / 1024}MB groß sein.`);
97
- return;
98
- }
99
-
100
- if (newFiles.some((file) => !checkMimeType(file.type))) {
101
- onError?.('Eine Datei ist im falschen Format');
102
- return;
103
- }
104
-
105
- const newUrls = await getBase64(newFiles);
106
- const newValue = newFiles.map((file, index) => ({
107
- name: file.name,
108
- url: newUrls[index],
109
- mimeType: file.type,
110
- blob: file,
111
- }));
112
-
113
- onChangeFiles([...value, ...newValue]);
114
- },
115
- [checkMimeType, getBase64, maxFiles, maxSizePerFile, onChangeFiles, onError, value]
116
- );
117
-
118
- const onInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(
119
- async (e) => {
120
- if (!e.target.files || e.target.files.length === 0) {
121
- return;
122
- }
123
-
124
- const newFiles = Array.from(e.target.files);
125
- await onNewFiles(newFiles);
126
- },
127
- [onNewFiles]
128
- );
129
-
130
- const removeFile = useCallback(
131
- (_: any, index: number) => {
132
- if (index >= 0 && index < value.length) {
133
- const newData = [...value];
134
- newData.splice(index, 1);
135
- onChangeFiles(newData);
136
- }
137
- },
138
- [onChangeFiles, value]
139
- );
140
-
141
- const onDrop = useCallback<DragEventHandler>(
142
- async (event) => {
143
- event.preventDefault();
144
-
145
- const files: File[] = [];
146
- if (event.dataTransfer.items) {
147
- for (let i = 0; i < event.dataTransfer.items.length; i++) {
148
- if (event.dataTransfer.items[i].kind === 'file') {
149
- const file = event.dataTransfer.items[i].getAsFile();
150
- if (file) {
151
- files.push(file);
152
- }
153
- }
154
- }
155
- } else {
156
- for (let i = 0; i < event.dataTransfer.files.length; i++) {
157
- files.push(event.dataTransfer.files[i]);
158
- }
159
- }
160
-
161
- await onNewFiles(files);
162
- },
163
- [onNewFiles]
164
- );
165
-
166
- const onDragOver = useCallback((e: DragEvent) => e.preventDefault(), []);
167
-
168
- // Effects
169
-
170
- // Other
171
-
172
- // Render Functions
173
- const renderFile = (file: FileType) => {
174
- if (file.mimeType.startsWith('image/')) {
175
- return (
176
- <Image
177
- key={file.url}
178
- src={file.url}
179
- alt={file.name}
180
- className={classNames(styles.previewImage, file.url)}
181
- />
182
- );
183
- }
184
- // TODO style
185
- return (
186
- <Block>
187
- <Text>{file.name}</Text>
188
- </Block>
189
- );
190
- };
191
-
192
- return (
193
- <label
194
- className={classNames(styles.fileInput, className)}
195
- style={style}
196
- onDrop={onDrop}
197
- onDragOver={onDragOver}
198
- >
199
- <Flex horizontal={true}>
200
- {!!label && (
201
- <Grow>
202
- <Text>{label}</Text>
203
- </Grow>
204
- )}
205
- {maxFiles > 1 && (
206
- <Inline>
207
- <Text>
208
- {value.length}/{maxFiles}
209
- </Text>
210
- </Inline>
211
- )}
212
- </Flex>
213
- <Flex horizontal={true} className={styles.previewContainer}>
214
- {value?.map((file, index) => (
215
- <Grow className={styles.preview} center={true} key={file.url}>
216
- {renderFile(file)}
217
- <Clickable className={styles.previewRemove} onClick={removeFile} onClickData={index}>
218
- <Icon icon={faTimesCircle} />
219
- </Clickable>
220
- </Grow>
221
- ))}
222
- {value.length < maxFiles && (
223
- <Grow className={styles.addFile} center={true} __allowChildren="html">
224
- <Icon icon={faPlus} />
225
- <input
226
- {...props}
227
- ref={inputRef}
228
- className={styles.value}
229
- onChange={onInputChange}
230
- type="file"
231
- multiple={maxFiles > 1}
232
- accept={mimeTypes.join(', ')}
233
- />
234
- </Grow>
235
- )}
236
- </Flex>
237
- </label>
238
- );
239
- },
240
- styles);