ywana-core8 0.1.103 → 0.2.2
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.
- package/dist/index.css +4941 -324
- package/dist/index.js +42339 -0
- package/dist/index.js.map +1 -0
- package/dist/index.modern.js +37459 -31678
- package/dist/index.modern.js.map +1 -1
- package/dist/index.umd.js +39635 -34010
- package/dist/index.umd.js.map +1 -1
- package/package.json +26 -29
- package/src/Test.stories.jsx +28 -0
- package/src/desktop/Desktop.stories.jsx +110 -0
- package/src/desktop/WindowContext.js +135 -0
- package/src/desktop/WindowManager.js +355 -0
- package/src/desktop/desktop.css +55 -4
- package/src/desktop/desktop.js +312 -6
- package/src/desktop/index.js +7 -0
- package/src/desktop/window.css +229 -36
- package/src/desktop/window.js +255 -20
- package/src/desktop.backup/desktop.css +6 -0
- package/src/desktop.backup/desktop.js +13 -0
- package/src/desktop.backup/window.css +58 -0
- package/src/desktop.backup/window.js +27 -0
- package/src/html/Accordion.stories.jsx +178 -0
- package/src/html/Button.stories.jsx +175 -0
- package/src/html/Checkbox.stories.jsx +131 -0
- package/src/html/Chip.stories.jsx +189 -0
- package/src/html/Color.stories.jsx +234 -0
- package/src/html/Form.stories.jsx +271 -0
- package/src/html/Icon.stories.jsx +233 -0
- package/src/html/Progress.stories.jsx +247 -0
- package/src/html/Radio.stories.jsx +289 -0
- package/src/html/StyleTest.stories.jsx +81 -0
- package/src/html/Switch.stories.jsx +329 -0
- package/src/html/Tab.stories.jsx +239 -0
- package/src/html/Table.stories.jsx +188 -0
- package/src/html/Table2.stories.jsx +238 -0
- package/src/html/TextField2.stories.jsx +337 -0
- package/src/html/Tree.stories.jsx +285 -0
- package/src/html/accordion.example.js +0 -74
- package/src/html/accordion.js +1 -6
- package/src/html/button.js +2 -13
- package/src/html/checkbox.js +1 -9
- package/src/html/chip.js +2 -19
- package/src/html/color.js +1 -14
- package/src/html/form.js +4 -15
- package/src/html/header2.js +1 -12
- package/src/html/icon.js +1 -7
- package/src/html/index.js +1 -1
- package/src/html/list.js +1 -19
- package/src/html/menu.js +9 -5
- package/src/html/progress.js +5 -53
- package/src/html/property.js +9 -25
- package/src/html/radio.js +2 -16
- package/src/html/section.js +1 -6
- package/src/html/selector.js +2 -19
- package/src/html/switch.css +134 -100
- package/src/html/switch.example.js +46 -36
- package/src/html/switch.js +43 -192
- package/src/html/tab.js +3 -24
- package/src/html/text.js +1 -12
- package/src/html/textfield2.js +5 -42
- package/src/html/thumbnail.js +1 -12
- package/src/html/tokenfield.js +2 -21
- package/src/html/tree.js +3 -35
- package/src/index.js +1 -0
- package/__previewjs__/Wrapper.tsx +0 -14
- package/build-doc.sh +0 -10
- package/db/db.json +0 -89
- package/db/routes.json +0 -0
- package/dist/index.cjs +0 -36722
- package/dist/index.cjs.map +0 -1
- package/dist/index.css.map +0 -1
- package/doc/README.md +0 -196
- package/doc/evalulations/ACCORDION_EVALUATION.md +0 -583
- package/doc/evalulations/CHECKBOX_EVALUATION.md +0 -273
- package/doc/evalulations/CHIP_EVALUATION.md +0 -542
- package/doc/evalulations/COLOR_EVALUATION.md +0 -524
- package/doc/evalulations/COMPONENTS_EVALUATION.md +0 -477
- package/doc/evalulations/FORM_EVALUATION.md +0 -459
- package/doc/evalulations/HEADER_EVALUATION.md +0 -436
- package/doc/evalulations/ICON_EVALUATION.md +0 -254
- package/doc/evalulations/LIST_EVALUATION.md +0 -574
- package/doc/evalulations/PROGRESS_EVALUATION.md +0 -450
- package/doc/evalulations/RADIO_EVALUATION.md +0 -439
- package/doc/evalulations/RADIO_VISUAL_FIX.md +0 -183
- package/doc/evalulations/SECTION_IMPROVEMENTS.md +0 -153
- package/doc/evalulations/SWITCH_EVALUATION.md +0 -335
- package/doc/evalulations/SWITCH_VISUAL_FIX.md +0 -232
- package/doc/evalulations/TAB_EVALUATION.md +0 -626
- package/doc/evalulations/TEXTFIELD_EVALUATION.md +0 -747
- package/doc/evalulations/TOOLTIP_FIX.md +0 -157
- package/doc/evalulations/TREE_EVALUATION.md +0 -708
- package/doc/index.html +0 -0
- package/doc/package-lock.json +0 -17298
- package/doc/package.json +0 -34
- package/doc/public/index.html +0 -24
- package/doc/scripts/generate-examples.js +0 -129
- package/doc/src/App.css +0 -171
- package/doc/src/App.js +0 -114
- package/doc/src/components/ExamplePage.js +0 -129
- package/doc/src/components/WelcomePage.js +0 -84
- package/doc/src/index.css +0 -246
- package/doc/src/index.js +0 -17
- package/doc/src/theme.css +0 -256
- package/jest.config.js +0 -24
- package/preview.config.js +0 -38
- package/publish.sh +0 -6
- package/src/desktop/dektop.test.js +0 -11
- package/src/domain/CollectionAPI.test.js +0 -19
- package/src/domain/ContentEditor.test.js +0 -52
- package/src/domain2/CollectionAPI.test.js +0 -19
- package/src/domain2/CollectionContext.test.js +0 -71
- package/src/domain2/CollectionPage.test.js +0 -112
- package/src/domain2/DynamicForm.test.js +0 -47
- package/src/html/accordion.test.js +0 -37
- package/src/html/accordion.unit.test.js +0 -334
- package/src/html/button.example.new.js +0 -416
- package/src/html/button.test.js +0 -422
- package/src/html/checkbox.test.js +0 -285
- package/src/html/chip.test.js +0 -425
- package/src/html/color.example.js.backup +0 -527
- package/src/html/color.test.js +0 -377
- package/src/html/components.example.js.backup +0 -492
- package/src/html/components_enhanced.test.js +0 -581
- package/src/html/form.example.js.backup +0 -385
- package/src/html/form.test.js +0 -369
- package/src/html/header2.example.js.backup +0 -411
- package/src/html/header2.test.js +0 -377
- package/src/html/icon.example.js.backup +0 -268
- package/src/html/icon.test.js +0 -231
- package/src/html/label.test.js +0 -0
- package/src/html/list.example.js.backup +0 -404
- package/src/html/list.test.js +0 -383
- package/src/html/progress.example.js.backup +0 -424
- package/src/html/progress.test.js +0 -313
- package/src/html/property.example.js.backup +0 -553
- package/src/html/property.test.js +0 -371
- package/src/html/radio.example.js.backup +0 -389
- package/src/html/radio.test.js +0 -318
- package/src/html/section.example.js.backup +0 -99
- package/src/html/section.test.js +0 -131
- package/src/html/selector.test.js +0 -20
- package/src/html/switch.example.js.backup +0 -461
- package/src/html/switch.test.js +0 -355
- package/src/html/tab.example.js.backup +0 -446
- package/src/html/tab.test.js +0 -25
- package/src/html/tab_enhanced.test.js +0 -504
- package/src/html/table.test.js +0 -70
- package/src/html/table2.test.js +0 -582
- package/src/html/text.test.js +0 -15
- package/src/html/textfield.test.js +0 -51
- package/src/html/textfield2.example.js.backup +0 -1370
- package/src/html/textfield2.test.js +0 -950
- package/src/html/tokenfield.example.js.backup +0 -503
- package/src/html/tokenfield.test.js +0 -423
- package/src/html/tree.example.js.backup +0 -475
- package/src/html/tree.test.js +0 -43
- package/src/html/tree_enhanced.test.js +0 -495
- package/src/http/token.test.js +0 -50
- package/src/incubator/pdfViewer.js +0 -33
- package/src/incubator/wizard.test.js +0 -127
- package/src/site/site.test.js +0 -230
- package/src/site/view.test.js +0 -41
- package/src/widgets/calendar/Calendar.test.js +0 -28
- package/src/widgets/explorer/Explorer.test.js +0 -121
- package/src/widgets/ide/editor.test.js +0 -33
- package/src/widgets/kanban/Kanban.test.js +0 -78
- package/src/widgets/login/LoginBox.test.js +0 -12
- package/src/widgets/login/ResetPasswordBox.test.js +0 -34
- package/src/widgets/login/validations.test.js +0 -51
- package/src/widgets/planner/Planner.test.js +0 -60
- package/src/widgets/upload/Upload.test.js +0 -32
- package/table2.test.js +0 -454
@@ -1,495 +0,0 @@
|
|
1
|
-
import React from 'react'
|
2
|
-
import { Tree, TreeNode, TreeItem } from './tree'
|
3
|
-
|
4
|
-
// Pruebas unitarias para los componentes Tree mejorados
|
5
|
-
describe('Enhanced Tree Components', () => {
|
6
|
-
// Mock de los componentes dependientes
|
7
|
-
const mockIcon = jest.fn()
|
8
|
-
const mockText = jest.fn()
|
9
|
-
const mockTextField = jest.fn()
|
10
|
-
|
11
|
-
beforeEach(() => {
|
12
|
-
jest.clearAllMocks()
|
13
|
-
|
14
|
-
// Mock de componentes
|
15
|
-
jest.doMock('./icon', () => ({ Icon: mockIcon }))
|
16
|
-
jest.doMock('./text', () => ({ Text: mockText }))
|
17
|
-
jest.doMock('./textfield', () => ({ TextField: mockTextField }))
|
18
|
-
|
19
|
-
// Mock de console.warn
|
20
|
-
jest.spyOn(console, 'warn').mockImplementation(() => {})
|
21
|
-
})
|
22
|
-
|
23
|
-
afterEach(() => {
|
24
|
-
console.warn.mockRestore()
|
25
|
-
})
|
26
|
-
|
27
|
-
// Tree Component Tests
|
28
|
-
describe('Tree Component', () => {
|
29
|
-
test('component exports correctly', () => {
|
30
|
-
expect(Tree).toBeDefined()
|
31
|
-
expect(typeof Tree).toBe('function')
|
32
|
-
})
|
33
|
-
|
34
|
-
test('component has correct PropTypes', () => {
|
35
|
-
expect(Tree.propTypes).toBeDefined()
|
36
|
-
expect(Tree.propTypes.nodes).toBeDefined()
|
37
|
-
expect(Tree.propTypes.children).toBeDefined()
|
38
|
-
expect(Tree.propTypes.searchable).toBeDefined()
|
39
|
-
expect(Tree.propTypes.filterable).toBeDefined()
|
40
|
-
expect(Tree.propTypes.sortable).toBeDefined()
|
41
|
-
expect(Tree.propTypes.multiSelect).toBeDefined()
|
42
|
-
expect(Tree.propTypes.disabled).toBeDefined()
|
43
|
-
expect(Tree.propTypes.loading).toBeDefined()
|
44
|
-
expect(Tree.propTypes.empty).toBeDefined()
|
45
|
-
})
|
46
|
-
|
47
|
-
test('component has correct defaultProps', () => {
|
48
|
-
expect(Tree.defaultProps).toBeDefined()
|
49
|
-
expect(Tree.defaultProps.nodes).toEqual([])
|
50
|
-
expect(Tree.defaultProps.searchable).toBe(false)
|
51
|
-
expect(Tree.defaultProps.filterable).toBe(false)
|
52
|
-
expect(Tree.defaultProps.sortable).toBe(false)
|
53
|
-
expect(Tree.defaultProps.multiSelect).toBe(false)
|
54
|
-
expect(Tree.defaultProps.disabled).toBe(false)
|
55
|
-
expect(Tree.defaultProps.loading).toBe(false)
|
56
|
-
expect(Tree.defaultProps.empty).toBe(false)
|
57
|
-
})
|
58
|
-
|
59
|
-
test('warns when no children or nodes provided', () => {
|
60
|
-
const validateContent = (children, nodes) => {
|
61
|
-
if (children && !React.Children.count(children) && nodes.length === 0) {
|
62
|
-
console.warn('Tree component: should contain TreeNode components or nodes prop')
|
63
|
-
}
|
64
|
-
}
|
65
|
-
|
66
|
-
validateContent([], [])
|
67
|
-
expect(console.warn).toHaveBeenCalledWith('Tree component: should contain TreeNode components or nodes prop')
|
68
|
-
|
69
|
-
console.warn.mockClear()
|
70
|
-
validateContent(null, [{ id: 1 }])
|
71
|
-
expect(console.warn).not.toHaveBeenCalled()
|
72
|
-
})
|
73
|
-
|
74
|
-
test('handles search correctly', () => {
|
75
|
-
const mockSetSearchTerm = jest.fn()
|
76
|
-
|
77
|
-
const handleSearch = (searchId, value, setSearchTerm) => {
|
78
|
-
setSearchTerm(value)
|
79
|
-
}
|
80
|
-
|
81
|
-
handleSearch('search', 'test query', mockSetSearchTerm)
|
82
|
-
expect(mockSetSearchTerm).toHaveBeenCalledWith('test query')
|
83
|
-
})
|
84
|
-
|
85
|
-
test('handles multi-selection correctly', () => {
|
86
|
-
const mockOnMultiSelect = jest.fn()
|
87
|
-
|
88
|
-
const handleMultiSelect = (id, selected, multiSelect, selectedItems, setSelectedItems, onMultiSelect) => {
|
89
|
-
if (!multiSelect) return
|
90
|
-
|
91
|
-
const newSelected = selected
|
92
|
-
? [...selectedItems, id]
|
93
|
-
: selectedItems.filter(item => item !== id)
|
94
|
-
|
95
|
-
setSelectedItems(newSelected)
|
96
|
-
if (onMultiSelect) {
|
97
|
-
onMultiSelect(newSelected)
|
98
|
-
}
|
99
|
-
}
|
100
|
-
|
101
|
-
// Add item
|
102
|
-
handleMultiSelect('item1', true, true, [], jest.fn(), mockOnMultiSelect)
|
103
|
-
expect(mockOnMultiSelect).toHaveBeenCalledWith(['item1'])
|
104
|
-
|
105
|
-
mockOnMultiSelect.mockClear()
|
106
|
-
|
107
|
-
// Remove item
|
108
|
-
handleMultiSelect('item1', false, true, ['item1', 'item2'], jest.fn(), mockOnMultiSelect)
|
109
|
-
expect(mockOnMultiSelect).toHaveBeenCalledWith(['item2'])
|
110
|
-
|
111
|
-
mockOnMultiSelect.mockClear()
|
112
|
-
|
113
|
-
// Disabled multi-select
|
114
|
-
handleMultiSelect('item1', true, false, [], jest.fn(), mockOnMultiSelect)
|
115
|
-
expect(mockOnMultiSelect).not.toHaveBeenCalled()
|
116
|
-
})
|
117
|
-
|
118
|
-
test('generates CSS classes correctly', () => {
|
119
|
-
const generateClasses = (disabled, loading, searchable, multiSelect, className) => {
|
120
|
-
return [
|
121
|
-
'tree',
|
122
|
-
disabled && 'tree--disabled',
|
123
|
-
loading && 'tree--loading',
|
124
|
-
searchable && 'tree--searchable',
|
125
|
-
multiSelect && 'tree--multi-select',
|
126
|
-
className
|
127
|
-
].filter(Boolean).join(' ')
|
128
|
-
}
|
129
|
-
|
130
|
-
expect(generateClasses(false, false, false, false, ''))
|
131
|
-
.toBe('tree')
|
132
|
-
|
133
|
-
expect(generateClasses(true, true, true, true, 'custom'))
|
134
|
-
.toBe('tree tree--disabled tree--loading tree--searchable tree--multi-select custom')
|
135
|
-
})
|
136
|
-
|
137
|
-
test('generates accessibility attributes correctly', () => {
|
138
|
-
const generateAriaAttributes = (ariaLabel, disabled, loading) => {
|
139
|
-
return {
|
140
|
-
'aria-label': ariaLabel || 'Tree',
|
141
|
-
'aria-disabled': disabled,
|
142
|
-
'aria-busy': loading,
|
143
|
-
role: 'tree'
|
144
|
-
}
|
145
|
-
}
|
146
|
-
|
147
|
-
const result1 = generateAriaAttributes(null, false, false)
|
148
|
-
expect(result1['aria-label']).toBe('Tree')
|
149
|
-
expect(result1['aria-disabled']).toBe(false)
|
150
|
-
expect(result1['aria-busy']).toBe(false)
|
151
|
-
expect(result1.role).toBe('tree')
|
152
|
-
|
153
|
-
const result2 = generateAriaAttributes('Custom Tree', true, true)
|
154
|
-
expect(result2['aria-label']).toBe('Custom Tree')
|
155
|
-
expect(result2['aria-disabled']).toBe(true)
|
156
|
-
expect(result2['aria-busy']).toBe(true)
|
157
|
-
})
|
158
|
-
})
|
159
|
-
|
160
|
-
// TreeNode Component Tests
|
161
|
-
describe('TreeNode Component', () => {
|
162
|
-
test('component has correct PropTypes', () => {
|
163
|
-
expect(TreeNode.propTypes).toBeDefined()
|
164
|
-
expect(TreeNode.propTypes.id).toBeDefined()
|
165
|
-
expect(TreeNode.propTypes.icon).toBeDefined()
|
166
|
-
expect(TreeNode.propTypes.label).toBeDefined()
|
167
|
-
expect(TreeNode.propTypes.open).toBeDefined()
|
168
|
-
expect(TreeNode.propTypes.disabled).toBeDefined()
|
169
|
-
expect(TreeNode.propTypes.draggable).toBeDefined()
|
170
|
-
expect(TreeNode.propTypes.expandable).toBeDefined()
|
171
|
-
expect(TreeNode.propTypes.hasChildren).toBeDefined()
|
172
|
-
expect(TreeNode.propTypes.loading).toBeDefined()
|
173
|
-
expect(TreeNode.propTypes.badge).toBeDefined()
|
174
|
-
})
|
175
|
-
|
176
|
-
test('component has correct defaultProps', () => {
|
177
|
-
expect(TreeNode.defaultProps).toBeDefined()
|
178
|
-
expect(TreeNode.defaultProps.icon).toBe('folder')
|
179
|
-
expect(TreeNode.defaultProps.open).toBe(false)
|
180
|
-
expect(TreeNode.defaultProps.disabled).toBe(false)
|
181
|
-
expect(TreeNode.defaultProps.draggable).toBe(false)
|
182
|
-
expect(TreeNode.defaultProps.expandable).toBe(true)
|
183
|
-
expect(TreeNode.defaultProps.level).toBe(0)
|
184
|
-
expect(TreeNode.defaultProps.hasChildren).toBe(true)
|
185
|
-
expect(TreeNode.defaultProps.loading).toBe(false)
|
186
|
-
})
|
187
|
-
|
188
|
-
test('handles selection correctly', () => {
|
189
|
-
const mockOnSelect = jest.fn()
|
190
|
-
|
191
|
-
const handleSelect = (event, disabled, onSelect, id) => {
|
192
|
-
if (disabled) return
|
193
|
-
event.stopPropagation()
|
194
|
-
if (onSelect) onSelect(id)
|
195
|
-
}
|
196
|
-
|
197
|
-
const mockEvent = { stopPropagation: jest.fn() }
|
198
|
-
|
199
|
-
// Normal selection
|
200
|
-
handleSelect(mockEvent, false, mockOnSelect, 'node1')
|
201
|
-
expect(mockEvent.stopPropagation).toHaveBeenCalled()
|
202
|
-
expect(mockOnSelect).toHaveBeenCalledWith('node1')
|
203
|
-
|
204
|
-
mockOnSelect.mockClear()
|
205
|
-
|
206
|
-
// Disabled state
|
207
|
-
handleSelect(mockEvent, true, mockOnSelect, 'node1')
|
208
|
-
expect(mockOnSelect).not.toHaveBeenCalled()
|
209
|
-
})
|
210
|
-
|
211
|
-
test('handles toggle correctly', () => {
|
212
|
-
const mockSetIsOpen = jest.fn()
|
213
|
-
|
214
|
-
const handleToggle = (event, disabled, expandable, setIsOpen) => {
|
215
|
-
if (disabled || !expandable) return
|
216
|
-
event.preventDefault()
|
217
|
-
setIsOpen(prev => !prev)
|
218
|
-
}
|
219
|
-
|
220
|
-
const mockEvent = { preventDefault: jest.fn() }
|
221
|
-
|
222
|
-
// Normal toggle
|
223
|
-
handleToggle(mockEvent, false, true, mockSetIsOpen)
|
224
|
-
expect(mockEvent.preventDefault).toHaveBeenCalled()
|
225
|
-
expect(mockSetIsOpen).toHaveBeenCalledWith(expect.any(Function))
|
226
|
-
|
227
|
-
mockSetIsOpen.mockClear()
|
228
|
-
|
229
|
-
// Disabled state
|
230
|
-
handleToggle(mockEvent, true, true, mockSetIsOpen)
|
231
|
-
expect(mockSetIsOpen).not.toHaveBeenCalled()
|
232
|
-
|
233
|
-
// Not expandable
|
234
|
-
handleToggle(mockEvent, false, false, mockSetIsOpen)
|
235
|
-
expect(mockSetIsOpen).not.toHaveBeenCalled()
|
236
|
-
})
|
237
|
-
|
238
|
-
test('handles keyboard interaction correctly', () => {
|
239
|
-
const mockOnSelect = jest.fn()
|
240
|
-
const mockSetIsOpen = jest.fn()
|
241
|
-
|
242
|
-
const handleKeyDown = (event, disabled, onSelect, id, isOpen, hasChildren, setIsOpen) => {
|
243
|
-
if (disabled) return
|
244
|
-
|
245
|
-
switch (event.key) {
|
246
|
-
case 'Enter':
|
247
|
-
case ' ':
|
248
|
-
event.preventDefault()
|
249
|
-
if (onSelect) onSelect(id)
|
250
|
-
break
|
251
|
-
case 'ArrowRight':
|
252
|
-
if (!isOpen && hasChildren) {
|
253
|
-
event.preventDefault()
|
254
|
-
setIsOpen(true)
|
255
|
-
}
|
256
|
-
break
|
257
|
-
case 'ArrowLeft':
|
258
|
-
if (isOpen && hasChildren) {
|
259
|
-
event.preventDefault()
|
260
|
-
setIsOpen(false)
|
261
|
-
}
|
262
|
-
break
|
263
|
-
default:
|
264
|
-
break
|
265
|
-
}
|
266
|
-
}
|
267
|
-
|
268
|
-
const mockEvent = { preventDefault: jest.fn() }
|
269
|
-
|
270
|
-
// Enter key
|
271
|
-
handleKeyDown({ ...mockEvent, key: 'Enter' }, false, mockOnSelect, 'node1', false, true, mockSetIsOpen)
|
272
|
-
expect(mockOnSelect).toHaveBeenCalledWith('node1')
|
273
|
-
|
274
|
-
mockOnSelect.mockClear()
|
275
|
-
|
276
|
-
// Arrow right (expand)
|
277
|
-
handleKeyDown({ ...mockEvent, key: 'ArrowRight' }, false, mockOnSelect, 'node1', false, true, mockSetIsOpen)
|
278
|
-
expect(mockSetIsOpen).toHaveBeenCalledWith(true)
|
279
|
-
|
280
|
-
mockSetIsOpen.mockClear()
|
281
|
-
|
282
|
-
// Arrow left (collapse)
|
283
|
-
handleKeyDown({ ...mockEvent, key: 'ArrowLeft' }, false, mockOnSelect, 'node1', true, true, mockSetIsOpen)
|
284
|
-
expect(mockSetIsOpen).toHaveBeenCalledWith(false)
|
285
|
-
})
|
286
|
-
|
287
|
-
test('handles drag and drop correctly', () => {
|
288
|
-
const mockOnDragStart = jest.fn()
|
289
|
-
const mockOnDrop = jest.fn()
|
290
|
-
const mockSetIsDragging = jest.fn()
|
291
|
-
|
292
|
-
const handleDragStart = (event, draggable, disabled, id, setIsDragging, onDragStart) => {
|
293
|
-
if (!draggable || disabled) return
|
294
|
-
setIsDragging(true)
|
295
|
-
event.dataTransfer.setData('text/plain', id)
|
296
|
-
if (onDragStart) onDragStart(id, event)
|
297
|
-
}
|
298
|
-
|
299
|
-
const handleDrop = (event, id, onDrop) => {
|
300
|
-
event.preventDefault()
|
301
|
-
const draggedId = event.dataTransfer.getData('text/plain')
|
302
|
-
if (onDrop && draggedId !== id) {
|
303
|
-
onDrop(draggedId, id, event)
|
304
|
-
}
|
305
|
-
}
|
306
|
-
|
307
|
-
const mockEvent = {
|
308
|
-
dataTransfer: {
|
309
|
-
setData: jest.fn(),
|
310
|
-
getData: jest.fn().mockReturnValue('dragged-node')
|
311
|
-
},
|
312
|
-
preventDefault: jest.fn()
|
313
|
-
}
|
314
|
-
|
315
|
-
// Drag start
|
316
|
-
handleDragStart(mockEvent, true, false, 'node1', mockSetIsDragging, mockOnDragStart)
|
317
|
-
expect(mockSetIsDragging).toHaveBeenCalledWith(true)
|
318
|
-
expect(mockEvent.dataTransfer.setData).toHaveBeenCalledWith('text/plain', 'node1')
|
319
|
-
expect(mockOnDragStart).toHaveBeenCalledWith('node1', mockEvent)
|
320
|
-
|
321
|
-
// Drop
|
322
|
-
handleDrop(mockEvent, 'node2', mockOnDrop)
|
323
|
-
expect(mockEvent.preventDefault).toHaveBeenCalled()
|
324
|
-
expect(mockOnDrop).toHaveBeenCalledWith('dragged-node', 'node2', mockEvent)
|
325
|
-
})
|
326
|
-
|
327
|
-
test('generates CSS classes correctly', () => {
|
328
|
-
const generateClasses = (disabled, isDragging, hasChildren, loading, className) => {
|
329
|
-
return [
|
330
|
-
'tree-node',
|
331
|
-
disabled && 'tree-node--disabled',
|
332
|
-
isDragging && 'tree-node--dragging',
|
333
|
-
!hasChildren && 'tree-node--leaf',
|
334
|
-
loading && 'tree-node--loading',
|
335
|
-
className
|
336
|
-
].filter(Boolean).join(' ')
|
337
|
-
}
|
338
|
-
|
339
|
-
expect(generateClasses(false, false, true, false, ''))
|
340
|
-
.toBe('tree-node')
|
341
|
-
|
342
|
-
expect(generateClasses(true, true, false, true, 'custom'))
|
343
|
-
.toBe('tree-node tree-node--disabled tree-node--dragging tree-node--leaf tree-node--loading custom')
|
344
|
-
})
|
345
|
-
|
346
|
-
test('generates accessibility attributes correctly', () => {
|
347
|
-
const generateAriaAttributes = (hasChildren, isOpen, disabled, level, label, id) => {
|
348
|
-
return {
|
349
|
-
'aria-expanded': hasChildren ? isOpen : undefined,
|
350
|
-
'aria-disabled': disabled,
|
351
|
-
'aria-level': level + 1,
|
352
|
-
'aria-label': typeof label === 'string' ? label : `Tree node ${id || ''}`,
|
353
|
-
role: 'treeitem',
|
354
|
-
tabIndex: disabled ? -1 : 0
|
355
|
-
}
|
356
|
-
}
|
357
|
-
|
358
|
-
const result1 = generateAriaAttributes(true, true, false, 0, 'Test Node', 'node1')
|
359
|
-
expect(result1['aria-expanded']).toBe(true)
|
360
|
-
expect(result1['aria-disabled']).toBe(false)
|
361
|
-
expect(result1['aria-level']).toBe(1)
|
362
|
-
expect(result1['aria-label']).toBe('Test Node')
|
363
|
-
expect(result1.role).toBe('treeitem')
|
364
|
-
expect(result1.tabIndex).toBe(0)
|
365
|
-
|
366
|
-
const result2 = generateAriaAttributes(false, false, true, 1, null, 'node2')
|
367
|
-
expect(result2['aria-expanded']).toBeUndefined()
|
368
|
-
expect(result2['aria-disabled']).toBe(true)
|
369
|
-
expect(result2['aria-level']).toBe(2)
|
370
|
-
expect(result2['aria-label']).toBe('Tree node node2')
|
371
|
-
expect(result2.tabIndex).toBe(-1)
|
372
|
-
})
|
373
|
-
})
|
374
|
-
|
375
|
-
// TreeItem Component Tests
|
376
|
-
describe('TreeItem Component', () => {
|
377
|
-
test('component has correct PropTypes', () => {
|
378
|
-
expect(TreeItem.propTypes).toBeDefined()
|
379
|
-
expect(TreeItem.propTypes.id).toBeDefined()
|
380
|
-
expect(TreeItem.propTypes.icon).toBeDefined()
|
381
|
-
expect(TreeItem.propTypes.label).toBeDefined()
|
382
|
-
expect(TreeItem.propTypes.selected).toBeDefined()
|
383
|
-
expect(TreeItem.propTypes.checked).toBeDefined()
|
384
|
-
expect(TreeItem.propTypes.disabled).toBeDefined()
|
385
|
-
expect(TreeItem.propTypes.draggable).toBeDefined()
|
386
|
-
expect(TreeItem.propTypes.badge).toBeDefined()
|
387
|
-
})
|
388
|
-
|
389
|
-
test('component has correct defaultProps', () => {
|
390
|
-
expect(TreeItem.defaultProps).toBeDefined()
|
391
|
-
expect(TreeItem.defaultProps.icon).toBe('description')
|
392
|
-
expect(TreeItem.defaultProps.selected).toBe(false)
|
393
|
-
expect(TreeItem.defaultProps.checked).toBe(false)
|
394
|
-
expect(TreeItem.defaultProps.disabled).toBe(false)
|
395
|
-
expect(TreeItem.defaultProps.draggable).toBe(false)
|
396
|
-
expect(TreeItem.defaultProps.level).toBe(0)
|
397
|
-
})
|
398
|
-
|
399
|
-
test('handles selection correctly', () => {
|
400
|
-
const mockOnSelect = jest.fn()
|
401
|
-
|
402
|
-
const handleSelect = (event, disabled, onSelect, id) => {
|
403
|
-
if (disabled) return
|
404
|
-
event.preventDefault()
|
405
|
-
if (onSelect) onSelect(id)
|
406
|
-
}
|
407
|
-
|
408
|
-
const mockEvent = { preventDefault: jest.fn() }
|
409
|
-
|
410
|
-
// Normal selection
|
411
|
-
handleSelect(mockEvent, false, mockOnSelect, 'item1')
|
412
|
-
expect(mockEvent.preventDefault).toHaveBeenCalled()
|
413
|
-
expect(mockOnSelect).toHaveBeenCalledWith('item1')
|
414
|
-
|
415
|
-
mockOnSelect.mockClear()
|
416
|
-
|
417
|
-
// Disabled state
|
418
|
-
handleSelect(mockEvent, true, mockOnSelect, 'item1')
|
419
|
-
expect(mockOnSelect).not.toHaveBeenCalled()
|
420
|
-
})
|
421
|
-
|
422
|
-
test('handles checkbox correctly', () => {
|
423
|
-
const mockOnCheck = jest.fn()
|
424
|
-
|
425
|
-
const handleCheck = (event, disabled, onCheck, id) => {
|
426
|
-
if (disabled) return
|
427
|
-
event.stopPropagation()
|
428
|
-
if (onCheck) onCheck(id, event.target.checked)
|
429
|
-
}
|
430
|
-
|
431
|
-
const mockEvent = {
|
432
|
-
stopPropagation: jest.fn(),
|
433
|
-
target: { checked: true }
|
434
|
-
}
|
435
|
-
|
436
|
-
// Normal check
|
437
|
-
handleCheck(mockEvent, false, mockOnCheck, 'item1')
|
438
|
-
expect(mockEvent.stopPropagation).toHaveBeenCalled()
|
439
|
-
expect(mockOnCheck).toHaveBeenCalledWith('item1', true)
|
440
|
-
|
441
|
-
mockOnCheck.mockClear()
|
442
|
-
|
443
|
-
// Disabled state
|
444
|
-
handleCheck(mockEvent, true, mockOnCheck, 'item1')
|
445
|
-
expect(mockOnCheck).not.toHaveBeenCalled()
|
446
|
-
})
|
447
|
-
|
448
|
-
test('generates CSS classes correctly', () => {
|
449
|
-
const generateClasses = (selected, disabled, isDragging, className) => {
|
450
|
-
return [
|
451
|
-
'tree-item',
|
452
|
-
'final',
|
453
|
-
selected && 'selected',
|
454
|
-
disabled && 'tree-item--disabled',
|
455
|
-
isDragging && 'tree-item--dragging',
|
456
|
-
className
|
457
|
-
].filter(Boolean).join(' ')
|
458
|
-
}
|
459
|
-
|
460
|
-
expect(generateClasses(false, false, false, ''))
|
461
|
-
.toBe('tree-item final')
|
462
|
-
|
463
|
-
expect(generateClasses(true, true, true, 'custom'))
|
464
|
-
.toBe('tree-item final selected tree-item--disabled tree-item--dragging custom')
|
465
|
-
})
|
466
|
-
|
467
|
-
test('generates accessibility attributes correctly', () => {
|
468
|
-
const generateAriaAttributes = (selected, disabled, level, label, id) => {
|
469
|
-
return {
|
470
|
-
'aria-selected': selected,
|
471
|
-
'aria-disabled': disabled,
|
472
|
-
'aria-level': level + 1,
|
473
|
-
'aria-label': typeof label === 'string' ? label : `Tree item ${id || ''}`,
|
474
|
-
role: 'treeitem',
|
475
|
-
tabIndex: disabled ? -1 : 0
|
476
|
-
}
|
477
|
-
}
|
478
|
-
|
479
|
-
const result1 = generateAriaAttributes(true, false, 0, 'Test Item', 'item1')
|
480
|
-
expect(result1['aria-selected']).toBe(true)
|
481
|
-
expect(result1['aria-disabled']).toBe(false)
|
482
|
-
expect(result1['aria-level']).toBe(1)
|
483
|
-
expect(result1['aria-label']).toBe('Test Item')
|
484
|
-
expect(result1.role).toBe('treeitem')
|
485
|
-
expect(result1.tabIndex).toBe(0)
|
486
|
-
|
487
|
-
const result2 = generateAriaAttributes(false, true, 1, null, 'item2')
|
488
|
-
expect(result2['aria-selected']).toBe(false)
|
489
|
-
expect(result2['aria-disabled']).toBe(true)
|
490
|
-
expect(result2['aria-level']).toBe(2)
|
491
|
-
expect(result2['aria-label']).toBe('Tree item item2')
|
492
|
-
expect(result2.tabIndex).toBe(-1)
|
493
|
-
})
|
494
|
-
})
|
495
|
-
})
|
package/src/http/token.test.js
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
import React, { useState, useEffect } from 'react'
|
2
|
-
import { TextField } from '../html'
|
3
|
-
import CryptoJS from 'crypto-js';
|
4
|
-
import { useEffect } from 'react/cjs/react.production.min';
|
5
|
-
|
6
|
-
|
7
|
-
const Token = () => {
|
8
|
-
|
9
|
-
const [encrypted, setEncrypted] = useState("")
|
10
|
-
const [decrypted, setDecrypted] = useState("1")
|
11
|
-
|
12
|
-
function decryptData(encrypted, secret) {
|
13
|
-
const bytes = CryptoJS.AES.decrypt(encrypted, secret);
|
14
|
-
const iv = CryptoJS
|
15
|
-
const originalText = bytes.toString(CryptoJS.enc.Utf8);
|
16
|
-
return originalText;
|
17
|
-
}
|
18
|
-
|
19
|
-
function encryptData(message, secret) {
|
20
|
-
return CryptoJS.AES.encrypt(message, secret);
|
21
|
-
}
|
22
|
-
|
23
|
-
function change(id, value) {
|
24
|
-
const secret = 'n2r5u8x/A?D(G+KbPeShVkYp3s6v9y$B';
|
25
|
-
const e = encryptData(value, secret)
|
26
|
-
setEncrypted(e)
|
27
|
-
const d = decryptData(e, secret)
|
28
|
-
setDecrypted(d)
|
29
|
-
}
|
30
|
-
|
31
|
-
var data = "MTIzNDU2Nzg5MDEyMzQ1Nh7Dao5sQ/PxjeIQHSeTsjM="
|
32
|
-
const key = CryptoJS.enc.Utf8.parse('n2r5u8x/A?D(G+KbPeShVkYp3s6v9y$B')
|
33
|
-
const rawData = atob(data)
|
34
|
-
console.log(rawData)
|
35
|
-
const iv = CryptoJS.enc.Utf8.parse(rawData.substring(0, 16))
|
36
|
-
const enc = btoa(rawData.substring(16))
|
37
|
-
const dec = CryptoJS.AES.decrypt(enc, key, {iv: iv})
|
38
|
-
const plaintext = dec.toString(CryptoJS.enc.Utf8)
|
39
|
-
console.log(plaintext)
|
40
|
-
|
41
|
-
|
42
|
-
return (
|
43
|
-
<>
|
44
|
-
<TextField label="Text" onChange={(id, value) => change(id, value)}></TextField>
|
45
|
-
<TextField label="Encrypted" value={encrypted}></TextField>
|
46
|
-
<TextField label="Decrypted" value={decrypted}></TextField>
|
47
|
-
</>
|
48
|
-
)
|
49
|
-
}
|
50
|
-
|
@@ -1,33 +0,0 @@
|
|
1
|
-
import React, {useState} from 'react'
|
2
|
-
import { Document, Page } from 'react-pdf'
|
3
|
-
|
4
|
-
export const PDFViewer = (props) => {
|
5
|
-
|
6
|
-
const { file } = props
|
7
|
-
const [numPages, setNumPages] = useState(null)
|
8
|
-
const [pageNumber, setPageNumber] = useState(1)
|
9
|
-
|
10
|
-
function onDocumentLoadSuccess({ numPages }) {
|
11
|
-
setNumPages(numPages)
|
12
|
-
}
|
13
|
-
|
14
|
-
return (
|
15
|
-
<div className="pdfViewer">
|
16
|
-
<Document file={file} onLoadSuccess={onDocumentLoadSuccess}>
|
17
|
-
<Page pageNumber={pageNumber} />
|
18
|
-
</Document>
|
19
|
-
</div>
|
20
|
-
)
|
21
|
-
}
|
22
|
-
|
23
|
-
export const PDFViewerTest = (props) => {
|
24
|
-
|
25
|
-
const base64 = "xx"
|
26
|
-
|
27
|
-
const file = "https://pro.ywanadigital.com/files/20230602102630601/original/files/Label1_7_ok.pdf"
|
28
|
-
|
29
|
-
return (
|
30
|
-
<PDFViewer file={file} />
|
31
|
-
)
|
32
|
-
|
33
|
-
}
|