fix(fe): save numeric range filter when saving view

fix(fe): save numeric range filter when saving view
This commit is contained in:
andrewwallacespeckle
2025-10-06 16:50:01 +01:00
committed by GitHub
4 changed files with 35 additions and 32 deletions
@@ -25,7 +25,8 @@ import {
SortMode, SortMode,
type DataSlice, type DataSlice,
type QueryCriteria, type QueryCriteria,
type ExtendedPropertyInfo type ExtendedPropertyInfo,
type SerializedFilterData
} from '~/lib/viewer/helpers/filters/types' } from '~/lib/viewer/helpers/filters/types'
import { getConditionLabel } from '~/lib/viewer/helpers/filters/constants' import { getConditionLabel } from '~/lib/viewer/helpers/filters/constants'
import { useFilteringDataStore } from '~/lib/viewer/composables/filtering/dataStore' import { useFilteringDataStore } from '~/lib/viewer/composables/filtering/dataStore'
@@ -705,13 +706,7 @@ export function useFilterUtilities(
// Store filters that need to be restored once data store is ready // Store filters that need to be restored once data store is ready
const pendingFiltersToRestore = ref<{ const pendingFiltersToRestore = ref<{
filters: Array<{ filters: SerializedFilterData[]
key: string | null
isApplied: boolean
selectedValues: string[]
id: string
condition: FilterCondition
}>
activeColorFilterId: string | null activeColorFilterId: string | null
filterLogic?: FilterLogic filterLogic?: FilterLogic
} | null>(null) } | null>(null)
@@ -720,13 +715,7 @@ export function useFilterUtilities(
* Restores filters from serialized state * Restores filters from serialized state
*/ */
const restoreFilters = async ( const restoreFilters = async (
serializedFilters: Array<{ serializedFilters: SerializedFilterData[],
key: string | null
isApplied: boolean
selectedValues: string[]
id: string
condition: FilterCondition
}>,
activeColorFilterId: string | null, activeColorFilterId: string | null,
filterLogic?: FilterLogic filterLogic?: FilterLogic
) => { ) => {
@@ -764,13 +753,7 @@ export function useFilterUtilities(
* Actually applies the filters once we have the property data * Actually applies the filters once we have the property data
*/ */
const applyFiltersFromSerialized = ( const applyFiltersFromSerialized = (
serializedFilters: Array<{ serializedFilters: SerializedFilterData[],
key: string | null
isApplied: boolean
selectedValues: string[]
id: string
condition: FilterCondition
}>,
availableProperties: ExtendedPropertyInfo[] availableProperties: ExtendedPropertyInfo[]
) => { ) => {
for (const serializedFilter of serializedFilters) { for (const serializedFilter of serializedFilters) {
@@ -787,6 +770,14 @@ export function useFilterUtilities(
updateActiveFilterValues(filterId, serializedFilter.selectedValues) updateActiveFilterValues(filterId, serializedFilter.selectedValues)
} }
if (serializedFilter.numericRange) {
setNumericRange(
filterId,
serializedFilter.numericRange.min,
serializedFilter.numericRange.max
)
}
if (!serializedFilter.isApplied) { if (!serializedFilter.isApplied) {
toggleFilterApplied(filterId) toggleFilterApplied(filterId)
} }
@@ -13,7 +13,10 @@ import {
import { useFilterUtilities } from '~/lib/viewer/composables/filtering/filtering' import { useFilterUtilities } from '~/lib/viewer/composables/filtering/filtering'
import { useFilteringDataStore } from '~/lib/viewer/composables/filtering/dataStore' import { useFilteringDataStore } from '~/lib/viewer/composables/filtering/dataStore'
import { CameraController, SectionTool, VisualDiffMode } from '@speckle/viewer' import { CameraController, SectionTool, VisualDiffMode } from '@speckle/viewer'
import type { FilterLogic, FilterCondition } from '~/lib/viewer/helpers/filters/types' import type {
FilterLogic,
SerializedFilterData
} from '~/lib/viewer/helpers/filters/types'
import type { Merge, PartialDeep } from 'type-fest' import type { Merge, PartialDeep } from 'type-fest'
import { import {
defaultMeasurementOptions, defaultMeasurementOptions,
@@ -97,7 +100,9 @@ export function useStateSerialization() {
isApplied: filterData.isApplied, isApplied: filterData.isApplied,
selectedValues: filterData.selectedValues, selectedValues: filterData.selectedValues,
id: filterData.id, id: filterData.id,
condition: filterData.condition condition: filterData.condition,
numericRange:
filterData.type === 'numeric' ? filterData.numericRange : undefined
})) }))
return { return {
@@ -298,13 +303,7 @@ export function useApplySerializedState() {
if (filters.propertyFilters?.length) { if (filters.propertyFilters?.length) {
restoreFilters( restoreFilters(
filters.propertyFilters as Array<{ filters.propertyFilters as SerializedFilterData[],
key: string | null
isApplied: boolean
selectedValues: string[]
id: string
condition: FilterCondition
}>,
filters.activeColorFilterId, filters.activeColorFilterId,
filters.filterLogic as FilterLogic filters.filterLogic as FilterLogic
) )
@@ -215,3 +215,12 @@ export type ColorGroup = {
value: string value: string
color: string color: string
} }
export type SerializedFilterData = {
key: Nullable<string>
isApplied: boolean
selectedValues: string[]
id: string
condition: FilterCondition
numericRange?: { min: number; max: number }
}
+5 -1
View File
@@ -69,8 +69,10 @@ export interface SectionBoxData {
* v1.6 -> 1.7 * v1.6 -> 1.7
* - ui.filters.filterLogic added * - ui.filters.filterLogic added
* - ui.filters.propertyFilters.condition updated * - ui.filters.propertyFilters.condition updated
* v1.7 -> 1.8
* - ui.filters.propertyFilters.numericRange added
*/ */
export const SERIALIZED_VIEWER_STATE_VERSION = 1.7 export const SERIALIZED_VIEWER_STATE_VERSION = 1.8
export type SerializedViewerState = { export type SerializedViewerState = {
projectId: string projectId: string
@@ -117,6 +119,7 @@ export type SerializedViewerState = {
selectedValues: string[] selectedValues: string[]
id: string id: string
condition: string condition: string
numericRange?: { min: number; max: number }
}> }>
activeColorFilterId: Nullable<string> activeColorFilterId: Nullable<string>
filterLogic: string filterLogic: string
@@ -283,6 +286,7 @@ const initializeMissingData = (state: UnformattedState): SerializedViewerState =
selectedValues: string[] selectedValues: string[]
id: string id: string
condition: string condition: string
numericRange?: { min: number; max: number }
}> = [] }> = []
// If new propertyFilters exist and are not empty, use them // If new propertyFilters exist and are not empty, use them