@jasperoosthoek/react-toolbox 0.9.4 → 0.10.0

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 (38) hide show
  1. package/README.md +455 -155
  2. package/change-log.md +18 -1
  3. package/dist/components/forms/FormField.d.ts +13 -0
  4. package/dist/components/forms/FormModal.d.ts +3 -2
  5. package/dist/components/forms/FormProvider.d.ts +3 -0
  6. package/dist/components/forms/fields/FormInput.d.ts +1 -1
  7. package/dist/components/indicators/FixedLoadingIndicator.d.ts +16 -0
  8. package/dist/components/tables/DataTable.d.ts +2 -2
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.es.js +2235 -0
  11. package/dist/index.es.js.map +1 -0
  12. package/dist/index.umd.js +28 -0
  13. package/dist/index.umd.js.map +1 -0
  14. package/package.json +26 -12
  15. package/src/components/forms/FormField.tsx +6 -2
  16. package/src/components/forms/FormModal.tsx +38 -20
  17. package/src/components/forms/FormProvider.tsx +7 -1
  18. package/src/components/forms/fields/FormBadgesSelection.tsx +20 -9
  19. package/src/components/forms/fields/FormCheckbox.tsx +8 -10
  20. package/src/components/forms/fields/FormDropdown.tsx +4 -5
  21. package/src/components/forms/fields/FormInput.tsx +6 -6
  22. package/src/components/forms/fields/FormSelect.tsx +4 -3
  23. package/src/components/indicators/FixedLoadingIndicator.tsx +49 -0
  24. package/src/components/tables/DataTable.tsx +27 -30
  25. package/src/index.ts +1 -0
  26. package/dist/index.js +0 -3
  27. package/dist/index.js.LICENSE.txt +0 -15
  28. package/src/__tests__/buttons.test.tsx +0 -545
  29. package/src/__tests__/errors.test.tsx +0 -339
  30. package/src/__tests__/forms.test.tsx +0 -3021
  31. package/src/__tests__/hooks.test.tsx +0 -413
  32. package/src/__tests__/indicators.test.tsx +0 -284
  33. package/src/__tests__/localization.test.tsx +0 -462
  34. package/src/__tests__/login.test.tsx +0 -417
  35. package/src/__tests__/setupTests.ts +0 -328
  36. package/src/__tests__/tables.test.tsx +0 -609
  37. package/src/__tests__/timeAndDate.test.tsx +0 -308
  38. package/src/__tests__/utils.test.tsx +0 -422
@@ -1,328 +0,0 @@
1
- // Test setup with React Testing Library and jsdom
2
-
3
- import '@testing-library/react';
4
- import '@testing-library/jest-dom';
5
-
6
- // Mock console to reduce noise during tests
7
- global.console = {
8
- ...console,
9
- error: jest.fn(),
10
- warn: jest.fn(),
11
- };
12
-
13
- // Mock react-localization
14
- jest.mock('react-localization', () => {
15
- return jest.fn().mockImplementation((translations) => {
16
- const instance = {
17
- translations,
18
- currentLanguage: 'en',
19
- setLanguage: jest.fn(function(lang) {
20
- this.currentLanguage = lang;
21
- }),
22
- getString: jest.fn(function(key, lang) {
23
- const targetLang = lang || this.currentLanguage;
24
- if (this.translations && this.translations[targetLang] && this.translations[targetLang][key]) {
25
- return this.translations[targetLang][key];
26
- }
27
- return key;
28
- }),
29
- getLanguage: jest.fn(function() {
30
- return this.currentLanguage;
31
- }),
32
- getAvailableLanguages: jest.fn(() => ['en']),
33
- };
34
- return instance;
35
- });
36
- });
37
-
38
- // Mock react-dnd
39
- jest.mock('react-dnd', () => ({
40
- useDrag: jest.fn(() => [{}, jest.fn(), jest.fn()]),
41
- useDrop: jest.fn(() => [{}, jest.fn()]),
42
- DndProvider: ({ children }) => children,
43
- useDragLayer: jest.fn(() => ({})),
44
- }));
45
-
46
- // Mock react-dnd-html5-backend
47
- jest.mock('react-dnd-html5-backend', () => ({
48
- HTML5Backend: 'HTML5Backend',
49
- }));
50
-
51
- // Mock react-bootstrap with proper React elements
52
- jest.mock('react-bootstrap', () => {
53
- const mockReact = require('react');
54
- return {
55
- Button: mockReact.forwardRef((props, ref) => {
56
- const { variant, size, className = '', ...restProps } = props;
57
- let classes = 'btn';
58
- if (variant) classes += ` btn-${variant}`;
59
- if (size) classes += ` btn-${size}`;
60
- if (className) classes += ` ${className}`;
61
-
62
- return mockReact.createElement('button', {
63
- ...restProps,
64
- ref,
65
- className: classes.trim()
66
- }, props.children);
67
- }),
68
- Container: (props) => mockReact.createElement('div', { ...props, className: `container ${props.className || ''}` }, props.children),
69
- Row: (props) => mockReact.createElement('div', { ...props, className: `row ${props.className || ''}` }, props.children),
70
- Col: (props) => mockReact.createElement('div', { ...props, className: `col ${props.className || ''}` }, props.children),
71
- Spinner: (props) => mockReact.createElement('div', { ...props, 'data-testid': 'spinner' }, props.children),
72
- Badge: (props) => {
73
- const { bg, className = '', ...restProps } = props;
74
- let classes = 'badge';
75
- if (bg) classes += ` badge-${bg}`;
76
- if (className) classes += ` ${className}`;
77
- return mockReact.createElement('span', {
78
- ...restProps,
79
- className: classes.trim()
80
- }, props.children);
81
- },
82
- Modal: Object.assign(
83
- (props) => {
84
- if (!props.show) return null;
85
-
86
- const modalElement = mockReact.createElement('div', {
87
- ...props,
88
- className: 'modal',
89
- role: props.role || 'dialog'
90
- },
91
- // Clone children and pass onHide to Modal.Header
92
- mockReact.Children.map(props.children, (child) => {
93
- if (child && child.type && child.type.displayName === 'Modal.Header') {
94
- return mockReact.cloneElement(child, { onHide: props.onHide });
95
- }
96
- return child;
97
- })
98
- );
99
-
100
- return modalElement;
101
- },
102
- {
103
- Header: Object.assign(
104
- (props) => {
105
- const headerContent = mockReact.createElement('div', {
106
- key: 'header-content',
107
- className: 'modal-header'
108
- }, [
109
- props.children,
110
- // Add close button if closeButton prop is true
111
- props.closeButton && mockReact.createElement('button', {
112
- key: 'close-button',
113
- type: 'button',
114
- className: 'btn-close',
115
- 'aria-label': 'Close',
116
- onClick: props.onHide, // Wire up the close button to onHide
117
- children: 'Close' // Accessible text for testing
118
- })
119
- ].filter(Boolean));
120
-
121
- return headerContent;
122
- },
123
- { displayName: 'Modal.Header' }
124
- ),
125
- Title: (props) => mockReact.createElement('h4', { ...props, className: 'modal-title' }, props.children),
126
- Body: (props) => mockReact.createElement('div', { ...props, className: 'modal-body' }, props.children),
127
- Footer: (props) => mockReact.createElement('div', { ...props, className: 'modal-footer' }, props.children)
128
- }
129
- ),
130
- Form: Object.assign(
131
- (props) => mockReact.createElement('form', props, props.children),
132
- {
133
- Group: (props) => {
134
- const { controlId, ...restProps } = props;
135
- return mockReact.createElement('div', {
136
- ...restProps,
137
- className: 'form-group'
138
- }, props.children);
139
- },
140
- Label: (props) => mockReact.createElement('label', {
141
- ...props,
142
- htmlFor: props.htmlFor || undefined
143
- }, props.children),
144
- Control: mockReact.forwardRef((props, ref) => {
145
- const element = props.as || (props.type === 'textarea' ? 'textarea' : 'input');
146
- const { isInvalid, className = '', ...restProps } = props;
147
- let classes = className;
148
- if (isInvalid) {
149
- classes += (classes ? ' ' : '') + 'is-invalid';
150
- }
151
- const controlProps = {
152
- ...restProps,
153
- ref,
154
- id: props.id || undefined,
155
- className: classes.trim() || undefined
156
- };
157
- // Add default type="text" for input elements if not specified
158
- if (element === 'input' && !controlProps.type) {
159
- controlProps.type = 'text';
160
- }
161
- return mockReact.createElement(element, controlProps);
162
- }),
163
- Select: mockReact.forwardRef((props, ref) => {
164
- const { isInvalid, className = '', ...restProps } = props;
165
- let classes = className;
166
- if (isInvalid) {
167
- classes += (classes ? ' ' : '') + 'is-invalid';
168
- }
169
- return mockReact.createElement('select', {
170
- ...restProps,
171
- ref,
172
- className: classes.trim() || undefined
173
- }, props.children);
174
- }),
175
- Check: mockReact.forwardRef((props, ref) => {
176
- const { label, type, checked, isInvalid, className = '', id, ...restProps } = props;
177
- let classes = 'form-check-input';
178
- if (isInvalid) {
179
- classes += ' is-invalid';
180
- }
181
- if (className) {
182
- classes += ` ${className}`;
183
- }
184
-
185
- const checkboxId = id || 'checkbox';
186
-
187
- return mockReact.createElement('div', { className: 'form-check' }, [
188
- mockReact.createElement('input', {
189
- key: 'input',
190
- ...restProps,
191
- ref,
192
- type: type === 'switch' ? 'checkbox' : (type || 'checkbox'),
193
- className: classes.trim(),
194
- checked: !!checked,
195
- id: checkboxId
196
- }),
197
- label && mockReact.createElement('label', {
198
- key: 'label',
199
- className: 'form-check-label',
200
- htmlFor: checkboxId
201
- }, label)
202
- ]);
203
- }),
204
- Text: (props) => mockReact.createElement('div', { ...props, className: 'form-text' }, props.children),
205
- }
206
- ),
207
- Table: (props) => mockReact.createElement('table', props, props.children),
208
- InputGroup: (props) => mockReact.createElement('div', { ...props, className: 'input-group' }, props.children),
209
- Alert: (props) => mockReact.createElement('div', { ...props, className: 'alert' }, props.children),
210
- Card: (props) => mockReact.createElement('div', { ...props, className: 'card' }, props.children),
211
- ButtonGroup: (props) => mockReact.createElement('div', { ...props, className: 'btn-group' }, props.children),
212
- Dropdown: Object.assign(
213
- (props) => mockReact.createElement('div', { ...props, className: 'dropdown' }, props.children),
214
- {
215
- Toggle: mockReact.forwardRef((props, ref) => {
216
- const Component = props.as || 'button';
217
- return mockReact.createElement(Component, { ...props, ref }, props.children);
218
- }),
219
- Menu: (props) => mockReact.createElement('div', { ...props, className: 'dropdown-menu' }, props.children),
220
- Item: (props) => mockReact.createElement('a', { ...props, className: 'dropdown-item' }, props.children),
221
- }
222
- ),
223
- Nav: (props) => mockReact.createElement('nav', props, props.children),
224
- Navbar: (props) => mockReact.createElement('nav', { ...props, className: 'navbar' }, props.children),
225
- };
226
- });
227
-
228
- // Mock react-icons
229
- jest.mock('react-icons/ai', () => {
230
- const mockReact = require('react');
231
- return {
232
- AiOutlineCheck: () => mockReact.createElement('span', { 'data-testid': 'check-icon' }, '✓'),
233
- AiOutlineClose: () => mockReact.createElement('span', { 'data-testid': 'close-icon' }, '✗'),
234
- AiFillCaretDown: () => mockReact.createElement('span', { 'data-testid': 'caret-down' }, '▼'),
235
- AiFillCaretUp: () => mockReact.createElement('span', { 'data-testid': 'caret-up' }, '▲'),
236
- AiFillEdit: () => mockReact.createElement('span', { 'data-testid': 'edit-icon' }, '✎'),
237
- AiOutlinePlus: () => mockReact.createElement('span', { 'data-testid': 'plus-icon' }, '+'),
238
- AiOutlineUpload: () => mockReact.createElement('span', { 'data-testid': 'upload-icon' }, '↑'),
239
- AiOutlineDownload: () => mockReact.createElement('span', { 'data-testid': 'download-icon' }, '↓'),
240
- AiOutlineFileAdd: () => mockReact.createElement('span', { 'data-testid': 'file-add-icon' }, '📄+'),
241
- AiOutlineFolderAdd: () => mockReact.createElement('span', { 'data-testid': 'folder-add-icon' }, '📁+'),
242
- AiOutlineArrowRight: () => mockReact.createElement('span', { 'data-testid': 'arrow-right-icon' }, '→'),
243
- AiOutlineUnlock: () => mockReact.createElement('span', { 'data-testid': 'unlock-icon' }, '🔓'),
244
- AiOutlineSearch: () => mockReact.createElement('span', { 'data-testid': 'search-icon' }, '🔍'),
245
- AiOutlineSave: () => mockReact.createElement('span', { 'data-testid': 'save-icon' }, '💾'),
246
- AiOutlineHome: () => mockReact.createElement('span', { 'data-testid': 'home-icon' }, '🏠'),
247
- };
248
- });
249
-
250
- // Mock other react-icons
251
- jest.mock('react-icons/fi', () => {
252
- const mockReact = require('react');
253
- return {
254
- FiCopy: () => mockReact.createElement('span', { 'data-testid': 'copy-icon' }, '📋'),
255
- };
256
- });
257
-
258
- jest.mock('react-icons/fa', () => {
259
- const mockReact = require('react');
260
- return {
261
- FaTimes: () => mockReact.createElement('span', { 'data-testid': 'times-icon' }, '✕'),
262
- FaSort: () => mockReact.createElement('span', { 'data-testid': 'sort-icon' }, '↕'),
263
- FaSortUp: () => mockReact.createElement('span', { 'data-testid': 'sort-up-icon' }, '↑'),
264
- FaSortDown: () => mockReact.createElement('span', { 'data-testid': 'sort-down-icon' }, '↓'),
265
- FaRegFlag: () => mockReact.createElement('span', { 'data-testid': 'flag-icon' }, '🚩'),
266
- FaSyncAlt: () => mockReact.createElement('span', { 'data-testid': 'sync-icon' }, '🔄'),
267
- };
268
- });
269
-
270
- jest.mock('react-icons/cg', () => {
271
- const mockReact = require('react');
272
- return {
273
- CgTrash: () => mockReact.createElement('span', { 'data-testid': 'trash-icon' }, '🗑'),
274
- CgNotes: () => mockReact.createElement('span', { 'data-testid': 'notes-icon' }, '📝'),
275
- CgSpinner: () => mockReact.createElement('span', { 'data-testid': 'spinner-icon' }, '⟳'),
276
- };
277
- });
278
-
279
- jest.mock('react-icons/bs', () => {
280
- const mockReact = require('react');
281
- return {
282
- BsArrowsMove: () => mockReact.createElement('span', { 'data-testid': 'arrows-move-icon' }, '⇄'),
283
- BsCardList: () => mockReact.createElement('span', { 'data-testid': 'card-list-icon' }, '📋'),
284
- BsPencil: () => mockReact.createElement('span', { 'data-testid': 'pencil-icon' }, '✏'),
285
- };
286
- });
287
-
288
- jest.mock('react-icons/bi', () => {
289
- const mockReact = require('react');
290
- return {
291
- BiRightArrow: () => mockReact.createElement('span', { 'data-testid': 'right-arrow-icon' }, '▶'),
292
- BiSquare: () => mockReact.createElement('span', { 'data-testid': 'square-icon' }, '⬜'),
293
- BiHide: () => mockReact.createElement('span', { 'data-testid': 'hide-icon' }, '👁‍🗨'),
294
- BiShow: () => mockReact.createElement('span', { 'data-testid': 'show-icon' }, '👁'),
295
- };
296
- });
297
-
298
- jest.mock('react-icons/hi', () => {
299
- const mockReact = require('react');
300
- return {
301
- HiOutlineCog: () => mockReact.createElement('span', { 'data-testid': 'cog-icon' }, '⚙'),
302
- HiOutlineLink: () => mockReact.createElement('span', { 'data-testid': 'link-icon' }, '🔗'),
303
- };
304
- });
305
-
306
- jest.mock('react-icons/vsc', () => {
307
- const mockReact = require('react');
308
- return {
309
- VscMenu: () => mockReact.createElement('span', { 'data-testid': 'menu-icon' }, '☰'),
310
- };
311
- });
312
-
313
- jest.mock('react-icons/ri', () => {
314
- const mockReact = require('react');
315
- return {
316
- RiQuestionnaireLine: () => mockReact.createElement('span', { 'data-testid': 'questionnaire-icon' }, '❓'),
317
- RiDropdownList: () => mockReact.createElement('span', { 'data-testid': 'dropdown-list-icon' }, '📃'),
318
- RiResetLeftLine: () => mockReact.createElement('span', { 'data-testid': 'reset-left-icon' }, '↺'),
319
- };
320
- });
321
-
322
- jest.mock('react-icons/lu', () => {
323
- const mockReact = require('react');
324
- return {
325
- LuClipboardPaste: () => mockReact.createElement('span', { 'data-testid': 'clipboard-paste-icon' }, '📋'),
326
- };
327
- });
328
-