@trackunit/filters-filter-bar 1.0.59 → 1.0.63
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/index.cjs.js +39 -14
- package/index.esm.js +39 -14
- package/package.json +10 -10
- package/src/lib/hooks/useFilterBar.d.ts +6 -1
package/index.cjs.js
CHANGED
|
@@ -916,6 +916,7 @@ const mockFilterBar = {
|
|
|
916
916
|
setObjectValue: doNothing,
|
|
917
917
|
toggleObjectValue: doNothing,
|
|
918
918
|
},
|
|
919
|
+
dataLoaded: doNothing(),
|
|
919
920
|
filterBarDefinition: {},
|
|
920
921
|
};
|
|
921
922
|
|
|
@@ -1119,7 +1120,8 @@ const validateFilter = (filter, filterDefinitions) => {
|
|
|
1119
1120
|
* @template TFilterBarDefinition - A generic type for the filter bar definition.
|
|
1120
1121
|
* @returns {object} An object containing filter bar configuration and actions.
|
|
1121
1122
|
*/
|
|
1122
|
-
const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState, }) => {
|
|
1123
|
+
const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState, loadAsync, }) => {
|
|
1124
|
+
const [internalFilterBarDefinitions, setInternalFilterBarDefinitions] = react.useState(filterBarDefinition);
|
|
1123
1125
|
const setValue = react.useCallback((key, callback) => {
|
|
1124
1126
|
setFilterBarConfig(prevState => {
|
|
1125
1127
|
return {
|
|
@@ -1131,13 +1133,13 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1131
1133
|
};
|
|
1132
1134
|
});
|
|
1133
1135
|
}, []);
|
|
1134
|
-
const
|
|
1135
|
-
const
|
|
1136
|
+
const [initialStoredFilters] = react.useState(() => localStorage.getItem(`filter-${name}`) || "{}");
|
|
1137
|
+
const loadData = react.useCallback((updatedFilterDefinitionsValues) => {
|
|
1136
1138
|
let initialFilterBarConfig;
|
|
1137
|
-
const storedFilters =
|
|
1139
|
+
const storedFilters = initialStoredFilters;
|
|
1138
1140
|
if (storedFilters && storedFilters !== "undefined") {
|
|
1139
1141
|
const loadedFilterBarConfig = JSON.parse(storedFilters);
|
|
1140
|
-
if (validateFilter(loadedFilterBarConfig,
|
|
1142
|
+
if (validateFilter(loadedFilterBarConfig, updatedFilterDefinitionsValues)) {
|
|
1141
1143
|
initialFilterBarConfig = {
|
|
1142
1144
|
...loadedFilterBarConfig,
|
|
1143
1145
|
initialState: initialState || loadedFilterBarConfig.initialState,
|
|
@@ -1149,14 +1151,14 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1149
1151
|
//To do this for a changing default value as in customers and sites we would need to recreate the initialFilterBarConfig every time the default value changes.
|
|
1150
1152
|
//This mean that filterbars that have this functionality wouldn't be able to save the state of the filterbar.
|
|
1151
1153
|
//Another option would be to create a new filterbar for each customer or site. This also has its drawbacks. Would raise it with the frontend community.
|
|
1152
|
-
const hasNonVisibleDefaultValues =
|
|
1154
|
+
const hasNonVisibleDefaultValues = updatedFilterDefinitionsValues.some(value => value.showInStarredMenu &&
|
|
1153
1155
|
!value.showInStarredMenu() &&
|
|
1154
1156
|
value.showInFilterBar &&
|
|
1155
1157
|
!value.showInFilterBar() &&
|
|
1156
1158
|
value.defaultValue?.toString &&
|
|
1157
1159
|
value.defaultValue.toString().length > 0);
|
|
1158
1160
|
if (initialFilterBarConfig === undefined || hasNonVisibleDefaultValues) {
|
|
1159
|
-
initialFilterBarConfig = createInitialState(name,
|
|
1161
|
+
initialFilterBarConfig = createInitialState(name, updatedFilterDefinitionsValues, initialState || {}, setValue);
|
|
1160
1162
|
}
|
|
1161
1163
|
// eslint-disable-next-line no-autofix/local-rules/prefer-custom-object-keys
|
|
1162
1164
|
Object.keys(initialFilterBarConfig.values).forEach(key => {
|
|
@@ -1164,6 +1166,28 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1164
1166
|
initialFilterBarConfig.setters[`set${stringTs.capitalize(key)}`] = (callback) => setValue(key, callback);
|
|
1165
1167
|
});
|
|
1166
1168
|
return initialFilterBarConfig;
|
|
1169
|
+
}, [initialState, name, setValue, initialStoredFilters]);
|
|
1170
|
+
const dataLoaded = react.useCallback((loadedFilterDefinitionsValues) => {
|
|
1171
|
+
if (!loadAsync) {
|
|
1172
|
+
throw new Error("You must pass in loadAsync to useFilterBar when loading filter data asynchronously");
|
|
1173
|
+
}
|
|
1174
|
+
setInternalFilterBarDefinitions(loadedFilterDefinitionsValues);
|
|
1175
|
+
setFilterBarConfig(prev => loadData(sharedUtils.objectValues(loadedFilterDefinitionsValues)));
|
|
1176
|
+
}, [loadAsync, loadData]);
|
|
1177
|
+
const [filterBarConfig, setFilterBarConfig] = react.useState(() => {
|
|
1178
|
+
let initialFilterBarConfig;
|
|
1179
|
+
if (!loadAsync) {
|
|
1180
|
+
initialFilterBarConfig = loadData(sharedUtils.objectValues(internalFilterBarDefinitions));
|
|
1181
|
+
}
|
|
1182
|
+
else {
|
|
1183
|
+
initialFilterBarConfig = createInitialState(name, sharedUtils.objectValues(internalFilterBarDefinitions), initialState || {}, setValue);
|
|
1184
|
+
// eslint-disable-next-line no-autofix/local-rules/prefer-custom-object-keys
|
|
1185
|
+
Object.keys(initialFilterBarConfig.values).forEach(key => {
|
|
1186
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1187
|
+
initialFilterBarConfig.setters[`set${stringTs.capitalize(key)}`] = (callback) => setValue(key, callback);
|
|
1188
|
+
});
|
|
1189
|
+
}
|
|
1190
|
+
return initialFilterBarConfig;
|
|
1167
1191
|
});
|
|
1168
1192
|
react.useEffect(() => {
|
|
1169
1193
|
onValuesChange?.(filterBarConfig.values);
|
|
@@ -1177,7 +1201,7 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1177
1201
|
return filterBarConfig.name;
|
|
1178
1202
|
},
|
|
1179
1203
|
getFilterTitle(key) {
|
|
1180
|
-
return
|
|
1204
|
+
return internalFilterBarDefinitions[key]?.title ?? key;
|
|
1181
1205
|
},
|
|
1182
1206
|
arrayIncludesValue(key, value) {
|
|
1183
1207
|
const filter = filterBarConfig.values[key];
|
|
@@ -1222,11 +1246,11 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1222
1246
|
return filter?.value === value || false;
|
|
1223
1247
|
},
|
|
1224
1248
|
};
|
|
1225
|
-
}, [filterBarConfig.initialState, filterBarConfig.name, filterBarConfig.values,
|
|
1249
|
+
}, [filterBarConfig.initialState, filterBarConfig.name, filterBarConfig.values, internalFilterBarDefinitions]);
|
|
1226
1250
|
const filterMapActions = react.useMemo(() => {
|
|
1227
1251
|
// Reset an individual filter to its initial state
|
|
1228
1252
|
const resetIndividualFilterToInitialState = (key) => {
|
|
1229
|
-
const tmpInitialState = createInitialState(name,
|
|
1253
|
+
const tmpInitialState = createInitialState(name, sharedUtils.objectValues(internalFilterBarDefinitions), initialState || {}, setValue);
|
|
1230
1254
|
setFilterBarConfig(prevState => {
|
|
1231
1255
|
return {
|
|
1232
1256
|
...prevState,
|
|
@@ -1443,19 +1467,20 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1443
1467
|
setFilterBarConfig(prevState => {
|
|
1444
1468
|
return {
|
|
1445
1469
|
...prevState,
|
|
1446
|
-
values: createInitialState(name,
|
|
1470
|
+
values: createInitialState(name, sharedUtils.objectValues(internalFilterBarDefinitions), initialState || {}, setValue).values,
|
|
1447
1471
|
};
|
|
1448
1472
|
});
|
|
1449
1473
|
},
|
|
1450
1474
|
resetIndividualFilterToInitialState,
|
|
1451
1475
|
};
|
|
1452
|
-
}, [
|
|
1476
|
+
}, [initialState, name, setValue, internalFilterBarDefinitions]);
|
|
1453
1477
|
return react.useMemo(() => {
|
|
1454
1478
|
return {
|
|
1455
1479
|
filterBarConfig: { ...filterBarConfig, ...filterMapActions, ...filterMapGetter },
|
|
1456
|
-
filterBarDefinition,
|
|
1480
|
+
filterBarDefinition: internalFilterBarDefinitions,
|
|
1481
|
+
dataLoaded,
|
|
1457
1482
|
};
|
|
1458
|
-
}, [filterBarConfig, filterMapActions, filterMapGetter,
|
|
1483
|
+
}, [filterBarConfig, filterMapActions, filterMapGetter, internalFilterBarDefinitions, dataLoaded]);
|
|
1459
1484
|
};
|
|
1460
1485
|
const getKeysOfUnequalProperties = (obj1, obj2) => {
|
|
1461
1486
|
return reduce(obj1, (result, value, key) => {
|
package/index.esm.js
CHANGED
|
@@ -914,6 +914,7 @@ const mockFilterBar = {
|
|
|
914
914
|
setObjectValue: doNothing,
|
|
915
915
|
toggleObjectValue: doNothing,
|
|
916
916
|
},
|
|
917
|
+
dataLoaded: doNothing(),
|
|
917
918
|
filterBarDefinition: {},
|
|
918
919
|
};
|
|
919
920
|
|
|
@@ -1117,7 +1118,8 @@ const validateFilter = (filter, filterDefinitions) => {
|
|
|
1117
1118
|
* @template TFilterBarDefinition - A generic type for the filter bar definition.
|
|
1118
1119
|
* @returns {object} An object containing filter bar configuration and actions.
|
|
1119
1120
|
*/
|
|
1120
|
-
const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState, }) => {
|
|
1121
|
+
const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState, loadAsync, }) => {
|
|
1122
|
+
const [internalFilterBarDefinitions, setInternalFilterBarDefinitions] = useState(filterBarDefinition);
|
|
1121
1123
|
const setValue = useCallback((key, callback) => {
|
|
1122
1124
|
setFilterBarConfig(prevState => {
|
|
1123
1125
|
return {
|
|
@@ -1129,13 +1131,13 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1129
1131
|
};
|
|
1130
1132
|
});
|
|
1131
1133
|
}, []);
|
|
1132
|
-
const
|
|
1133
|
-
const
|
|
1134
|
+
const [initialStoredFilters] = useState(() => localStorage.getItem(`filter-${name}`) || "{}");
|
|
1135
|
+
const loadData = useCallback((updatedFilterDefinitionsValues) => {
|
|
1134
1136
|
let initialFilterBarConfig;
|
|
1135
|
-
const storedFilters =
|
|
1137
|
+
const storedFilters = initialStoredFilters;
|
|
1136
1138
|
if (storedFilters && storedFilters !== "undefined") {
|
|
1137
1139
|
const loadedFilterBarConfig = JSON.parse(storedFilters);
|
|
1138
|
-
if (validateFilter(loadedFilterBarConfig,
|
|
1140
|
+
if (validateFilter(loadedFilterBarConfig, updatedFilterDefinitionsValues)) {
|
|
1139
1141
|
initialFilterBarConfig = {
|
|
1140
1142
|
...loadedFilterBarConfig,
|
|
1141
1143
|
initialState: initialState || loadedFilterBarConfig.initialState,
|
|
@@ -1147,14 +1149,14 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1147
1149
|
//To do this for a changing default value as in customers and sites we would need to recreate the initialFilterBarConfig every time the default value changes.
|
|
1148
1150
|
//This mean that filterbars that have this functionality wouldn't be able to save the state of the filterbar.
|
|
1149
1151
|
//Another option would be to create a new filterbar for each customer or site. This also has its drawbacks. Would raise it with the frontend community.
|
|
1150
|
-
const hasNonVisibleDefaultValues =
|
|
1152
|
+
const hasNonVisibleDefaultValues = updatedFilterDefinitionsValues.some(value => value.showInStarredMenu &&
|
|
1151
1153
|
!value.showInStarredMenu() &&
|
|
1152
1154
|
value.showInFilterBar &&
|
|
1153
1155
|
!value.showInFilterBar() &&
|
|
1154
1156
|
value.defaultValue?.toString &&
|
|
1155
1157
|
value.defaultValue.toString().length > 0);
|
|
1156
1158
|
if (initialFilterBarConfig === undefined || hasNonVisibleDefaultValues) {
|
|
1157
|
-
initialFilterBarConfig = createInitialState(name,
|
|
1159
|
+
initialFilterBarConfig = createInitialState(name, updatedFilterDefinitionsValues, initialState || {}, setValue);
|
|
1158
1160
|
}
|
|
1159
1161
|
// eslint-disable-next-line no-autofix/local-rules/prefer-custom-object-keys
|
|
1160
1162
|
Object.keys(initialFilterBarConfig.values).forEach(key => {
|
|
@@ -1162,6 +1164,28 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1162
1164
|
initialFilterBarConfig.setters[`set${capitalize(key)}`] = (callback) => setValue(key, callback);
|
|
1163
1165
|
});
|
|
1164
1166
|
return initialFilterBarConfig;
|
|
1167
|
+
}, [initialState, name, setValue, initialStoredFilters]);
|
|
1168
|
+
const dataLoaded = useCallback((loadedFilterDefinitionsValues) => {
|
|
1169
|
+
if (!loadAsync) {
|
|
1170
|
+
throw new Error("You must pass in loadAsync to useFilterBar when loading filter data asynchronously");
|
|
1171
|
+
}
|
|
1172
|
+
setInternalFilterBarDefinitions(loadedFilterDefinitionsValues);
|
|
1173
|
+
setFilterBarConfig(prev => loadData(objectValues(loadedFilterDefinitionsValues)));
|
|
1174
|
+
}, [loadAsync, loadData]);
|
|
1175
|
+
const [filterBarConfig, setFilterBarConfig] = useState(() => {
|
|
1176
|
+
let initialFilterBarConfig;
|
|
1177
|
+
if (!loadAsync) {
|
|
1178
|
+
initialFilterBarConfig = loadData(objectValues(internalFilterBarDefinitions));
|
|
1179
|
+
}
|
|
1180
|
+
else {
|
|
1181
|
+
initialFilterBarConfig = createInitialState(name, objectValues(internalFilterBarDefinitions), initialState || {}, setValue);
|
|
1182
|
+
// eslint-disable-next-line no-autofix/local-rules/prefer-custom-object-keys
|
|
1183
|
+
Object.keys(initialFilterBarConfig.values).forEach(key => {
|
|
1184
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1185
|
+
initialFilterBarConfig.setters[`set${capitalize(key)}`] = (callback) => setValue(key, callback);
|
|
1186
|
+
});
|
|
1187
|
+
}
|
|
1188
|
+
return initialFilterBarConfig;
|
|
1165
1189
|
});
|
|
1166
1190
|
useEffect(() => {
|
|
1167
1191
|
onValuesChange?.(filterBarConfig.values);
|
|
@@ -1175,7 +1199,7 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1175
1199
|
return filterBarConfig.name;
|
|
1176
1200
|
},
|
|
1177
1201
|
getFilterTitle(key) {
|
|
1178
|
-
return
|
|
1202
|
+
return internalFilterBarDefinitions[key]?.title ?? key;
|
|
1179
1203
|
},
|
|
1180
1204
|
arrayIncludesValue(key, value) {
|
|
1181
1205
|
const filter = filterBarConfig.values[key];
|
|
@@ -1220,11 +1244,11 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1220
1244
|
return filter?.value === value || false;
|
|
1221
1245
|
},
|
|
1222
1246
|
};
|
|
1223
|
-
}, [filterBarConfig.initialState, filterBarConfig.name, filterBarConfig.values,
|
|
1247
|
+
}, [filterBarConfig.initialState, filterBarConfig.name, filterBarConfig.values, internalFilterBarDefinitions]);
|
|
1224
1248
|
const filterMapActions = useMemo(() => {
|
|
1225
1249
|
// Reset an individual filter to its initial state
|
|
1226
1250
|
const resetIndividualFilterToInitialState = (key) => {
|
|
1227
|
-
const tmpInitialState = createInitialState(name,
|
|
1251
|
+
const tmpInitialState = createInitialState(name, objectValues(internalFilterBarDefinitions), initialState || {}, setValue);
|
|
1228
1252
|
setFilterBarConfig(prevState => {
|
|
1229
1253
|
return {
|
|
1230
1254
|
...prevState,
|
|
@@ -1441,19 +1465,20 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
|
|
|
1441
1465
|
setFilterBarConfig(prevState => {
|
|
1442
1466
|
return {
|
|
1443
1467
|
...prevState,
|
|
1444
|
-
values: createInitialState(name,
|
|
1468
|
+
values: createInitialState(name, objectValues(internalFilterBarDefinitions), initialState || {}, setValue).values,
|
|
1445
1469
|
};
|
|
1446
1470
|
});
|
|
1447
1471
|
},
|
|
1448
1472
|
resetIndividualFilterToInitialState,
|
|
1449
1473
|
};
|
|
1450
|
-
}, [
|
|
1474
|
+
}, [initialState, name, setValue, internalFilterBarDefinitions]);
|
|
1451
1475
|
return useMemo(() => {
|
|
1452
1476
|
return {
|
|
1453
1477
|
filterBarConfig: { ...filterBarConfig, ...filterMapActions, ...filterMapGetter },
|
|
1454
|
-
filterBarDefinition,
|
|
1478
|
+
filterBarDefinition: internalFilterBarDefinitions,
|
|
1479
|
+
dataLoaded,
|
|
1455
1480
|
};
|
|
1456
|
-
}, [filterBarConfig, filterMapActions, filterMapGetter,
|
|
1481
|
+
}, [filterBarConfig, filterMapActions, filterMapGetter, internalFilterBarDefinitions, dataLoaded]);
|
|
1457
1482
|
};
|
|
1458
1483
|
const getKeysOfUnequalProperties = (obj1, obj2) => {
|
|
1459
1484
|
return reduce(obj1, (result, value, key) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/filters-filter-bar",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.63",
|
|
4
4
|
"repository": "https://github.com/Trackunit/manager",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"engines": {
|
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
"tailwind-merge": "^2.0.0",
|
|
15
15
|
"string-ts": "^2.0.0",
|
|
16
16
|
"zod": "3.22.4",
|
|
17
|
-
"@trackunit/react-components": "1.1.
|
|
18
|
-
"@trackunit/react-core-hooks": "1.0.
|
|
19
|
-
"@trackunit/react-filter-components": "1.0.
|
|
20
|
-
"@trackunit/react-date-and-time-components": "1.0.
|
|
21
|
-
"@trackunit/shared-utils": "1.2.
|
|
22
|
-
"@trackunit/react-form-components": "1.0.
|
|
23
|
-
"@trackunit/react-core-contexts-api": "1.0.
|
|
24
|
-
"@trackunit/geo-json-utils": "1.0.
|
|
25
|
-
"@trackunit/i18n-library-translation": "1.0.
|
|
17
|
+
"@trackunit/react-components": "1.1.42",
|
|
18
|
+
"@trackunit/react-core-hooks": "1.0.41",
|
|
19
|
+
"@trackunit/react-filter-components": "1.0.63",
|
|
20
|
+
"@trackunit/react-date-and-time-components": "1.0.61",
|
|
21
|
+
"@trackunit/shared-utils": "1.2.33",
|
|
22
|
+
"@trackunit/react-form-components": "1.0.61",
|
|
23
|
+
"@trackunit/react-core-contexts-api": "1.0.41",
|
|
24
|
+
"@trackunit/geo-json-utils": "1.0.37",
|
|
25
|
+
"@trackunit/i18n-library-translation": "1.0.45"
|
|
26
26
|
},
|
|
27
27
|
"module": "./index.esm.js",
|
|
28
28
|
"main": "./index.cjs.js",
|
|
@@ -16,6 +16,10 @@ export interface FilterBarProps<TFilterBarDefinition extends FilterBarDefinition
|
|
|
16
16
|
* The filters that should potentially be used in the filter bar
|
|
17
17
|
*/
|
|
18
18
|
filterBarDefinition: TFilterBarDefinition;
|
|
19
|
+
/**
|
|
20
|
+
* Whether the filter bar should be loaded asynchronously
|
|
21
|
+
*/
|
|
22
|
+
loadAsync?: boolean;
|
|
19
23
|
}
|
|
20
24
|
/**
|
|
21
25
|
* Custom hook for managing a filter bar's state and actions.
|
|
@@ -23,7 +27,7 @@ export interface FilterBarProps<TFilterBarDefinition extends FilterBarDefinition
|
|
|
23
27
|
* @template TFilterBarDefinition - A generic type for the filter bar definition.
|
|
24
28
|
* @returns {object} An object containing filter bar configuration and actions.
|
|
25
29
|
*/
|
|
26
|
-
export declare const useFilterBar: <TFilterBarDefinition extends FilterBarDefinition>({ name, onValuesChange, filterBarDefinition, initialState, }: FilterBarProps<TFilterBarDefinition>) => {
|
|
30
|
+
export declare const useFilterBar: <TFilterBarDefinition extends FilterBarDefinition>({ name, onValuesChange, filterBarDefinition, initialState, loadAsync, }: FilterBarProps<TFilterBarDefinition>) => {
|
|
27
31
|
filterBarConfig: {
|
|
28
32
|
getFilterTitle: (key: string) => string;
|
|
29
33
|
getFilterBarName: () => string;
|
|
@@ -56,4 +60,5 @@ export declare const useFilterBar: <TFilterBarDefinition extends FilterBarDefini
|
|
|
56
60
|
setters: import("../types/FilterTypes").FilterStateSetters<TFilterBarDefinition>;
|
|
57
61
|
};
|
|
58
62
|
filterBarDefinition: TFilterBarDefinition;
|
|
63
|
+
dataLoaded: <TFilterBarDefinitionExtended extends TFilterBarDefinition>(loadedFilterDefinitionsValues: TFilterBarDefinitionExtended) => void;
|
|
59
64
|
};
|