@controleonline/ui-default 1.0.263 → 1.0.265

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 (61) hide show
  1. package/AGENTS.md +47 -45
  2. package/package.json +20 -20
  3. package/src/react/components/errors/DefaultErrors.js +307 -325
  4. package/src/react/components/files/DefaultFile.js +46 -46
  5. package/src/react/components/filters/CompactFilterSelector.js +78 -24
  6. package/src/react/components/filters/CompactFilterSelector.styles.js +17 -5
  7. package/src/react/components/filters/DefaultColumnFilter.js +191 -57
  8. package/src/react/components/filters/DefaultExternalFilters.js +245 -182
  9. package/src/react/components/filters/DefaultSearch.js +131 -92
  10. package/src/react/components/filters/DefaultSearch.styles.js +65 -70
  11. package/src/react/components/form/DefaultForm.js +172 -151
  12. package/src/react/components/form/DefaultForm.styles.js +71 -66
  13. package/src/react/components/help/DefaultTooltip.js +87 -87
  14. package/src/react/components/help/DefaultTooltip.styles.js +61 -61
  15. package/src/react/components/inputs/DefaultDateInput.js +150 -0
  16. package/src/react/components/inputs/DefaultInput.js +162 -127
  17. package/src/react/components/inputs/DefaultInput.styles.js +6 -0
  18. package/src/react/components/inputs/DefaultSelect.js +320 -152
  19. package/src/react/components/inputs/defaultInputUtils.js +40 -19
  20. package/src/react/components/map/DefaultGoogleMap.styles.js +115 -9
  21. package/src/react/components/map/DefaultGoogleMap.web.js +560 -446
  22. package/src/react/components/map/DefaultMap.native.js +73 -71
  23. package/src/react/components/map/DefaultMap.styles.js +16 -16
  24. package/src/react/components/map/DefaultMap.web.js +68 -66
  25. package/src/react/components/map/DefaultNativeMap.native.js +307 -183
  26. package/src/react/components/map/DefaultNativeMap.shared.js +439 -340
  27. package/src/react/components/map/DefaultNativeMap.styles.js +156 -122
  28. package/src/react/components/table/DefaultColumnMenu.js +108 -0
  29. package/src/react/components/table/DefaultDebug.js +233 -0
  30. package/src/react/components/table/DefaultFiltersModal.js +142 -0
  31. package/src/react/components/table/DefaultModalButton.js +18 -0
  32. package/src/react/components/table/DefaultSearchModal.js +49 -0
  33. package/src/react/components/table/DefaultTable.js +345 -1846
  34. package/src/react/components/table/DefaultTable.styles.js +247 -136
  35. package/src/react/components/table/DefaultTable.utils.js +502 -0
  36. package/src/react/components/table/DefaultTableBody.js +26 -0
  37. package/src/react/components/table/DefaultTableCards.js +171 -0
  38. package/src/react/components/table/DefaultTableControls.js +208 -0
  39. package/src/react/components/table/DefaultTableEmptyState.js +22 -0
  40. package/src/react/components/table/DefaultTableFooter.js +172 -0
  41. package/src/react/components/table/DefaultTableInput.js +145 -0
  42. package/src/react/components/table/DefaultTableRows.js +340 -0
  43. package/src/react/components/table/DefaultTableSearch.js +100 -0
  44. package/src/react/components/table/DefaultTableToolbar.js +98 -0
  45. package/src/react/components/table/DefaultToolbarAction.js +56 -0
  46. package/src/react/components/table/useDefaultTablePagination.js +370 -0
  47. package/src/react/components/table/useDefaultTableSorting.js +126 -0
  48. package/src/react/components/table/useDefaultTableTheme.js +58 -0
  49. package/src/react/index.js +10 -10
  50. package/src/react/utils/tableVisibleColumnsPreferences.js +239 -211
  51. package/src/store/default/actions.js +51 -13
  52. package/src/store/default/getters.js +10 -8
  53. package/src/store/default/mutation_types.js +4 -2
  54. package/src/store/default/mutations.js +10 -1
  55. package/src/tests/react/components/errors/DefaultErrors.test.js +162 -162
  56. package/src/tests/react/components/files/DefaultFile.test.js +80 -80
  57. package/src/tests/react/components/form/DefaultForm.test.js +81 -0
  58. package/src/tests/react/components/inputs/DefaultSelect.test.js +185 -0
  59. package/src/tests/react/components/table/DefaultTable.test.js +1183 -0
  60. package/src/tests/react/store/defaultActions.test.js +59 -0
  61. package/src/tests/react/utils/tableVisibleColumnsPreferences.test.js +247 -168
@@ -0,0 +1,185 @@
1
+ const React = require('react');
2
+ const renderer = require('react-test-renderer');
3
+ const {jest} = require('@jest/globals');
4
+
5
+ const {beforeEach, describe, expect, it} = global;
6
+
7
+ global.IS_REACT_ACT_ENVIRONMENT = true;
8
+
9
+ let mockStores = {};
10
+
11
+ jest.mock('@store', () => ({
12
+ getAllStores: jest.fn(() => mockStores),
13
+ useStore: jest.fn(name => mockStores[name] || {actions: {}, getters: {}}),
14
+ }));
15
+
16
+ jest.mock('react-native', () => {
17
+ const React = require('react');
18
+ const createComponent = name => props =>
19
+ React.createElement(name, props, props.children);
20
+
21
+ return {
22
+ Modal: createComponent('Modal'),
23
+ ScrollView: createComponent('ScrollView'),
24
+ StyleSheet: {create: value => value},
25
+ Text: createComponent('Text'),
26
+ TextInput: createComponent('TextInput'),
27
+ TouchableOpacity: createComponent('TouchableOpacity'),
28
+ View: createComponent('View'),
29
+ };
30
+ });
31
+
32
+ jest.mock('react-native-vector-icons/Feather', () => {
33
+ const React = require('react');
34
+ return props => React.createElement('Icon', props, props.children);
35
+ });
36
+
37
+ const DefaultSelect = require('../../../../react/components/inputs/DefaultSelect').default;
38
+
39
+ const createDeferred = () => {
40
+ let resolve;
41
+ const promise = new Promise(nextResolve => {
42
+ resolve = nextResolve;
43
+ });
44
+
45
+ return {promise, resolve};
46
+ };
47
+
48
+ describe('DefaultSelect', () => {
49
+ beforeEach(() => {
50
+ mockStores = {
51
+ people: {
52
+ getters: {
53
+ currentCompany: {
54
+ id: 21,
55
+ },
56
+ },
57
+ },
58
+ invoice: {
59
+ getters: {
60
+ configs: {},
61
+ },
62
+ },
63
+ };
64
+ });
65
+
66
+ it('waits for onBeforeOpen before showing the options modal', async () => {
67
+ const gate = createDeferred();
68
+ const onBeforeOpen = jest.fn(() => gate.promise);
69
+ const onStartEditing = jest.fn();
70
+ let tree;
71
+ let openPromise;
72
+
73
+ await renderer.act(async () => {
74
+ tree = renderer.create(
75
+ React.createElement(DefaultSelect, {
76
+ column: {
77
+ key: 'jobTitle',
78
+ label: 'Cargo',
79
+ list: 'categories/getItems',
80
+ },
81
+ editing: false,
82
+ getOptionsForColumn: () => [
83
+ {
84
+ key: '1',
85
+ label: 'Analista de RH',
86
+ },
87
+ ],
88
+ onBeforeOpen,
89
+ onStartEditing,
90
+ row: {},
91
+ storeName: 'employee_profiles',
92
+ value: '1',
93
+ }),
94
+ );
95
+ });
96
+
97
+ const readButton = tree.root.findAllByType('TouchableOpacity')[0];
98
+ const modal = tree.root.findByType('Modal');
99
+
100
+ expect(modal.props.visible).toBe(false);
101
+
102
+ renderer.act(() => {
103
+ openPromise = readButton.props.onPress();
104
+ });
105
+
106
+ expect(onStartEditing).toHaveBeenCalledTimes(1);
107
+ expect(onBeforeOpen).toHaveBeenCalledTimes(1);
108
+ expect(modal.props.visible).toBe(false);
109
+
110
+ await renderer.act(async () => {
111
+ gate.resolve();
112
+ await openPromise;
113
+ });
114
+
115
+ expect(modal.props.visible).toBe(true);
116
+ });
117
+
118
+ it('loads remote list options itself when the modal opens and when search changes', async () => {
119
+ const getItems = jest.fn(() => Promise.resolve([
120
+ {id: 33, status: 'Pago', context: 'invoice'},
121
+ ]));
122
+ mockStores.status = {
123
+ actions: {
124
+ getItems,
125
+ },
126
+ getters: {
127
+ items: [],
128
+ },
129
+ };
130
+ let tree;
131
+
132
+ await renderer.act(async () => {
133
+ tree = renderer.create(
134
+ React.createElement(DefaultSelect, {
135
+ column: {
136
+ key: 'status',
137
+ label: 'Situação',
138
+ list: 'status/getItems',
139
+ listRequestParams: {
140
+ context: 'invoice',
141
+ },
142
+ searchParam: 'status',
143
+ },
144
+ onStartEditing: jest.fn(),
145
+ row: {
146
+ status: {id: 1, status: 'Aberto'},
147
+ },
148
+ storeName: 'invoice',
149
+ value: '1',
150
+ }),
151
+ );
152
+ });
153
+
154
+ const readButton = tree.root.findAllByType('TouchableOpacity')[0];
155
+
156
+ await renderer.act(async () => {
157
+ await readButton.props.onPress();
158
+ await Promise.resolve();
159
+ });
160
+
161
+ expect(getItems).toHaveBeenCalledWith({
162
+ context: 'invoice',
163
+ __storeMeta: expect.objectContaining({
164
+ skipSystemError: true,
165
+ }),
166
+ });
167
+ expect(
168
+ tree.root.findAllByType('Text').some(node => node.props.children === 'Pago'),
169
+ ).toBe(true);
170
+
171
+ const searchInput = tree.root.findByType('TextInput');
172
+ await renderer.act(async () => {
173
+ searchInput.props.onChangeText('pag');
174
+ await Promise.resolve();
175
+ });
176
+
177
+ expect(getItems).toHaveBeenLastCalledWith({
178
+ context: 'invoice',
179
+ status: 'pag',
180
+ __storeMeta: expect.objectContaining({
181
+ skipSystemError: true,
182
+ }),
183
+ });
184
+ });
185
+ });