@trackunit/filters-asset-filter-definitions 2.32.6 → 3.0.0

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 (30) hide show
  1. package/index.cjs.js +146 -144
  2. package/index.esm.js +90 -94
  3. package/migrations/entry.js.map +1 -0
  4. package/package.json +1 -1
  5. package/src/defaultFilters/defaults/AccessManagementModeFilter.d.ts +8 -7
  6. package/src/defaultFilters/defaults/ActivityFiltersView.d.ts +8 -7
  7. package/src/defaultFilters/defaults/CountryFilter/buildCountryOptions.d.ts +2 -4
  8. package/src/defaultFilters/defaults/CustomerIdsFilterView.d.ts +2 -2
  9. package/src/defaultFilters/defaults/InspectionTemplateAssignedFilter.d.ts +1 -1
  10. package/src/defaultFilters/defaults/LastInspectionResultFiltersView.d.ts +1 -1
  11. package/src/defaultFilters/defaults/LastPerformedInspectionFilterView.d.ts +1 -1
  12. package/src/defaultFilters/defaults/LastSeenFiltersView.d.ts +8 -7
  13. package/src/defaultFilters/defaults/MetadataCompletenessFilterView.d.ts +2 -2
  14. package/src/defaultFilters/defaults/NameFilterView.d.ts +2 -1
  15. package/src/defaultFilters/defaults/PeriodFilterView.d.ts +8 -7
  16. package/src/defaultFilters/defaults/RentalContractCustomerParentExternalReferenceFilterView.d.ts +2 -1
  17. package/src/defaultFilters/defaults/RentalContractCustomerParentNameFilterView.d.ts +2 -1
  18. package/src/defaultFilters/defaults/RentalContractOrderNumberFilterView.d.ts +2 -1
  19. package/src/defaultFilters/defaults/RentalContractReferenceCodeDescriptionFilterView.d.ts +2 -1
  20. package/src/defaultFilters/defaults/RentalContractReferenceCodeFilterView.d.ts +2 -1
  21. package/src/defaultFilters/defaults/SearchFilterInline.d.ts +2 -1
  22. package/src/defaultFilters/defaults/SiteStatusFilterView.d.ts +7 -6
  23. package/src/defaultFilters/defaults/SiteTypesFilterView.d.ts +12 -11
  24. package/src/defaultFilters/defaults/area/usePlacesSearch.d.ts +19 -129
  25. package/src/defaultFilters/defaults/test/summaryConnectionTestUtils.d.ts +16 -32
  26. package/src/hooks/useDefaultAssetFilterBarDefinition.d.ts +45 -43
  27. package/src/shared/ClearItemButton.d.ts +2 -2
  28. package/src/shared/FreeTextRecentSearchesFilterView.d.ts +2 -1
  29. package/src/shared/RecentSearchesFooter.d.ts +2 -2
  30. package/src/translation.d.ts +4 -7
package/index.cjs.js CHANGED
@@ -328,14 +328,13 @@ const AccessManagementModeFilterView = ({ filterDefinition, filterState, filterB
328
328
  }, [data?.assetSummary?.accessManagementModeDesired?.summary, t]);
329
329
  return (jsxRuntime.jsx(filtersFilterBar.DefaultCheckboxFilter, { filterBarActions: filterBarActions, filterDefinition: filterDefinition, filterState: filterState, loading: loading, options: accessManagementModes, setValue: setValue }));
330
330
  };
331
- exports.AccessManagementMode = void 0;
332
- (function (AccessManagementMode) {
333
- AccessManagementMode["UNLOCKED_FOR_ALL"] = "UNLOCKED_FOR_ALL";
334
- AccessManagementMode["UNLOCKED_FOR_KEY"] = "UNLOCKED_FOR_KEY";
335
- AccessManagementMode["LOCKED_FOR_ALL"] = "LOCKED_FOR_ALL";
336
- AccessManagementMode["UNSUPPORTED"] = "UNSUPPORTED";
337
- AccessManagementMode["UNKNOWN"] = "UNKNOWN";
338
- })(exports.AccessManagementMode || (exports.AccessManagementMode = {}));
331
+ const AccessManagementMode = {
332
+ UNLOCKED_FOR_ALL: "UNLOCKED_FOR_ALL",
333
+ UNLOCKED_FOR_KEY: "UNLOCKED_FOR_KEY",
334
+ LOCKED_FOR_ALL: "LOCKED_FOR_ALL",
335
+ UNSUPPORTED: "UNSUPPORTED",
336
+ UNKNOWN: "UNKNOWN",
337
+ };
339
338
  /**
340
339
  Access Management Mode filter definition
341
340
  It is a string array filter that filters assets based on their access management mode
@@ -4678,13 +4677,12 @@ const GetFleetRentalCustomerParentNameSummaryMissingDocument = {
4678
4677
  ],
4679
4678
  };
4680
4679
 
4681
- exports.AssetActivityState = void 0;
4682
- (function (AssetActivityState) {
4683
- AssetActivityState["Idling"] = "IDLING";
4684
- AssetActivityState["Stopped"] = "STOPPED";
4685
- AssetActivityState["Unknown"] = "UNKNOWN";
4686
- AssetActivityState["Working"] = "WORKING";
4687
- })(exports.AssetActivityState || (exports.AssetActivityState = {}));
4680
+ const AssetActivityState = {
4681
+ Idling: "IDLING",
4682
+ Stopped: "STOPPED",
4683
+ Unknown: "UNKNOWN",
4684
+ Working: "WORKING",
4685
+ };
4688
4686
  /**
4689
4687
  * Maps the activity state to a label id
4690
4688
  *
@@ -4693,13 +4691,13 @@ exports.AssetActivityState = void 0;
4693
4691
  */
4694
4692
  const mapActivityToLabelId = (state) => {
4695
4693
  switch (state) {
4696
- case exports.AssetActivityState.Working:
4694
+ case AssetActivityState.Working:
4697
4695
  return "assetFilters.activityFilter.working";
4698
- case exports.AssetActivityState.Idling:
4696
+ case AssetActivityState.Idling:
4699
4697
  return "assetFilters.activityFilter.idling";
4700
- case exports.AssetActivityState.Stopped:
4698
+ case AssetActivityState.Stopped:
4701
4699
  return "assetFilters.activityFilter.stopped";
4702
- case exports.AssetActivityState.Unknown:
4700
+ case AssetActivityState.Unknown:
4703
4701
  return "assetFilters.activityFilter.unknown";
4704
4702
  default:
4705
4703
  return "assetFilters.activityFilter.unknown";
@@ -4727,28 +4725,28 @@ const ActivityFiltersView = ({ filterBarActions, filterDefinition, filterState,
4727
4725
  const activity = data?.assetSummary?.activity;
4728
4726
  return (jsxRuntime.jsx(filtersFilterBar.DefaultCheckboxFilter, { filterBarActions: filterBarActions, filterDefinition: filterDefinition, filterState: filterState, loading: loading, options: [
4729
4727
  {
4730
- key: exports.AssetActivityState.Working,
4728
+ key: AssetActivityState.Working,
4731
4729
  label: t("assetFilters.activityFilter.working"),
4732
4730
  count: activity?.working,
4733
- prefix: jsxRuntime.jsx(utilizationIndicator.ActivityIndicator, { state: exports.AssetActivityState.Working, withBackground: false, withLabel: false }),
4731
+ prefix: jsxRuntime.jsx(utilizationIndicator.ActivityIndicator, { state: AssetActivityState.Working, withBackground: false, withLabel: false }),
4734
4732
  },
4735
4733
  {
4736
- key: exports.AssetActivityState.Idling,
4734
+ key: AssetActivityState.Idling,
4737
4735
  label: t("assetFilters.activityFilter.idling"),
4738
4736
  count: activity?.idling,
4739
- prefix: jsxRuntime.jsx(utilizationIndicator.ActivityIndicator, { state: exports.AssetActivityState.Idling, withBackground: false, withLabel: false }),
4737
+ prefix: jsxRuntime.jsx(utilizationIndicator.ActivityIndicator, { state: AssetActivityState.Idling, withBackground: false, withLabel: false }),
4740
4738
  },
4741
4739
  {
4742
- key: exports.AssetActivityState.Stopped,
4740
+ key: AssetActivityState.Stopped,
4743
4741
  label: t("assetFilters.activityFilter.stopped"),
4744
4742
  count: activity?.stopped,
4745
- prefix: jsxRuntime.jsx(utilizationIndicator.ActivityIndicator, { state: exports.AssetActivityState.Stopped, withBackground: false, withLabel: false }),
4743
+ prefix: jsxRuntime.jsx(utilizationIndicator.ActivityIndicator, { state: AssetActivityState.Stopped, withBackground: false, withLabel: false }),
4746
4744
  },
4747
4745
  {
4748
- key: exports.AssetActivityState.Unknown,
4746
+ key: AssetActivityState.Unknown,
4749
4747
  label: t("assetFilters.activityFilter.unknown"),
4750
4748
  count: activity?.unknown,
4751
- prefix: jsxRuntime.jsx(utilizationIndicator.ActivityIndicator, { state: exports.AssetActivityState.Unknown, withBackground: false, withLabel: false }),
4749
+ prefix: jsxRuntime.jsx(utilizationIndicator.ActivityIndicator, { state: AssetActivityState.Unknown, withBackground: false, withLabel: false }),
4752
4750
  },
4753
4751
  ], setValue: setValue, value: value }));
4754
4752
  };
@@ -5024,6 +5022,8 @@ const assetTypeConst = {
5024
5022
  VEHICLE: "VEHICLE",
5025
5023
  };
5026
5024
  const ALL_TYPES = sharedUtils.objectValues(assetTypeConst);
5025
+ const isAssetType = (value) => ALL_TYPES.some(type => type === value);
5026
+ const mapAssetTypeToLabelId = (value) => isAssetType(value) ? `assetFilters.assetType.${value}` : "assetFilters.unknown";
5027
5027
  /**
5028
5028
  * A filter view component for filtering asset types.
5029
5029
  *
@@ -5081,7 +5081,7 @@ const useAssetTypeFilter = ({ showTypes } = { showTypes: ALL_TYPES }) => {
5081
5081
  type: "stringArray",
5082
5082
  group: "METADATA",
5083
5083
  title: t("fleetlist.column.assetType"),
5084
- valueAsText: values => values.map(value => t(`assetFilters.assetType.${value}`)),
5084
+ valueAsText: values => values.map(value => t(mapAssetTypeToLabelId(value))),
5085
5085
  component: props => jsxRuntime.jsx(AssetTypesFilterView, { showTypes: showTypes, ...props }),
5086
5086
  };
5087
5087
  }, [showTypes, t]);
@@ -5723,7 +5723,7 @@ const useFacetLimitedOptions = (filterState, config) => {
5723
5723
  variables: { limit: FACET_FETCH_LIMIT, search: debouncedSearch, filters: config.scope(activeFilters) },
5724
5724
  });
5725
5725
  const options = react.useMemo(() => {
5726
- const items = data ? (config.read(data) ?? []) : [];
5726
+ const items = data !== undefined && data !== null ? (config.read(data) ?? []) : [];
5727
5727
  const facetOptions = items.map(item => config.toOption(item));
5728
5728
  return config.showCount === false ? facetOptions.map(option => ({ ...option, count: undefined })) : facetOptions;
5729
5729
  }, [config, data]);
@@ -5849,7 +5849,7 @@ const useCustomerHierarchy = (customerSummary) => {
5849
5849
  // Finalize and sort the hierarchy
5850
5850
  const finalRootOptions = Array.from(rootCustomerIds)
5851
5851
  .map(id => customerMap.get(id))
5852
- .filter(Boolean)
5852
+ .filter(sharedUtils.nonNullable)
5853
5853
  .sort((a, b) => a.label.localeCompare(b.label));
5854
5854
  finalRootOptions.forEach(option => assignLevelAndSort(option, 0));
5855
5855
  return finalRootOptions;
@@ -5864,13 +5864,15 @@ const useCustomerHierarchy = (customerSummary) => {
5864
5864
  * @param props - Filter properties including data, state, and actions.
5865
5865
  * @param props.customerId - The ID of the customer that owns the customers shown in the filter bar.
5866
5866
  * @param props.hasCount - Whether the filter should display the count for matching items.
5867
- * @returns {ReactElement} A customer ID filter component for rendering in the UI.
5867
+ * @returns {ReactElement | null} A customer ID filter component for rendering in the UI, or null when the filter definition is not a valueNameArray definition.
5868
5868
  */
5869
5869
  const CustomerIdsFilterView = ({ customerId, hasCount = true, ...props }) => {
5870
5870
  const { data, loading, customSearch } = useCustomerData(props.filterState.values, customerId);
5871
5871
  const hierarchicalOptions = useCustomerHierarchy(data?.assetSummary?.customers?.summary);
5872
- const valueNameArrayFilterDefinition = props.filterDefinition;
5873
- return (jsxRuntime.jsx(filtersFilterBar.HierarchicalCheckboxFilter, { cascadeSelection: true, customSearch: customSearch, filterBarActions: props.filterBarActions, filterDefinition: valueNameArrayFilterDefinition, filterState: props.filterState, loading: loading, options: hierarchicalOptions, setValue: props.setValue, showCount: hasCount, value: props.value }));
5872
+ if (props.filterDefinition.type !== "valueNameArray") {
5873
+ return null;
5874
+ }
5875
+ return (jsxRuntime.jsx(filtersFilterBar.HierarchicalCheckboxFilter, { cascadeSelection: true, customSearch: customSearch, filterBarActions: props.filterBarActions, filterDefinition: props.filterDefinition, filterState: props.filterState, loading: loading, options: hierarchicalOptions, setValue: props.setValue, showCount: hasCount, value: props.value }));
5874
5876
  };
5875
5877
  /**
5876
5878
  * Custom hook to create and configure a customer IDs filter definition.
@@ -6305,7 +6307,7 @@ const GroupIdsFilterView = (props) => {
6305
6307
  read: asGroupConnectionNode,
6306
6308
  toOption: node => ({
6307
6309
  key: node.group?.groupId || "unknown",
6308
- count: node.count || 0,
6310
+ count: node.count ?? 0,
6309
6311
  label: node.group?.name || t("machine.types.Unknown"),
6310
6312
  }),
6311
6313
  },
@@ -6714,7 +6716,7 @@ const InspectionTemplateAssignedFilter = (props) => {
6714
6716
  * Inspection template assigned filter definition. Applied to results via
6715
6717
  * `AssetFiltersInput.inspectionTemplateAssigned` (see `useActiveAssetFilters`).
6716
6718
  */
6717
- const useInspectionTemplateAssignedFilter = ({ isDefault } = {}) => {
6719
+ const useInspectionTemplateAssignedFilter = ({ isDefault, } = {}) => {
6718
6720
  const [t] = useTranslation();
6719
6721
  const result = react.useMemo(() => {
6720
6722
  return {
@@ -6817,7 +6819,7 @@ const LastInspectionResultFiltersView = (props) => {
6817
6819
  * @param root0.isDefault - When true, include in default filter bar configuration
6818
6820
  * @returns {StringArrayFilterDefinition} Filter definition for the asset filter bar
6819
6821
  */
6820
- const useLastInspectionResultFilter = ({ isDefault } = {}) => {
6822
+ const useLastInspectionResultFilter = ({ isDefault, } = {}) => {
6821
6823
  const [t] = useTranslation();
6822
6824
  const result = react.useMemo(() => {
6823
6825
  return {
@@ -6906,7 +6908,7 @@ const LastPerformedInspectionFilterView = (props) => {
6906
6908
  * `inspectionLastFilters.performed` (see `useActiveAssetFilters`); the schema exposes no
6907
6909
  * per-time-bucket summary, so options render without counts.
6908
6910
  */
6909
- const useLastPerformedInspectionFilter = ({ isDefault } = {}) => {
6911
+ const useLastPerformedInspectionFilter = ({ isDefault, } = {}) => {
6910
6912
  const [t] = useTranslation();
6911
6913
  const result = react.useMemo(() => {
6912
6914
  return {
@@ -6923,14 +6925,13 @@ const useLastPerformedInspectionFilter = ({ isDefault } = {}) => {
6923
6925
  };
6924
6926
 
6925
6927
  /** The time the asset was last seen. */
6926
- exports.AssetLastSeen = void 0;
6927
- (function (AssetLastSeen) {
6928
- AssetLastSeen["Last_7Days"] = "LAST_7_DAYS";
6929
- AssetLastSeen["Last_24Hours"] = "LAST_24_HOURS";
6930
- AssetLastSeen["Last_30Days"] = "LAST_30_DAYS";
6931
- AssetLastSeen["LastHour"] = "LAST_HOUR";
6932
- AssetLastSeen["OlderThan_30Days"] = "OLDER_THAN_30_DAYS";
6933
- })(exports.AssetLastSeen || (exports.AssetLastSeen = {}));
6928
+ const AssetLastSeen = {
6929
+ Last_7Days: "LAST_7_DAYS",
6930
+ Last_24Hours: "LAST_24_HOURS",
6931
+ Last_30Days: "LAST_30_DAYS",
6932
+ LastHour: "LAST_HOUR",
6933
+ OlderThan_30Days: "OLDER_THAN_30_DAYS",
6934
+ };
6934
6935
  /**
6935
6936
  * Represents the view component for the "Last Seen" filter.
6936
6937
  *
@@ -6947,7 +6948,7 @@ const LastSeenFiltersView = (props) => {
6947
6948
  });
6948
6949
  props.setValue(() => value);
6949
6950
  };
6950
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(filtersFilterBar.FilterHeader, { ...props.filterDefinition, ...props.filterBarActions, filterHasChanges: props.filterBarActions.appliedFilterKeys().includes(props.filterDefinition.filterKey) }), jsxRuntime.jsx(reactFilterComponents.FilterBody, { limitSize: true, children: jsxRuntime.jsxs(reactFormComponents.RadioGroup, { className: "pl-2 pr-2", id: "lastSeen", label: "", onChange: val => handleChange(val.currentTarget.value), value: props.value ?? "ALL", children: [jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.anytime"), value: "ALL" }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.lastHour"), value: exports.AssetLastSeen.LastHour }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.last24Hours"), value: exports.AssetLastSeen.Last_24Hours }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.last7Days"), value: exports.AssetLastSeen.Last_7Days }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.last30Days"), value: exports.AssetLastSeen.Last_30Days }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.olderThan30Days"), value: exports.AssetLastSeen.OlderThan_30Days })] }) })] }));
6951
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(filtersFilterBar.FilterHeader, { ...props.filterDefinition, ...props.filterBarActions, filterHasChanges: props.filterBarActions.appliedFilterKeys().includes(props.filterDefinition.filterKey) }), jsxRuntime.jsx(reactFilterComponents.FilterBody, { limitSize: true, children: jsxRuntime.jsxs(reactFormComponents.RadioGroup, { className: "pl-2 pr-2", id: "lastSeen", label: "", onChange: val => handleChange(val.currentTarget.value), value: props.value ?? "ALL", children: [jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.anytime"), value: "ALL" }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.lastHour"), value: AssetLastSeen.LastHour }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.last24Hours"), value: AssetLastSeen.Last_24Hours }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.last7Days"), value: AssetLastSeen.Last_7Days }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.last30Days"), value: AssetLastSeen.Last_30Days }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.lastSeenFilter.olderThan30Days"), value: AssetLastSeen.OlderThan_30Days })] }) })] }));
6951
6952
  };
6952
6953
  /**
6953
6954
  *
@@ -6961,19 +6962,19 @@ const useLastSeenFilter = () => {
6961
6962
  group: "STATUS",
6962
6963
  title: t("fleetlist.column.lastSeen"),
6963
6964
  valueAsText: value => {
6964
- if (value === exports.AssetLastSeen.LastHour) {
6965
+ if (value === AssetLastSeen.LastHour) {
6965
6966
  return t("assetFilters.lastSeenFilter.lastHour");
6966
6967
  }
6967
- else if (value === exports.AssetLastSeen.Last_24Hours) {
6968
+ else if (value === AssetLastSeen.Last_24Hours) {
6968
6969
  return t("assetFilters.lastSeenFilter.last24Hours");
6969
6970
  }
6970
- else if (value === exports.AssetLastSeen.Last_7Days) {
6971
+ else if (value === AssetLastSeen.Last_7Days) {
6971
6972
  return t("assetFilters.lastSeenFilter.last7Days");
6972
6973
  }
6973
- else if (value === exports.AssetLastSeen.Last_30Days) {
6974
+ else if (value === AssetLastSeen.Last_30Days) {
6974
6975
  return t("assetFilters.lastSeenFilter.last30Days");
6975
6976
  }
6976
- else if (value === exports.AssetLastSeen.OlderThan_30Days) {
6977
+ else if (value === AssetLastSeen.OlderThan_30Days) {
6977
6978
  return t("assetFilters.lastSeenFilter.olderThan30Days");
6978
6979
  }
6979
6980
  else {
@@ -7052,7 +7053,7 @@ const MetadataCompletenessFilterView = (props) => {
7052
7053
  /**
7053
7054
  * MetadataCompleteness filter definition
7054
7055
  */
7055
- const useMetadataCompletenessFilter = ({ isDefault } = {}) => {
7056
+ const useMetadataCompletenessFilter = ({ isDefault, } = {}) => {
7056
7057
  const [t] = useTranslation();
7057
7058
  const result = react.useMemo(() => {
7058
7059
  return {
@@ -7210,9 +7211,16 @@ const useFreeTextRecentSearches = ({ recentSearches, setRecentSearches, }) => {
7210
7211
  // eslint-disable-next-line @trackunit/require-component-prop-contracts -- renders a fragment (header + body) with no DOM root to attach these props to; fix in GLU-2699
7211
7212
  const FreeTextRecentSearchesFilterView = ({ filterBarActions, filterState, filterDefinition, localStorageKey, searchPlaceholder, }) => {
7212
7213
  const [t] = useTranslation();
7213
- const filterValue = filterDefinition?.filterKey ? String(filterState.values[filterDefinition.filterKey]) : undefined;
7214
+ const filterKey = filterDefinition?.filterKey;
7215
+ const filterValue = filterKey ? String(filterState.values[filterKey]) : undefined;
7214
7216
  const [searchString, setSearchString] = react.useState(filterValue ?? "");
7215
- const previousFilterValue = reactComponents.usePrevious(filterValue);
7217
+ const [syncedFilterValue, setSyncedFilterValue] = react.useState(filterValue);
7218
+ if (filterValue !== syncedFilterValue) {
7219
+ setSyncedFilterValue(filterValue);
7220
+ if (filterValue !== searchString && filterValue !== undefined) {
7221
+ setSearchString(filterValue);
7222
+ }
7223
+ }
7216
7224
  const { clientSideUserId } = reactCoreHooks.useCurrentUser();
7217
7225
  reactComponents.useDebounce(searchString, {
7218
7226
  delay: 500,
@@ -7223,19 +7231,11 @@ const FreeTextRecentSearchesFilterView = ({ filterBarActions, filterState, filte
7223
7231
  apply({ value: debouncedSearchString, setRecent: false });
7224
7232
  },
7225
7233
  });
7226
- react.useEffect(() => {
7227
- if (filterValue === searchString || previousFilterValue === filterValue) {
7228
- return;
7229
- }
7230
- if (filterValue !== undefined) {
7231
- setSearchString(filterValue);
7232
- }
7233
- }, [filterValue, previousFilterValue, searchString]);
7234
7234
  const localStorageProps = react.useMemo(() => ({
7235
7235
  defaultState: [],
7236
- key: `${localStorageKey}-${filterDefinition?.filterKey}-free-text-filter-recent-searches-${clientSideUserId}`,
7236
+ key: `${localStorageKey}-${filterKey}-free-text-filter-recent-searches-${clientSideUserId}`,
7237
7237
  schema: zod.z.array(zod.z.string()),
7238
- }), [localStorageKey, filterDefinition?.filterKey, clientSideUserId]);
7238
+ }), [localStorageKey, filterKey, clientSideUserId]);
7239
7239
  const [recentSearches, setRecentSearches] = reactComponents.useLocalStorage(localStorageProps);
7240
7240
  const { recentSearchesWithoutEmptyValues, rememberRecentSearch } = useFreeTextRecentSearches({
7241
7241
  recentSearches,
@@ -7245,11 +7245,11 @@ const FreeTextRecentSearchesFilterView = ({ filterBarActions, filterState, filte
7245
7245
  if (setRecent !== false) {
7246
7246
  rememberRecentSearch(value);
7247
7247
  }
7248
- if (filterDefinition?.filterKey) {
7249
- filterBarActions.setStringValue(filterDefinition.filterKey, value);
7248
+ if (filterKey) {
7249
+ filterBarActions.setStringValue(filterKey, value);
7250
7250
  }
7251
- }, [filterDefinition?.filterKey, filterBarActions, rememberRecentSearch]);
7252
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(filtersFilterBar.FilterHeader, { ...filterDefinition, ...filterBarActions, filterHasChanges: filterBarActions.appliedFilterKeys().includes(filterDefinition?.filterKey ?? ""), filterKey: filterDefinition?.filterKey ?? "", searchEnabled: true, searchProps: {
7251
+ }, [filterKey, filterBarActions, rememberRecentSearch]);
7252
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(filtersFilterBar.FilterHeader, { ...filterDefinition, ...filterBarActions, filterHasChanges: filterBarActions.appliedFilterKeys().includes(filterKey ?? ""), filterKey: filterKey ?? "", searchEnabled: true, searchProps: {
7253
7253
  onEnter: () => apply({ value: searchString, setRecent: true }),
7254
7254
  onChange: setSearchString,
7255
7255
  onClear: () => setSearchString(""),
@@ -7371,7 +7371,7 @@ const OwnerAccountIdsFilterView = (props) => {
7371
7371
  read: asOwnerAccountConnectionNode,
7372
7372
  toOption: node => ({
7373
7373
  key: node.ownerAccount?.accountId || "unknown",
7374
- count: node.count || 0,
7374
+ count: node.count ?? 0,
7375
7375
  label: node.ownerAccount?.name || t("machine.types.Unknown"),
7376
7376
  }),
7377
7377
  },
@@ -7428,25 +7428,24 @@ const usePartnerFilter = () => {
7428
7428
  return result;
7429
7429
  };
7430
7430
 
7431
- exports.DayPeriod = void 0;
7432
- (function (DayPeriod) {
7433
- DayPeriod["LAST_24_HOURS"] = "LAST_24_HOURS";
7434
- DayPeriod["LAST_7_DAYS"] = "LAST_7_DAYS";
7435
- DayPeriod["LAST_30_DAYS"] = "LAST_30_DAYS";
7436
- DayPeriod["LIFETIME"] = "LIFETIME";
7437
- DayPeriod["LAST_YEAR"] = "LAST_YEAR";
7438
- })(exports.DayPeriod || (exports.DayPeriod = {}));
7431
+ const DayPeriod = {
7432
+ LAST_24_HOURS: "LAST_24_HOURS",
7433
+ LAST_7_DAYS: "LAST_7_DAYS",
7434
+ LAST_30_DAYS: "LAST_30_DAYS",
7435
+ LIFETIME: "LIFETIME",
7436
+ LAST_YEAR: "LAST_YEAR",
7437
+ };
7439
7438
  const dayPeriodToTranslationKey = (value) => {
7440
7439
  switch (value) {
7441
- case exports.DayPeriod.LAST_24_HOURS:
7440
+ case DayPeriod.LAST_24_HOURS:
7442
7441
  return "assetFilters.periodFilter.LAST_24_HOURS";
7443
- case exports.DayPeriod.LAST_7_DAYS:
7442
+ case DayPeriod.LAST_7_DAYS:
7444
7443
  return "assetFilters.periodFilter.LAST_7_DAYS";
7445
- case exports.DayPeriod.LAST_30_DAYS:
7444
+ case DayPeriod.LAST_30_DAYS:
7446
7445
  return "assetFilters.periodFilter.LAST_30_DAYS";
7447
- case exports.DayPeriod.LIFETIME:
7446
+ case DayPeriod.LIFETIME:
7448
7447
  return "assetFilters.periodFilter.LIFETIME";
7449
- case exports.DayPeriod.LAST_YEAR:
7448
+ case DayPeriod.LAST_YEAR:
7450
7449
  return "assetFilters.periodFilter.LAST_YEAR";
7451
7450
  default:
7452
7451
  return sharedUtils.exhaustiveCheck(value);
@@ -7472,7 +7471,7 @@ const PeriodFilterView = (props) => {
7472
7471
  });
7473
7472
  props.setValue(() => value);
7474
7473
  };
7475
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(filtersFilterBar.FilterHeader, { ...props.filterDefinition, ...props.filterBarActions, filterHasChanges: props.filterBarActions.appliedFilterKeys().includes(props.filterDefinition.filterKey) }), jsxRuntime.jsx(reactFilterComponents.FilterBody, { limitSize: true, children: jsxRuntime.jsxs(reactFormComponents.RadioGroup, { id: "period", label: "", onChange: val => handleChange(val.currentTarget.value), value: props.value || "LAST_24_HOURS", children: [props.filterBarActions.getFilterBarName() !== "utilizationFilter" ? (jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LAST_24_HOURS"), value: exports.DayPeriod.LAST_24_HOURS })) : null, jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LAST_7_DAYS"), value: exports.DayPeriod.LAST_7_DAYS }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LAST_30_DAYS"), value: exports.DayPeriod.LAST_30_DAYS }), props.filterBarActions.getFilterBarName() === "fleetEmissionsFilter" && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LAST_YEAR"), value: exports.DayPeriod.LAST_YEAR }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LIFETIME"), value: exports.DayPeriod.LIFETIME })] }))] }) })] }));
7474
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(filtersFilterBar.FilterHeader, { ...props.filterDefinition, ...props.filterBarActions, filterHasChanges: props.filterBarActions.appliedFilterKeys().includes(props.filterDefinition.filterKey) }), jsxRuntime.jsx(reactFilterComponents.FilterBody, { limitSize: true, children: jsxRuntime.jsxs(reactFormComponents.RadioGroup, { id: "period", label: "", onChange: val => handleChange(val.currentTarget.value), value: props.value || "LAST_24_HOURS", children: [props.filterBarActions.getFilterBarName() !== "utilizationFilter" ? (jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LAST_24_HOURS"), value: DayPeriod.LAST_24_HOURS })) : null, jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LAST_7_DAYS"), value: DayPeriod.LAST_7_DAYS }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LAST_30_DAYS"), value: DayPeriod.LAST_30_DAYS }), props.filterBarActions.getFilterBarName() === "fleetEmissionsFilter" && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LAST_YEAR"), value: DayPeriod.LAST_YEAR }), jsxRuntime.jsx(reactFormComponents.RadioItem, { label: t("assetFilters.periodFilter.LIFETIME"), value: DayPeriod.LIFETIME })] }))] }) })] }));
7476
7475
  };
7477
7476
  /**
7478
7477
  *
@@ -7487,21 +7486,21 @@ const usePeriodFilter = () => {
7487
7486
  title: t("assetFilters.periodFilter.label"),
7488
7487
  valueAsText: value => {
7489
7488
  switch (value) {
7490
- case exports.DayPeriod.LAST_24_HOURS:
7489
+ case DayPeriod.LAST_24_HOURS:
7491
7490
  return t("assetFilters.periodFilter.LAST_24_HOURS");
7492
- case exports.DayPeriod.LAST_7_DAYS:
7491
+ case DayPeriod.LAST_7_DAYS:
7493
7492
  return t("assetFilters.periodFilter.LAST_7_DAYS");
7494
- case exports.DayPeriod.LAST_30_DAYS:
7493
+ case DayPeriod.LAST_30_DAYS:
7495
7494
  return t("assetFilters.periodFilter.LAST_30_DAYS");
7496
- case exports.DayPeriod.LIFETIME:
7495
+ case DayPeriod.LIFETIME:
7497
7496
  return t("assetFilters.periodFilter.LIFETIME");
7498
- case exports.DayPeriod.LAST_YEAR:
7497
+ case DayPeriod.LAST_YEAR:
7499
7498
  return t(dayPeriodToTranslationKey(value));
7500
7499
  default:
7501
7500
  return "";
7502
7501
  }
7503
7502
  },
7504
- defaultValue: exports.DayPeriod.LAST_7_DAYS,
7503
+ defaultValue: DayPeriod.LAST_7_DAYS,
7505
7504
  component: props => jsxRuntime.jsx(PeriodFilterView, { ...props }),
7506
7505
  };
7507
7506
  }, [t]);
@@ -7834,9 +7833,17 @@ const SearchFilterInline = ({ filterBarActions, filterState, filterDefinition, l
7834
7833
  const { logEvent } = reactCoreHooks.useAnalytics(filtersFilterBar.FilterEvents);
7835
7834
  const [t] = useTranslation();
7836
7835
  const { geometry, ref: searchElementRef } = reactComponents.useMeasure();
7837
- const filterValue = filterDefinition?.filterKey ? String(filterState.values[filterDefinition.filterKey]) : undefined;
7836
+ const filterKey = filterDefinition?.filterKey;
7837
+ const filterValue = filterKey ? String(filterState.values[filterKey]) : undefined;
7838
7838
  const [searchString, setSearchString] = react.useState(filterValue ?? "");
7839
- const previousFilterValue = reactComponents.usePrevious(filterValue);
7839
+ const [syncedFilterValue, setSyncedFilterValue] = react.useState(filterValue);
7840
+ if (filterValue !== syncedFilterValue) {
7841
+ // Catch a change in filter value from outside the component and update the search string to match
7842
+ setSyncedFilterValue(filterValue);
7843
+ if (filterValue !== searchString && filterValue !== undefined) {
7844
+ setSearchString(filterValue);
7845
+ }
7846
+ }
7840
7847
  const { clientSideUserId } = reactCoreHooks.useCurrentUser();
7841
7848
  reactComponents.useDebounce(searchString, {
7842
7849
  delay: 500,
@@ -7847,20 +7854,11 @@ const SearchFilterInline = ({ filterBarActions, filterState, filterDefinition, l
7847
7854
  apply({ value: debouncedSearchString, setRecent: false });
7848
7855
  },
7849
7856
  });
7850
- react.useEffect(() => {
7851
- // Catch a change in filter value from outside the component and update the search string to match
7852
- if (filterValue === searchString || previousFilterValue === filterValue) {
7853
- return;
7854
- }
7855
- if (filterValue !== undefined) {
7856
- setSearchString(filterValue);
7857
- }
7858
- }, [filterValue, previousFilterValue, searchString]);
7859
7857
  const localStorageProps = react.useMemo(() => ({
7860
7858
  defaultState: [],
7861
- key: `${localStorageKey}-${filterDefinition?.filterKey}-free-text-filter-recent-searches-${clientSideUserId}`,
7859
+ key: `${localStorageKey}-${filterKey}-free-text-filter-recent-searches-${clientSideUserId}`,
7862
7860
  schema: searchStringSchema,
7863
- }), [localStorageKey, filterDefinition?.filterKey, clientSideUserId]);
7861
+ }), [localStorageKey, filterKey, clientSideUserId]);
7864
7862
  const [recentSearches, setRecentSearches] = reactComponents.useLocalStorage(localStorageProps);
7865
7863
  const apply = react.useCallback(({ value, wasPreviousSearch = false, setRecent = true }) => {
7866
7864
  if (setRecent !== false) {
@@ -7877,10 +7875,10 @@ const SearchFilterInline = ({ filterBarActions, filterState, filterDefinition, l
7877
7875
  wasPreviousSearch: Boolean(wasPreviousSearch),
7878
7876
  },
7879
7877
  });
7880
- if (filterDefinition?.filterKey) {
7881
- filterBarActions.setStringValue(filterDefinition.filterKey, value);
7878
+ if (filterKey) {
7879
+ filterBarActions.setStringValue(filterKey, value);
7882
7880
  }
7883
- }, [filterDefinition?.filterKey, filterBarActions, logEvent, setRecentSearches]);
7881
+ }, [filterKey, filterBarActions, logEvent, setRecentSearches]);
7884
7882
  return (jsxRuntime.jsxs(reactComponents.Popover, { activation: defaultActivation => ({ ...defaultActivation, keyboardHandlers: false }), "data-testid": dataTestId ? `${dataTestId}-popover` : undefined, placement: "bottom-start", children: [jsxRuntime.jsx(reactComponents.PopoverTrigger, { children: jsxRuntime.jsx("div", { className: "flex-grow", "data-testid": "filters-menu-search-field-container", children: jsxRuntime.jsx(reactFormComponents.Search
7885
7883
  //TODO: [Buss] remove height restriction once baseinput sizes matches buttons
7886
7884
  , {
@@ -8113,13 +8111,12 @@ const useSiteIdsFilter = (props) => {
8113
8111
  };
8114
8112
 
8115
8113
  /** The states of a site */
8116
- exports.SiteStatus = void 0;
8117
- (function (SiteStatus) {
8118
- SiteStatus["Active"] = "ACTIVE";
8119
- SiteStatus["Archived"] = "ARCHIVED";
8120
- SiteStatus["Finished"] = "FINISHED";
8121
- SiteStatus["Planned"] = "PLANNED";
8122
- })(exports.SiteStatus || (exports.SiteStatus = {}));
8114
+ const SiteStatus = {
8115
+ Active: "ACTIVE",
8116
+ Archived: "ARCHIVED",
8117
+ Finished: "FINISHED",
8118
+ Planned: "PLANNED",
8119
+ };
8123
8120
  /**
8124
8121
  * A component that renders a checkbox filter view with site statuses.
8125
8122
  *
@@ -8128,7 +8125,7 @@ exports.SiteStatus = void 0;
8128
8125
  */
8129
8126
  const SiteStatusFilterView = (props) => {
8130
8127
  const [t] = useTranslation();
8131
- const shownStatus = [exports.SiteStatus.Active, exports.SiteStatus.Planned, exports.SiteStatus.Finished, exports.SiteStatus.Archived];
8128
+ const shownStatus = [SiteStatus.Active, SiteStatus.Planned, SiteStatus.Finished, SiteStatus.Archived];
8132
8129
  return (jsxRuntime.jsx(filtersFilterBar.DefaultCheckboxFilter, { ...props, options: shownStatus.map(value => ({
8133
8130
  key: value,
8134
8131
  label: t(mapSiteStatusToLabelId(value)),
@@ -8136,16 +8133,16 @@ const SiteStatusFilterView = (props) => {
8136
8133
  };
8137
8134
  const mapSiteStatusToLabelId = (status) => {
8138
8135
  switch (status) {
8139
- case exports.SiteStatus.Active:
8140
- case exports.SiteStatus.Finished:
8141
- case exports.SiteStatus.Archived:
8142
- case exports.SiteStatus.Planned:
8136
+ case SiteStatus.Active:
8137
+ case SiteStatus.Finished:
8138
+ case SiteStatus.Archived:
8139
+ case SiteStatus.Planned:
8143
8140
  return `siteFilters.siteStatus.${status}`;
8144
8141
  default:
8145
8142
  return "siteFilters.siteStatus.unknown";
8146
8143
  }
8147
8144
  };
8148
- const defaultValue = [exports.SiteStatus.Active.valueOf()];
8145
+ const defaultValue = [SiteStatus.Active.valueOf()];
8149
8146
  /**
8150
8147
  * SiteStatus filter definition
8151
8148
  *
@@ -8169,16 +8166,15 @@ const useSiteStatusFilter = (props) => {
8169
8166
  };
8170
8167
 
8171
8168
  /** The different types of a site for SFS */
8172
- exports.SiteTypeSFS = void 0;
8173
- (function (SiteTypeSFS) {
8174
- SiteTypeSFS["Area"] = "AREA";
8175
- SiteTypeSFS["ClassicPoi"] = "CLASSIC_POI";
8176
- SiteTypeSFS["ClassicZone"] = "CLASSIC_ZONE";
8177
- SiteTypeSFS["ConstructionSite"] = "CONSTRUCTION_SITE";
8178
- SiteTypeSFS["Depot"] = "DEPOT";
8179
- SiteTypeSFS["NotOnSite"] = "NOT_ON_SITE";
8180
- SiteTypeSFS["WorkPlace"] = "WORK_PLACE";
8181
- })(exports.SiteTypeSFS || (exports.SiteTypeSFS = {}));
8169
+ const SiteTypeSFS = {
8170
+ Area: "AREA",
8171
+ ClassicPoi: "CLASSIC_POI",
8172
+ ClassicZone: "CLASSIC_ZONE",
8173
+ ConstructionSite: "CONSTRUCTION_SITE",
8174
+ Depot: "DEPOT",
8175
+ NotOnSite: "NOT_ON_SITE",
8176
+ WorkPlace: "WORK_PLACE",
8177
+ };
8182
8178
  /**
8183
8179
  * Sorts the site type summary array in the correct order
8184
8180
  *
@@ -8187,13 +8183,13 @@ exports.SiteTypeSFS = void 0;
8187
8183
  */
8188
8184
  const sortSiteTypeSummary = (arr) => {
8189
8185
  const typeOrder = {
8190
- [exports.SiteTypeSFS.ConstructionSite]: 1,
8191
- [exports.SiteTypeSFS.Depot]: 2,
8192
- [exports.SiteTypeSFS.WorkPlace]: 3,
8193
- [exports.SiteTypeSFS.Area]: 4,
8194
- [exports.SiteTypeSFS.ClassicZone]: 5,
8195
- [exports.SiteTypeSFS.ClassicPoi]: 6,
8196
- [exports.SiteTypeSFS.NotOnSite]: 7,
8186
+ [SiteTypeSFS.ConstructionSite]: 1,
8187
+ [SiteTypeSFS.Depot]: 2,
8188
+ [SiteTypeSFS.WorkPlace]: 3,
8189
+ [SiteTypeSFS.Area]: 4,
8190
+ [SiteTypeSFS.ClassicZone]: 5,
8191
+ [SiteTypeSFS.ClassicPoi]: 6,
8192
+ [SiteTypeSFS.NotOnSite]: 7,
8197
8193
  };
8198
8194
  return [...arr].sort((a, b) => {
8199
8195
  const typeA = typeOrder[a.key];
@@ -8226,13 +8222,13 @@ const SiteTypesFilterView = (props) => {
8226
8222
  const key = summary.siteType;
8227
8223
  if (key) {
8228
8224
  output.push({
8229
- key: sharedUtils.enumFromValue(key, exports.SiteTypeSFS),
8225
+ key: sharedUtils.enumFromValue(key, SiteTypeSFS),
8230
8226
  count: summary.count,
8231
8227
  });
8232
8228
  }
8233
8229
  });
8234
8230
  if (props.filterBarActions.getFilterBarName() !== "assetFilters") {
8235
- return output.filter(SortSiteTypeSummary => SortSiteTypeSummary.key !== exports.SiteTypeSFS.NotOnSite);
8231
+ return output.filter(SortSiteTypeSummary => SortSiteTypeSummary.key !== SiteTypeSFS.NotOnSite);
8236
8232
  }
8237
8233
  return output;
8238
8234
  }, [data?.assetSummary?.siteTypes.summary, props.filterBarActions]);
@@ -8274,13 +8270,13 @@ const useSiteTypeFilter = ({ showInFilterBar, persistValue, group } = {
8274
8270
  };
8275
8271
  const mapSiteTypeToLabelId = (type) => {
8276
8272
  switch (type) {
8277
- case exports.SiteTypeSFS.Area:
8278
- case exports.SiteTypeSFS.ClassicPoi:
8279
- case exports.SiteTypeSFS.ClassicZone:
8280
- case exports.SiteTypeSFS.ConstructionSite:
8281
- case exports.SiteTypeSFS.WorkPlace:
8282
- case exports.SiteTypeSFS.Depot:
8283
- case exports.SiteTypeSFS.NotOnSite:
8273
+ case SiteTypeSFS.Area:
8274
+ case SiteTypeSFS.ClassicPoi:
8275
+ case SiteTypeSFS.ClassicZone:
8276
+ case SiteTypeSFS.ConstructionSite:
8277
+ case SiteTypeSFS.WorkPlace:
8278
+ case SiteTypeSFS.Depot:
8279
+ case SiteTypeSFS.NotOnSite:
8284
8280
  return `siteFilters.siteType.${type}`;
8285
8281
  default:
8286
8282
  return "siteFilters.siteType.unknown";
@@ -8697,15 +8693,19 @@ const useDefaultAssetFilterBarDefinition = () => {
8697
8693
  setupLibraryTranslations();
8698
8694
 
8699
8695
  exports.ALL_TYPES = ALL_TYPES;
8696
+ exports.AccessManagementMode = AccessManagementMode;
8700
8697
  exports.ActiveFilterFiltersView = ActiveFilterFiltersView;
8701
8698
  exports.ActivityFiltersView = ActivityFiltersView;
8702
8699
  exports.AreaView = AreaView;
8700
+ exports.AssetActivityState = AssetActivityState;
8703
8701
  exports.AssetIdsFiltersView = AssetIdsFiltersView;
8702
+ exports.AssetLastSeen = AssetLastSeen;
8704
8703
  exports.AssetTypesFilterView = AssetTypesFilterView;
8705
8704
  exports.BrandFilterView = BrandFilterView;
8706
8705
  exports.ClearItemButton = ClearItemButton;
8707
8706
  exports.CriticalityFiltersView = CriticalityFiltersView;
8708
8707
  exports.CustomerIdsFilterView = CustomerIdsFilterView;
8708
+ exports.DayPeriod = DayPeriod;
8709
8709
  exports.FollowedFiltersView = FollowedFiltersView;
8710
8710
  exports.FreeTextRecentSearchesFilterView = FreeTextRecentSearchesFilterView;
8711
8711
  exports.GetFleetGroupSummaryConnectionDocument = GetFleetGroupSummaryConnectionDocument;
@@ -8739,7 +8739,9 @@ exports.SearchFilterInline = SearchFilterInline;
8739
8739
  exports.ServicePanStatusesFiltersView = ServicePanStatusesFiltersView;
8740
8740
  exports.SiteDepotOwnershipIdsFilterView = SiteDepotOwnershipIdsFilterView;
8741
8741
  exports.SiteIdsFilterView = SiteIdsFilterView;
8742
+ exports.SiteStatus = SiteStatus;
8742
8743
  exports.SiteStatusFilterView = SiteStatusFilterView;
8744
+ exports.SiteTypeSFS = SiteTypeSFS;
8743
8745
  exports.SiteTypesFilterView = SiteTypesFilterView;
8744
8746
  exports.TelematicsConnectedFiltersView = TelematicsConnectedFiltersView;
8745
8747
  exports.TypesFilterView = TypesFilterView;