From 6973ee4ed32e6bc3ec9b64853acd3292f282775f Mon Sep 17 00:00:00 2001 From: Advitya Gemawat Date: Wed, 24 Jan 2024 16:24:40 -0500 Subject: [PATCH] Flyout Bounding Box legend & accessibility fixes (#2497) * added bb legend * added tokens variables * localization & accessibility fixes * simplified stack * refactor * refactor * refactor * new file component refactor * auto lint fixes --- .../Controls/DetectionDetails.tsx | 51 ++++++++++++ .../Controls/FlyoutObjectDetection.tsx | 81 ++++++++----------- .../Controls/FlyoutObjectDetectionUtils.tsx | 41 +++++++++- libs/localization/src/lib/en.json | 1 + 4 files changed, 123 insertions(+), 51 deletions(-) create mode 100644 libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/DetectionDetails.tsx diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/DetectionDetails.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/DetectionDetails.tsx new file mode 100644 index 0000000000..2daf59ebcb --- /dev/null +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/DetectionDetails.tsx @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { Stack, Text } from "@fluentui/react"; +import { IVisionListItem } from "@responsible-ai/core-ui"; +import { localization } from "@responsible-ai/localization"; +import React from "react"; + +import { stackTokens } from "./FlyoutObjectDetectionUtils"; + +interface IDetectionDetailsProps { + item: IVisionListItem; // replace with actual type + correctDetections: string; + incorrectDetections: string; +} +export class DetectionDetails extends React.Component { + public render(): React.ReactNode { + return ( + + + + + {localization.InterpretVision.Dashboard.indexLabel} + {this.props.item?.index} + + + + + {localization.InterpretVision.Dashboard.correctDetections} + {this.props.correctDetections} + + + + + {localization.InterpretVision.Dashboard.incorrectDetections} + {this.props.incorrectDetections} + + + + ); + } +} diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/FlyoutObjectDetection.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/FlyoutObjectDetection.tsx index d32c30cdc6..87eec60108 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/FlyoutObjectDetection.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/FlyoutObjectDetection.tsx @@ -7,6 +7,7 @@ import { IComboBox, IComboBoxOption, Image, + Label, List, Panel, PanelType, @@ -24,6 +25,7 @@ import * as FlyoutStyles from "../utils/FlyoutUtils"; import { getObjectDetectionImageAltText } from "../utils/getAltTextUtils"; import { getJoinedLabelString } from "../utils/labelUtils"; +import { DetectionDetails } from "./DetectionDetails"; import { flyoutStyles, explanationImage, @@ -122,42 +124,11 @@ export class FlyoutObjectDetection extends React.Component< verticalAlign="center" > - - - - - {localization.InterpretVision.Dashboard.indexLabel} - {item?.index} - - - - - { - localization.InterpretVision.Dashboard - .correctDetections - } - {correctDetections} - - - - - { - localization.InterpretVision.Dashboard - .incorrectDetections - } - {incorrectDetections} - - - + @@ -173,13 +144,17 @@ export class FlyoutObjectDetection extends React.Component< {localization.InterpretVision.Dashboard.panelInformation} - + + @@ -200,17 +175,27 @@ export class FlyoutObjectDetection extends React.Component< - { - - } + + {!this.props.loadingExplanation[item.index][ +this.state.odSelectedKey.slice( diff --git a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/FlyoutObjectDetectionUtils.tsx b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/FlyoutObjectDetectionUtils.tsx index 192a05e0aa..6de3e33643 100644 --- a/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/FlyoutObjectDetectionUtils.tsx +++ b/libs/interpret-vision/src/lib/VisionExplanationDashboard/Controls/FlyoutObjectDetectionUtils.tsx @@ -1,9 +1,10 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -import { IComboBoxOption, getTheme } from "@fluentui/react"; +import { IComboBoxOption, getTheme, Stack, Text } from "@fluentui/react"; import { IDataset, IVisionListItem } from "@responsible-ai/core-ui"; import { localization } from "@responsible-ai/localization"; +import React from "react"; import { CanvasTools } from "vott-ct"; import { Editor } from "vott-ct/lib/js/CanvasTools/CanvasTools.Editor"; import { RegionData } from "vott-ct/lib/js/CanvasTools/Core/RegionData"; @@ -31,6 +32,42 @@ export const stackTokens = { large: { childrenGap: "l2" }, medium: { childrenGap: "l1" } }; + +const theme = getTheme(); + +export class ColorLegend extends React.Component { + public render(): React.ReactNode { + return ( + + + + {localization.InterpretVision.Dashboard.trueY} + +
+ + + + {localization.InterpretVision.Dashboard.predictedY} + +
+ + + ); + } +} + export const ExcessLabelLen = localization.InterpretVision.Dashboard.prefix.length; @@ -109,8 +146,6 @@ export function drawBoundingBoxes( return; } - const theme = getTheme(); - // Ensuring object detection labels are populated if ( !dataset.object_detection_predicted_y || diff --git a/libs/localization/src/lib/en.json b/libs/localization/src/lib/en.json index c9d6c44baa..4f98babeb2 100644 --- a/libs/localization/src/lib/en.json +++ b/libs/localization/src/lib/en.json @@ -1477,6 +1477,7 @@ "multiselect": "Multiselect", "notdefined": "object scenario not defined", "objectSelect": "Object Selection", + "objectSelectionLabel": "objectSelectLabel", "pageSize": "Page size: ", "panelTitle": "Selected instance", "panelExplanation": "Explanation",