@controleonline/ui-default 1.0.270 → 1.0.273

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 (100) hide show
  1. package/.github/workflows/integration-source-gate.yml +68 -0
  2. package/.github/workflows/manager-worker.yml +19 -0
  3. package/.github/workflows/publish-npm.yml +91 -0
  4. package/AGENTS.md +46 -50
  5. package/docs/technical/Contrato-de-colunas.md +67 -0
  6. package/docs/technical/Default-Components.md +76 -0
  7. package/docs/technical/DefaultForm.md +80 -0
  8. package/docs/technical/DefaultInput-e-DefaultSelect.md +73 -0
  9. package/docs/technical/DefaultTable.md +272 -0
  10. package/docs/wiki.md +1 -0
  11. package/package.json +4 -3
  12. package/scripts/validate-wiki-pointer.cjs +13 -0
  13. package/src/react/components/address/DefaultAddress.js +446 -0
  14. package/src/react/components/address/DefaultAddress.styles.js +133 -0
  15. package/src/react/components/address/DefaultAddressCoordFields.js +59 -0
  16. package/src/react/components/address/DefaultAddressMapPane.js +55 -0
  17. package/src/react/components/address/LatLonReadonlyFields.js +51 -0
  18. package/src/react/components/address/defaultAddressHelpers.js +163 -0
  19. package/src/react/components/address/defaultAddressStyles.js +148 -0
  20. package/src/react/components/address/defaultAddressUtils.js +129 -0
  21. package/src/react/components/extra-data/DefaultExtraData.js +152 -0
  22. package/src/react/components/extra-data/DefaultExtraData.styles.js +61 -0
  23. package/src/react/components/files/DefaultFile.js +231 -46
  24. package/src/react/components/files/DefaultFileColumn.js +123 -0
  25. package/src/react/components/files/DefaultFileColumn.styles.js +52 -0
  26. package/src/react/components/files/DefaultFileColumn.utils.js +104 -0
  27. package/src/react/components/filters/CompactFilterSelector.js +51 -35
  28. package/src/react/components/filters/DefaultColumnFilter.js +60 -48
  29. package/src/react/components/filters/DefaultExternalFilters.js +324 -265
  30. package/src/react/components/filters/filterValue.js +65 -0
  31. package/src/react/components/form/DefaultForm.js +99 -79
  32. package/src/react/components/help/DefaultTooltip.js +48 -12
  33. package/src/react/components/help/DefaultTooltip.styles.js +20 -0
  34. package/src/react/components/inputs/DefaultColorInput.js +153 -0
  35. package/src/react/components/inputs/DefaultFeatherIconPicker.js +146 -0
  36. package/src/react/components/inputs/DefaultFeatherIconPicker.styles.js +113 -0
  37. package/src/react/components/inputs/DefaultInput.js +296 -141
  38. package/src/react/components/inputs/DefaultInput.styles.js +26 -0
  39. package/src/react/components/inputs/DefaultSelect.js +134 -123
  40. package/src/react/components/inputs/defaultInputUtils.js +262 -213
  41. package/src/react/components/map/DefaultMap.native.js +73 -73
  42. package/src/react/components/map/DefaultMap.shared.js +911 -762
  43. package/src/react/components/map/DefaultMap.web.js +124 -68
  44. package/src/react/components/table/DefaultColumnMenu.js +22 -3
  45. package/src/react/components/table/DefaultDebug.js +44 -37
  46. package/src/react/components/table/DefaultSearchModal.js +9 -1
  47. package/src/react/components/table/DefaultTable.grouping.js +98 -0
  48. package/src/react/components/table/DefaultTable.js +217 -111
  49. package/src/react/components/table/DefaultTable.styles.js +369 -310
  50. package/src/react/components/table/DefaultTable.utils.js +38 -4
  51. package/src/react/components/table/DefaultTableBody.js +13 -8
  52. package/src/react/components/table/DefaultTableCards.js +20 -1
  53. package/src/react/components/table/DefaultTableControls.js +180 -205
  54. package/src/react/components/table/DefaultTableImportModal.js +108 -0
  55. package/src/react/components/table/DefaultTableInput.js +1 -0
  56. package/src/react/components/table/DefaultTableRowActions.js +1 -1
  57. package/src/react/components/table/DefaultTableRows.js +357 -325
  58. package/src/react/components/table/DefaultTableSearch.js +28 -5
  59. package/src/react/components/table/DefaultTableToolbar.js +92 -3
  60. package/src/react/components/table/useDefaultTablePagination.js +56 -7
  61. package/src/react/components/table/useDefaultTableStoreSync.js +164 -0
  62. package/src/react/components/upload/DefaultUpload.js +406 -0
  63. package/src/react/components/upload/DefaultUpload.styles.js +153 -0
  64. package/src/react/components/upload/DefaultUploadAttachmentsList.js +146 -0
  65. package/src/react/components/upload/DefaultUploadManagerModal.js +247 -0
  66. package/src/react/components/upload/defaultUploadHelpers.js +108 -0
  67. package/src/react/components/upload/defaultUploadLibrary.js +248 -0
  68. package/src/react/components/upload/fileUpload.js +93 -0
  69. package/src/react/hooks/usePostalCodeLookup.js +159 -0
  70. package/src/react/index.js +6 -0
  71. package/src/react/services/addressFormUtils.js +262 -0
  72. package/src/react/services/addressGeo.js +230 -0
  73. package/src/react/utils/tableVisibleColumnsPreferences.js +113 -15
  74. package/src/tests/react/components/address/defaultAddressHelpers.test.js +104 -0
  75. package/src/tests/react/components/files/DefaultFile.test.js +22 -6
  76. package/src/tests/react/components/files/DefaultFileColumn.company.test.js +24 -0
  77. package/src/tests/react/components/form/DefaultForm.test.js +123 -0
  78. package/src/tests/react/components/help/DefaultTooltip.test.js +93 -0
  79. package/src/tests/react/components/inputs/DefaultSelect.test.js +108 -79
  80. package/src/tests/react/components/table/DefaultTable.grouping.test.js +49 -0
  81. package/src/tests/react/components/table/DefaultTable.test.js +53 -2
  82. package/src/tests/react/components/table/DefaultTable.utils.test.js +10 -0
  83. package/src/tests/react/components/table/DefaultTableControls.filters.test.mjs +21 -0
  84. package/src/tests/react/components/table/DefaultTableRowActions.test.js +23 -0
  85. package/src/tests/react/components/table/DefaultTableRows.rowActions.test.js +152 -0
  86. package/src/tests/react/components/table/resolveRowBackgroundColor.test.mjs +45 -0
  87. package/src/tests/react/components/table/useDefaultTableStoreSync.test.js +161 -0
  88. package/src/tests/react/components/upload/DefaultUpload.test.js +353 -0
  89. package/src/tests/react/components/upload/defaultUploadLibrary.test.js +104 -0
  90. package/src/tests/react/components/upload/peopleMediaLibraryPreview.test.mjs +57 -0
  91. package/src/tests/react/filters/filterValue.test.js +46 -0
  92. package/src/tests/react/hooks/usePostalCodeLookup.test.js +107 -0
  93. package/src/tests/react/inputs/defaultInputUtils.test.js +9 -1
  94. package/src/tests/react/services/SMOKE-637-cep-hydrate.md +45 -0
  95. package/src/tests/react/services/addressFormUtils.test.js +179 -0
  96. package/src/tests/react/services/addressGeoLookup.async.test.js +104 -0
  97. package/src/tests/react/services/addressGeoLookup.test.js +105 -0
  98. package/src/tests/react/services/smoke-637/form-cep-12941040.png +0 -0
  99. package/src/tests/react/services/smoke-637/index.html +132 -0
  100. package/src/tests/react/utils/tableVisibleColumnsPreferences.test.js +96 -49
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useState } from 'react';
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
2
  import { TextInput, View } from 'react-native';
3
3
  import { getAllStores, useStore } from '@store';
4
4
  import {
@@ -13,6 +13,8 @@ import {
13
13
  import CompactFilterSelector from './CompactFilterSelector';
14
14
  import DateShortcutFilter from './DateShortcutFilter';
15
15
  import { resolveNextDateFilterValue } from './dateFilterSelection';
16
+ import { isFilledFilterValue } from './filterValue';
17
+ import useDefaultTableTheme from '@controleonline/ui-default/src/react/components/table/useDefaultTableTheme';
16
18
  import {
17
19
  normalizeCollectionItems,
18
20
  resolveColumnListLoadParams,
@@ -25,9 +27,9 @@ import {
25
27
  sanitizeTableFiltersPreference,
26
28
  } from '../../utils/tableVisibleColumnsPreferences';
27
29
  import styles from './DefaultColumnFilter.styles';
28
-
29
- const DefaultColumnFilter = ({
30
- accentColor = '#2563EB',
30
+
31
+ const DefaultColumnFilter = ({
32
+ accentColor = null,
31
33
  column,
32
34
  filters = {},
33
35
  onBeforeOpen = null,
@@ -35,15 +37,22 @@ const DefaultColumnFilter = ({
35
37
  getOptionsForColumn = null,
36
38
  onChange = null,
37
39
  storeName = '',
38
- style = null,
40
+ style = null,
39
41
  }) => {
40
42
  const store = useStore(storeName);
41
43
  const peopleStore = useStore('people');
42
44
  const configs = store?.getters?.configs || {};
45
+ const { resolvedAccentColor } = useDefaultTableTheme(accentColor);
43
46
  const [loadedItems, setLoadedItems] = useState([]);
44
47
  const [loadedKey, setLoadedKey] = useState('');
45
48
  const fieldName = getColumnKey(column);
46
49
  const currentCompanyId = peopleStore?.getters?.currentCompany?.id;
50
+
51
+ useEffect(() => {
52
+ setLoadedItems([]);
53
+ setLoadedKey('');
54
+ }, [currentCompanyId]);
55
+
47
56
  const requestChange = useCallback(
48
57
  (nextFieldName, value) => {
49
58
  if (typeof onChange === 'function') {
@@ -53,19 +62,16 @@ const DefaultColumnFilter = ({
53
62
 
54
63
  const currentFilters = store?.getters?.filters || {};
55
64
  const nextFilters = { ...(currentFilters || {}) };
56
- const isEmpty =
57
- value === null ||
58
- value === undefined ||
59
- normalizeText(value) === '' ||
60
- (Array.isArray(value) && value.length === 0);
61
-
62
- if (isEmpty) delete nextFilters[nextFieldName];
65
+ if (!isFilledFilterValue(value)) delete nextFilters[nextFieldName];
63
66
  else nextFilters[nextFieldName] = value;
64
67
 
65
68
  const columns = Array.isArray(store?.getters?.columns) ? store.getters.columns : [];
66
69
  const tablePreferenceScope =
67
70
  configs.tablePreferenceScope ||
68
- resolveDefaultTablePreferenceScope({ storeName });
71
+ resolveDefaultTablePreferenceScope({
72
+ companyId: currentCompanyId,
73
+ storeName,
74
+ });
69
75
  const persistedFilters = sanitizeTableFiltersPreference({
70
76
  columns,
71
77
  filters: nextFilters,
@@ -81,7 +87,7 @@ const DefaultColumnFilter = ({
81
87
 
82
88
  configs.onFilterChange?.(nextFilters);
83
89
  },
84
- [configs, onChange, store, storeName],
90
+ [configs, currentCompanyId, onChange, store, storeName],
85
91
  );
86
92
  const resolveOptions = useCallback(
87
93
  targetColumn => {
@@ -149,11 +155,11 @@ const DefaultColumnFilter = ({
149
155
  loadedKey,
150
156
  ],
151
157
  );
152
-
153
- if (column?.filter === false || column?.filters === false) {
154
- return <View style={style} />;
155
- }
156
-
158
+
159
+ if (column?.filter === false || column?.filters === false) {
160
+ return <View style={style} />;
161
+ }
162
+
157
163
  if (isDateLikeColumn(column)) {
158
164
  const filterValue = filters?.[fieldName] || {};
159
165
  return (
@@ -164,7 +170,7 @@ const DefaultColumnFilter = ({
164
170
  field={fieldName}
165
171
  labelCaption={global.t?.t(storeName, 'label', column?.label || fieldName)}
166
172
  value={filterValue.shortcut || 'all'}
167
- customRange={filterValue.customRange || { from: '', to: '' }}
173
+ customRange={filterValue.customRange || { from: '', to: '' }}
168
174
  onChange={optionKey =>
169
175
  requestChange(
170
176
  fieldName,
@@ -175,25 +181,31 @@ const DefaultColumnFilter = ({
175
181
  ...(filterValue || {}),
176
182
  shortcut: 'custom',
177
183
  customRange: range,
178
- })}
179
- />
180
- </View>
181
- );
182
- }
183
-
184
+ })}
185
+ />
186
+ </View>
187
+ );
188
+ }
189
+
184
190
  if (column?.list) {
185
- const rawOptions = loadedItems.length > 0
186
- ? mapOptions(column, loadedItems, storeName)
187
- : buildOptionsFromColumn(column, resolveOptions, storeName);
191
+ /*
192
+ * @agents List options for filters must load only when the modal opens
193
+ * (onBeforeOpen). Falling back to the shared store items would show
194
+ * another company's payment types / wallets / categories.
195
+ */
196
+ const explicitOptions = resolveOptions(column);
197
+ const rawOptions = Array.isArray(explicitOptions)
198
+ ? mapOptions(column, explicitOptions, storeName)
199
+ : mapOptions(column, loadedItems, storeName);
188
200
  const options = [
189
201
  { key: '', label: global.t?.t(storeName, 'label', 'select') },
190
202
  ...rawOptions,
191
203
  ];
192
- const selectedKey = normalizeOptionKey(filters?.[fieldName]);
193
- const selected = options.find(option => option.key === selectedKey);
194
-
195
- return (
196
- <View style={[style, styles.filterCell]}>
204
+ const selectedKey = normalizeOptionKey(filters?.[fieldName]);
205
+ const selected = options.find(option => option.key === selectedKey);
206
+
207
+ return (
208
+ <View style={[style, styles.filterCell]}>
197
209
  <CompactFilterSelector
198
210
  dense
199
211
  store={storeName}
@@ -201,7 +213,7 @@ const DefaultColumnFilter = ({
201
213
  icon="filter"
202
214
  onBeforeOpen={onBeforeOpen || (() => loadListOptions())}
203
215
  onSearchChange={onSearchChange || (value => loadListOptions(value))}
204
- accentColor={accentColor}
216
+ accentColor={resolvedAccentColor}
205
217
  active={Boolean(selectedKey)}
206
218
  label={selected?.label || options[0]?.label || ''}
207
219
  options={options}
@@ -211,21 +223,21 @@ const DefaultColumnFilter = ({
211
223
  requestChange(fieldName, optionKey);
212
224
  return true;
213
225
  }}
214
- />
215
- </View>
216
- );
217
- }
218
-
219
- return (
220
- <View style={[style, styles.filterCell]}>
221
- <TextInput
226
+ />
227
+ </View>
228
+ );
229
+ }
230
+
231
+ return (
232
+ <View style={[style, styles.filterCell]}>
233
+ <TextInput
222
234
  style={styles.filterInput}
223
235
  value={normalizeText(filters?.[fieldName])}
224
236
  placeholder={global.t?.t(storeName, 'input', column?.label || fieldName)}
225
237
  onChangeText={value => requestChange(fieldName, value)}
226
238
  />
227
- </View>
228
- );
229
- };
230
-
231
- export default DefaultColumnFilter;
239
+ </View>
240
+ );
241
+ };
242
+
243
+ export default DefaultColumnFilter;