diff --git a/src/components/Filters/types/String.js b/src/components/Filters/types/String.js index 02a25365..00c93fc2 100644 --- a/src/components/Filters/types/String.js +++ b/src/components/Filters/types/String.js @@ -1,7 +1,6 @@ import { observer } from "mobx-react"; import React from "react"; import { FilterInput } from "../FilterInput"; -import { VariantSelect } from "./List"; const BaseInput = observer(({ value, onChange, placeholder }) => { return ( @@ -46,10 +45,4 @@ export const StringFilter = [ valueType: "single", input: (props) => , }, - { - key: "similar_to", - label: "similar to", - valueType: "list", - input: (props) => , - }, ]; diff --git a/src/stores/DataStores/tasks.js b/src/stores/DataStores/tasks.js index 1ea7c0e1..fdd76210 100644 --- a/src/stores/DataStores/tasks.js +++ b/src/stores/DataStores/tasks.js @@ -7,6 +7,7 @@ import { DynamicModel, registerModel } from "../DynamicModel"; import { CustomJSON } from "../types"; import { FF_DEV_2536, FF_LOPS_E_3, isFF } from "../../utils/feature-flags"; +const SIMILARITY_UPPER_LIMIT_PRECISION = 1000; const fileAttributes = types.model({ "certainty": types.optional(types.maybeNull(types.number), 0), "distance": types.optional(types.maybeNull(types.number), 0), @@ -218,17 +219,19 @@ export const create = (columns) => { }, postProcessData(data) { - const { total_annotations, total_predictions } = data; + const { total_annotations, total_predictions, similarity_score_upper_limit } = data; if (total_annotations !== null) self.totalAnnotations = total_annotations; if (total_predictions !== null) self.totalPredictions = total_predictions; + if (!isNaN(similarity_score_upper_limit)) + self.similarityUpperLimit = (Math.ceil(similarity_score_upper_limit * SIMILARITY_UPPER_LIMIT_PRECISION) / SIMILARITY_UPPER_LIMIT_PRECISION); }, })) .preProcessSnapshot((snapshot) => { - const { total_annotations, total_predictions, ...sn } = snapshot; + const { total_annotations, total_predictions, similarity_score_upper_limit, ...sn } = snapshot; return { ...sn, @@ -239,6 +242,7 @@ export const create = (columns) => { })), totalAnnotations: total_annotations, totalPredictions: total_predictions, + similarityUpperLimit: similarity_score_upper_limit, }; }); }; diff --git a/src/stores/Tabs/tab.js b/src/stores/Tabs/tab.js index 72b81e54..204f61ee 100644 --- a/src/stores/Tabs/tab.js +++ b/src/stores/Tabs/tab.js @@ -16,8 +16,10 @@ import { TabSelectedItems } from "./tab_selected_items"; import { History } from '../../utils/history'; import { FF_DEV_1470, FF_LOPS_12, isFF } from "../../utils/feature-flags"; import { CustomJSON, StringOrNumberID, ThresholdType } from "../types"; +import { clamp } from "../../utils/helpers"; -const DEFAULT_THRESHOLD = { min: 0, max: 10 }; +const THRESHOLD_MIN = 0; +const THRESHOLD_MIN_DIFF = 0.001; export const Tab = types .model("View", { @@ -53,7 +55,7 @@ export const Tab = types editable: true, deletable: true, semantic_search: types.optional(types.array(CustomJSON), []), - threshold: types.optional(ThresholdType, DEFAULT_THRESHOLD), + threshold: types.optional(types.maybeNull(ThresholdType), null), }) .volatile(() => { const defaultWidth = getComputedStyle(document.body).getPropertyValue("--menu-sidebar-width").replace("px", "").trim(); @@ -218,7 +220,7 @@ export const Tab = types columnsDisplayType: self.columnsDisplayType.toPOJO(), gridWidth: self.gridWidth, semantic_search: self.semantic_search?.toJSON() ?? [], - threshold: self.threshold?.toJSON() ?? DEFAULT_THRESHOLD, + threshold: self.threshold?.toJSON(), }; if (self.saved || apiVersion === 1) { @@ -305,14 +307,30 @@ export const Tab = types self.selected = ids; }, - setSemanticSearch(semanticSearchList) { + setSemanticSearch(semanticSearchList, min, max) { self.semantic_search = semanticSearchList ?? []; - return self.save(); + /* if no semantic search we have to clean up threshold */ + if (self.semantic_search.length === 0) { + self.threshold = null; + return self.save(); + } + /* if we have a min and max we need to make sure we save that too. + this prevents firing 2 view save requests to accomplish the same thing */ + return ( !isNaN(min) && !isNaN(max) ) ? self.setSemanticSearchThreshold(min, max) : self.save(); }, - setSemanticSearchThreshold(min, max) { - self.threshold = { min, max }; - return self.save(); + setSemanticSearchThreshold(_min, max) { + const min = clamp(_min ?? THRESHOLD_MIN, THRESHOLD_MIN, max - THRESHOLD_MIN_DIFF); + + if (self.semantic_search?.length && !isNaN(min) && !isNaN(max)) { + self.threshold = { min, max }; + return self.save(); + } + }, + + clearSemanticSearchThreshold(save = true) { + self.threshold = null; + return save && self.save(); }, selectAll() { @@ -381,6 +399,8 @@ export const Tab = types } else if (isFF(FF_LOPS_12) && self.root.SDK.type === 'labelops') { yield self.dataStore.reload({ query: self.query, interaction }); } + + getRoot(self).SDK.invoke("tabReloaded", self); }), deleteFilter(filter) { diff --git a/src/stores/types.js b/src/stores/types.js index 0c18ed0a..28d7c70d 100644 --- a/src/stores/types.js +++ b/src/stores/types.js @@ -58,6 +58,6 @@ export const HtmlOrReact = types.custom({ }); export const ThresholdType = types.model("ThresholdType", { - min: types.number, - max: types.number, + min: types.maybeNull(types.number), + max: types.maybeNull(types.number), }); \ No newline at end of file