@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 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 filterDefinitionsValues = react.useMemo(() => sharedUtils.objectValues(filterBarDefinition), [filterBarDefinition]);
1135
- const [filterBarConfig, setFilterBarConfig] = react.useState(() => {
1136
+ const [initialStoredFilters] = react.useState(() => localStorage.getItem(`filter-${name}`) || "{}");
1137
+ const loadData = react.useCallback((updatedFilterDefinitionsValues) => {
1136
1138
  let initialFilterBarConfig;
1137
- const storedFilters = localStorage.getItem(`filter-${name}`);
1139
+ const storedFilters = initialStoredFilters;
1138
1140
  if (storedFilters && storedFilters !== "undefined") {
1139
1141
  const loadedFilterBarConfig = JSON.parse(storedFilters);
1140
- if (validateFilter(loadedFilterBarConfig, filterDefinitionsValues)) {
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 = filterDefinitionsValues.some(value => value.showInStarredMenu &&
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, filterDefinitionsValues, initialState || {}, setValue);
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 filterBarDefinition[key]?.title ?? key;
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, filterBarDefinition]);
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, filterDefinitionsValues, initialState || {}, setValue);
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, filterDefinitionsValues, initialState || {}, setValue).values,
1470
+ values: createInitialState(name, sharedUtils.objectValues(internalFilterBarDefinitions), initialState || {}, setValue).values,
1447
1471
  };
1448
1472
  });
1449
1473
  },
1450
1474
  resetIndividualFilterToInitialState,
1451
1475
  };
1452
- }, [filterDefinitionsValues, initialState, name, setValue]);
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, filterBarDefinition]);
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 filterDefinitionsValues = useMemo(() => objectValues(filterBarDefinition), [filterBarDefinition]);
1133
- const [filterBarConfig, setFilterBarConfig] = useState(() => {
1134
+ const [initialStoredFilters] = useState(() => localStorage.getItem(`filter-${name}`) || "{}");
1135
+ const loadData = useCallback((updatedFilterDefinitionsValues) => {
1134
1136
  let initialFilterBarConfig;
1135
- const storedFilters = localStorage.getItem(`filter-${name}`);
1137
+ const storedFilters = initialStoredFilters;
1136
1138
  if (storedFilters && storedFilters !== "undefined") {
1137
1139
  const loadedFilterBarConfig = JSON.parse(storedFilters);
1138
- if (validateFilter(loadedFilterBarConfig, filterDefinitionsValues)) {
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 = filterDefinitionsValues.some(value => value.showInStarredMenu &&
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, filterDefinitionsValues, initialState || {}, setValue);
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 filterBarDefinition[key]?.title ?? key;
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, filterBarDefinition]);
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, filterDefinitionsValues, initialState || {}, setValue);
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, filterDefinitionsValues, initialState || {}, setValue).values,
1468
+ values: createInitialState(name, objectValues(internalFilterBarDefinitions), initialState || {}, setValue).values,
1445
1469
  };
1446
1470
  });
1447
1471
  },
1448
1472
  resetIndividualFilterToInitialState,
1449
1473
  };
1450
- }, [filterDefinitionsValues, initialState, name, setValue]);
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, filterBarDefinition]);
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.59",
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.38",
18
- "@trackunit/react-core-hooks": "1.0.37",
19
- "@trackunit/react-filter-components": "1.0.59",
20
- "@trackunit/react-date-and-time-components": "1.0.57",
21
- "@trackunit/shared-utils": "1.2.29",
22
- "@trackunit/react-form-components": "1.0.57",
23
- "@trackunit/react-core-contexts-api": "1.0.37",
24
- "@trackunit/geo-json-utils": "1.0.33",
25
- "@trackunit/i18n-library-translation": "1.0.41"
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
  };