@controleonline/ui-default 1.0.264 → 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 (46) hide show
  1. package/AGENTS.md +3 -2
  2. package/package.json +21 -18
  3. package/src/react/components/errors/DefaultErrors.js +64 -82
  4. package/src/react/components/filters/CompactFilterSelector.js +58 -23
  5. package/src/react/components/filters/CompactFilterSelector.styles.js +17 -5
  6. package/src/react/components/filters/DefaultColumnFilter.js +177 -45
  7. package/src/react/components/filters/DefaultExternalFilters.js +201 -143
  8. package/src/react/components/filters/DefaultSearch.js +27 -25
  9. package/src/react/components/form/DefaultForm.js +72 -53
  10. package/src/react/components/form/DefaultForm.styles.js +71 -66
  11. package/src/react/components/inputs/DefaultDateInput.js +150 -0
  12. package/src/react/components/inputs/DefaultInput.js +44 -11
  13. package/src/react/components/inputs/DefaultInput.styles.js +6 -0
  14. package/src/react/components/inputs/DefaultSelect.js +200 -43
  15. package/src/react/components/inputs/defaultInputUtils.js +40 -19
  16. package/src/react/components/table/DefaultColumnMenu.js +108 -0
  17. package/src/react/components/table/DefaultDebug.js +233 -0
  18. package/src/react/components/table/DefaultFiltersModal.js +142 -0
  19. package/src/react/components/table/DefaultModalButton.js +18 -0
  20. package/src/react/components/table/DefaultSearchModal.js +49 -0
  21. package/src/react/components/table/DefaultTable.js +350 -2025
  22. package/src/react/components/table/DefaultTable.styles.js +217 -97
  23. package/src/react/components/table/DefaultTable.utils.js +502 -0
  24. package/src/react/components/table/DefaultTableBody.js +26 -0
  25. package/src/react/components/table/DefaultTableCards.js +171 -0
  26. package/src/react/components/table/DefaultTableControls.js +208 -0
  27. package/src/react/components/table/DefaultTableEmptyState.js +22 -0
  28. package/src/react/components/table/DefaultTableFooter.js +172 -0
  29. package/src/react/components/table/DefaultTableInput.js +145 -0
  30. package/src/react/components/table/DefaultTableRows.js +340 -0
  31. package/src/react/components/table/DefaultTableSearch.js +100 -0
  32. package/src/react/components/table/DefaultTableToolbar.js +98 -0
  33. package/src/react/components/table/DefaultToolbarAction.js +56 -0
  34. package/src/react/components/table/useDefaultTablePagination.js +370 -0
  35. package/src/react/components/table/useDefaultTableSorting.js +126 -0
  36. package/src/react/components/table/useDefaultTableTheme.js +58 -0
  37. package/src/react/utils/tableVisibleColumnsPreferences.js +239 -211
  38. package/src/store/default/actions.js +51 -13
  39. package/src/store/default/getters.js +10 -8
  40. package/src/store/default/mutation_types.js +4 -2
  41. package/src/store/default/mutations.js +10 -1
  42. package/src/tests/react/components/form/DefaultForm.test.js +81 -0
  43. package/src/tests/react/components/inputs/DefaultSelect.test.js +106 -14
  44. package/src/tests/react/components/table/DefaultTable.test.js +945 -96
  45. package/src/tests/react/store/defaultActions.test.js +59 -0
  46. package/src/tests/react/utils/tableVisibleColumnsPreferences.test.js +247 -168
@@ -0,0 +1,81 @@
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
+ let capturedInputs = [];
11
+
12
+ jest.mock('@store', () => ({
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
+ ScrollView: createComponent('ScrollView'),
23
+ StyleSheet: {create: value => value},
24
+ Text: createComponent('Text'),
25
+ TouchableOpacity: createComponent('TouchableOpacity'),
26
+ View: createComponent('View'),
27
+ };
28
+ });
29
+
30
+ jest.mock('../../../../react/components/inputs/DefaultInput', () => props => {
31
+ const React = require('react');
32
+ capturedInputs.push(props);
33
+ return React.createElement('DefaultInput', props);
34
+ });
35
+
36
+ const DefaultForm = require('../../../../react/components/form/DefaultForm').default;
37
+
38
+ describe('DefaultForm', () => {
39
+ beforeEach(() => {
40
+ capturedInputs = [];
41
+ mockStores = {
42
+ theme: {
43
+ getters: {
44
+ colors: {},
45
+ },
46
+ },
47
+ };
48
+ });
49
+
50
+ it('keeps create-mode draft text while typing when no row is provided', async () => {
51
+ const columns = [
52
+ {
53
+ name: 'name',
54
+ label: 'reason',
55
+ editable: true,
56
+ },
57
+ ];
58
+
59
+ await renderer.act(async () => {
60
+ renderer.create(
61
+ React.createElement(DefaultForm, {
62
+ actions: {
63
+ save: jest.fn(),
64
+ },
65
+ columns,
66
+ mode: 'create',
67
+ storeName: 'order_cancellation_reasons',
68
+ }),
69
+ );
70
+ });
71
+
72
+ const inputBeforeTyping = capturedInputs[capturedInputs.length - 1];
73
+
74
+ await renderer.act(async () => {
75
+ inputBeforeTyping.onChangeValue('Cliente desistiu');
76
+ });
77
+
78
+ const inputAfterTyping = capturedInputs[capturedInputs.length - 1];
79
+ expect(inputAfterTyping.value).toBe('Cliente desistiu');
80
+ });
81
+ });
@@ -1,12 +1,19 @@
1
1
  const React = require('react');
2
2
  const renderer = require('react-test-renderer');
3
- const {jest} = require('@jest/globals');
4
-
5
- const {describe, expect, it} = global;
6
-
7
- global.IS_REACT_ACT_ENVIRONMENT = true;
8
-
9
- jest.mock('react-native', () => {
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', () => {
10
17
  const React = require('react');
11
18
  const createComponent = name => props =>
12
19
  React.createElement(name, props, props.children);
@@ -27,7 +34,7 @@ jest.mock('react-native-vector-icons/Feather', () => {
27
34
  return props => React.createElement('Icon', props, props.children);
28
35
  });
29
36
 
30
- const DefaultSelect = require('../../../../react/components/inputs/DefaultSelect').default;
37
+ const DefaultSelect = require('../../../../react/components/inputs/DefaultSelect').default;
31
38
 
32
39
  const createDeferred = () => {
33
40
  let resolve;
@@ -38,8 +45,25 @@ const createDeferred = () => {
38
45
  return {promise, resolve};
39
46
  };
40
47
 
41
- describe('DefaultSelect', () => {
42
- it('waits for onBeforeOpen before showing the options modal', async () => {
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 () => {
43
67
  const gate = createDeferred();
44
68
  const onBeforeOpen = jest.fn(() => gate.promise);
45
69
  const onStartEditing = jest.fn();
@@ -87,7 +111,75 @@ describe('DefaultSelect', () => {
87
111
  gate.resolve();
88
112
  await openPromise;
89
113
  });
90
-
91
- expect(modal.props.visible).toBe(true);
92
- });
93
- });
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
+ });