@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.
- package/.github/workflows/integration-source-gate.yml +68 -0
- package/.github/workflows/manager-worker.yml +19 -0
- package/.github/workflows/publish-npm.yml +91 -0
- package/AGENTS.md +46 -50
- package/docs/technical/Contrato-de-colunas.md +67 -0
- package/docs/technical/Default-Components.md +76 -0
- package/docs/technical/DefaultForm.md +80 -0
- package/docs/technical/DefaultInput-e-DefaultSelect.md +73 -0
- package/docs/technical/DefaultTable.md +272 -0
- package/docs/wiki.md +1 -0
- package/package.json +4 -3
- package/scripts/validate-wiki-pointer.cjs +13 -0
- package/src/react/components/address/DefaultAddress.js +446 -0
- package/src/react/components/address/DefaultAddress.styles.js +133 -0
- package/src/react/components/address/DefaultAddressCoordFields.js +59 -0
- package/src/react/components/address/DefaultAddressMapPane.js +55 -0
- package/src/react/components/address/LatLonReadonlyFields.js +51 -0
- package/src/react/components/address/defaultAddressHelpers.js +163 -0
- package/src/react/components/address/defaultAddressStyles.js +148 -0
- package/src/react/components/address/defaultAddressUtils.js +129 -0
- package/src/react/components/extra-data/DefaultExtraData.js +152 -0
- package/src/react/components/extra-data/DefaultExtraData.styles.js +61 -0
- package/src/react/components/files/DefaultFile.js +231 -46
- package/src/react/components/files/DefaultFileColumn.js +123 -0
- package/src/react/components/files/DefaultFileColumn.styles.js +52 -0
- package/src/react/components/files/DefaultFileColumn.utils.js +104 -0
- package/src/react/components/filters/CompactFilterSelector.js +51 -35
- package/src/react/components/filters/DefaultColumnFilter.js +60 -48
- package/src/react/components/filters/DefaultExternalFilters.js +324 -265
- package/src/react/components/filters/filterValue.js +65 -0
- package/src/react/components/form/DefaultForm.js +99 -79
- package/src/react/components/help/DefaultTooltip.js +48 -12
- package/src/react/components/help/DefaultTooltip.styles.js +20 -0
- package/src/react/components/inputs/DefaultColorInput.js +153 -0
- package/src/react/components/inputs/DefaultFeatherIconPicker.js +146 -0
- package/src/react/components/inputs/DefaultFeatherIconPicker.styles.js +113 -0
- package/src/react/components/inputs/DefaultInput.js +296 -141
- package/src/react/components/inputs/DefaultInput.styles.js +26 -0
- package/src/react/components/inputs/DefaultSelect.js +134 -123
- package/src/react/components/inputs/defaultInputUtils.js +262 -213
- package/src/react/components/map/DefaultMap.native.js +73 -73
- package/src/react/components/map/DefaultMap.shared.js +911 -762
- package/src/react/components/map/DefaultMap.web.js +124 -68
- package/src/react/components/table/DefaultColumnMenu.js +22 -3
- package/src/react/components/table/DefaultDebug.js +44 -37
- package/src/react/components/table/DefaultSearchModal.js +9 -1
- package/src/react/components/table/DefaultTable.grouping.js +98 -0
- package/src/react/components/table/DefaultTable.js +217 -111
- package/src/react/components/table/DefaultTable.styles.js +369 -310
- package/src/react/components/table/DefaultTable.utils.js +38 -4
- package/src/react/components/table/DefaultTableBody.js +13 -8
- package/src/react/components/table/DefaultTableCards.js +20 -1
- package/src/react/components/table/DefaultTableControls.js +180 -205
- package/src/react/components/table/DefaultTableImportModal.js +108 -0
- package/src/react/components/table/DefaultTableInput.js +1 -0
- package/src/react/components/table/DefaultTableRowActions.js +1 -1
- package/src/react/components/table/DefaultTableRows.js +357 -325
- package/src/react/components/table/DefaultTableSearch.js +28 -5
- package/src/react/components/table/DefaultTableToolbar.js +92 -3
- package/src/react/components/table/useDefaultTablePagination.js +56 -7
- package/src/react/components/table/useDefaultTableStoreSync.js +164 -0
- package/src/react/components/upload/DefaultUpload.js +406 -0
- package/src/react/components/upload/DefaultUpload.styles.js +153 -0
- package/src/react/components/upload/DefaultUploadAttachmentsList.js +146 -0
- package/src/react/components/upload/DefaultUploadManagerModal.js +247 -0
- package/src/react/components/upload/defaultUploadHelpers.js +108 -0
- package/src/react/components/upload/defaultUploadLibrary.js +248 -0
- package/src/react/components/upload/fileUpload.js +93 -0
- package/src/react/hooks/usePostalCodeLookup.js +159 -0
- package/src/react/index.js +6 -0
- package/src/react/services/addressFormUtils.js +262 -0
- package/src/react/services/addressGeo.js +230 -0
- package/src/react/utils/tableVisibleColumnsPreferences.js +113 -15
- package/src/tests/react/components/address/defaultAddressHelpers.test.js +104 -0
- package/src/tests/react/components/files/DefaultFile.test.js +22 -6
- package/src/tests/react/components/files/DefaultFileColumn.company.test.js +24 -0
- package/src/tests/react/components/form/DefaultForm.test.js +123 -0
- package/src/tests/react/components/help/DefaultTooltip.test.js +93 -0
- package/src/tests/react/components/inputs/DefaultSelect.test.js +108 -79
- package/src/tests/react/components/table/DefaultTable.grouping.test.js +49 -0
- package/src/tests/react/components/table/DefaultTable.test.js +53 -2
- package/src/tests/react/components/table/DefaultTable.utils.test.js +10 -0
- package/src/tests/react/components/table/DefaultTableControls.filters.test.mjs +21 -0
- package/src/tests/react/components/table/DefaultTableRowActions.test.js +23 -0
- package/src/tests/react/components/table/DefaultTableRows.rowActions.test.js +152 -0
- package/src/tests/react/components/table/resolveRowBackgroundColor.test.mjs +45 -0
- package/src/tests/react/components/table/useDefaultTableStoreSync.test.js +161 -0
- package/src/tests/react/components/upload/DefaultUpload.test.js +353 -0
- package/src/tests/react/components/upload/defaultUploadLibrary.test.js +104 -0
- package/src/tests/react/components/upload/peopleMediaLibraryPreview.test.mjs +57 -0
- package/src/tests/react/filters/filterValue.test.js +46 -0
- package/src/tests/react/hooks/usePostalCodeLookup.test.js +107 -0
- package/src/tests/react/inputs/defaultInputUtils.test.js +9 -1
- package/src/tests/react/services/SMOKE-637-cep-hydrate.md +45 -0
- package/src/tests/react/services/addressFormUtils.test.js +179 -0
- package/src/tests/react/services/addressGeoLookup.async.test.js +104 -0
- package/src/tests/react/services/addressGeoLookup.test.js +105 -0
- package/src/tests/react/services/smoke-637/form-cep-12941040.png +0 -0
- package/src/tests/react/services/smoke-637/index.html +132 -0
- 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 =
|
|
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
|
-
|
|
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({
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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={
|
|
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;
|