Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/elements/content-preview/ContentPreview.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ type Props = {
contentOpenWithProps: ContentOpenWithProps,
contentSidebarProps: ContentSidebarProps,
enableThumbnailsSidebar: boolean,
enableBoundingBoxHighlights: boolean,
features?: FeatureConfig,
fileId?: string,
fileOptions?: Object,
Expand Down Expand Up @@ -290,6 +291,7 @@ class ContentPreview extends React.PureComponent<Props, State> {
contentOpenWithProps: {},
contentSidebarProps: {},
enableThumbnailsSidebar: false,
enableBoundingBoxHighlights: false,
hasHeader: false,
hideSidebar: false,
language: DEFAULT_LOCALE,
Expand Down Expand Up @@ -895,6 +897,7 @@ class ContentPreview extends React.PureComponent<Props, State> {
annotatorState: { activeAnnotationId } = {},
renderCustomPreview,
enableThumbnailsSidebar,
enableBoundingBoxHighlights,
features,
fileOptions,
onAnnotatorEvent,
Expand Down Expand Up @@ -944,6 +947,7 @@ class ContentPreview extends React.PureComponent<Props, State> {
const previewOptions = {
advancedContentInsights, // will be removed once preview package will be updated to utilize feature flip for ACI
container: `#${this.id} .bcpr-content`,
enableBoundingBoxHighlights,
enableThumbnailsSidebar,
features,
fileOptions: fileOpts,
Expand Down
28 changes: 28 additions & 0 deletions src/elements/content-preview/__tests__/ContentPreview.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,34 @@ describe('elements/content-preview/ContentPreview', () => {
);
});

test('should pass enableBoundingBoxHighlights to preview options when enabled', async () => {
const wrapper = getWrapper({ ...props, enableBoundingBoxHighlights: true });
wrapper.setState({ file });
const instance = wrapper.instance();
await instance.loadPreview();
expect(instance.preview.show).toHaveBeenCalledWith(
file.id,
expect.any(Function),
expect.objectContaining({
enableBoundingBoxHighlights: true,
}),
);
});

test('should default enableBoundingBoxHighlights to false in preview options', async () => {
const wrapper = getWrapper(props);
wrapper.setState({ file });
const instance = wrapper.instance();
await instance.loadPreview();
expect(instance.preview.show).toHaveBeenCalledWith(
file.id,
expect.any(Function),
expect.objectContaining({
enableBoundingBoxHighlights: false,
}),
);
});

test('should call preview show with file version params if provided', async () => {
const wrapper = getWrapper(props);
wrapper.setState({
Expand Down
7 changes: 7 additions & 0 deletions src/elements/content-sidebar/MetadataInstanceEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {
MetadataInstanceForm,
type FormValues,
type JSONPatchOperations,
type MetadataTemplateField,
type MetadataTemplateInstance,
} from '@box/metadata-editor';
import { TaxonomyOptionsFetcher } from '@box/metadata-editor/lib/components/metadata-editor-fields/components/metadata-taxonomy-field/types.js';
Expand Down Expand Up @@ -34,6 +35,8 @@ export interface MetadataInstanceEditorProps {
template: MetadataTemplateInstance;
isAdvancedExtractAgentEnabled?: boolean;
isConfidenceScoreReviewEnabled?: boolean;
onSelectMetadataField?: (field: MetadataTemplateField | null) => void;
selectedMetadataFieldId?: string | null;
}

const MetadataInstanceEditor: React.FC<MetadataInstanceEditorProps> = ({
Expand All @@ -57,6 +60,8 @@ const MetadataInstanceEditor: React.FC<MetadataInstanceEditorProps> = ({
template,
isAdvancedExtractAgentEnabled = false,
isConfidenceScoreReviewEnabled = false,
onSelectMetadataField,
selectedMetadataFieldId,
}) => {
const previewContext: PreviewContextType | null = useContext(PreviewContext);
const customRef = previewContext?.previewBodyRef?.current;
Expand Down Expand Up @@ -84,6 +89,8 @@ const MetadataInstanceEditor: React.FC<MetadataInstanceEditorProps> = ({
taxonomyOptionsFetcher={taxonomyOptionsFetcher}
isAdvancedExtractAgentEnabled={isAdvancedExtractAgentEnabled}
isConfidenceScoreReviewEnabled={isConfidenceScoreReviewEnabled}
onSelectMetadataField={onSelectMetadataField}
selectedMetadataFieldId={selectedMetadataFieldId}
customRef={customRef}
/>
);
Expand Down
12 changes: 12 additions & 0 deletions src/elements/content-sidebar/MetadataSidebarRedesign.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
} from '@box/metadata-editor';
import { TreeQueryInput } from '@box/combobox-with-api';

import type { BoxAnnotationsBoundingBox } from './types/BoxAISidebarTypes';
import API from '../../api';
import SidebarContent from './SidebarContent';
import { withAPIContext } from '../common/api-context';
Expand All @@ -44,6 +45,7 @@ import { convertTemplateToTemplateInstance } from './utils/convertTemplateToTemp
import { isExtensionSupportedForMetadataSuggestions } from './utils/isExtensionSupportedForMetadataSuggestions';
import { metadataTaxonomyFetcher, metadataTaxonomyNodeAncestorsFetcher } from './fetchers/metadataTaxonomyFetcher';
import { useMetadataSidebarFilteredTemplates } from './hooks/useMetadataSidebarFilteredTemplates';
import useMetadataFieldSelection from './hooks/useMetadataFieldSelection';

const MARK_NAME_JS_READY = `${ORIGIN_METADATA_SIDEBAR_REDESIGN}_${EVENT_JS_READY}`;

Expand All @@ -59,6 +61,10 @@ interface PropsWithoutContext extends ExternalProps {
fileExtension?: string;
fileId: string;
filteredTemplateIds?: string[];
getPreview: () => {
showBoundingBoxHighlights?: (boundingBoxes: BoxAnnotationsBoundingBox[]) => void;
hideBoundingBoxHighlights?: () => void;
};
hasSidebarInitialized?: boolean;
}

Expand Down Expand Up @@ -89,6 +95,7 @@ function MetadataSidebarRedesign({
fileExtension,
fileId,
filteredTemplateIds = [],
getPreview,
history,
onError,
onSuccess,
Expand Down Expand Up @@ -127,6 +134,7 @@ function MetadataSidebarRedesign({
const [isUnsavedChangesModalOpen, setIsUnsavedChangesModalOpen] = useState<boolean>(false);
const [isDeleteButtonDisabled, setIsDeleteButtonDisabled] = useState<boolean>(false);
const [shouldShowOnlyReviewFields, setShouldShowOnlyReviewFields] = useState<boolean>(false);
const { selectedMetadataFieldId, handleSelectMetadataField } = useMetadataFieldSelection(getPreview);
const [appliedTemplateInstances, setAppliedTemplateInstances] =
useState<Array<MetadataTemplateInstance | MetadataTemplate>>(templateInstances);
const [pendingTemplateToEdit, setPendingTemplateToEdit] = useState<MetadataTemplateInstance | null>(null);
Expand Down Expand Up @@ -332,6 +340,8 @@ function MetadataSidebarRedesign({
template={editingTemplate}
isAdvancedExtractAgentEnabled={isAdvancedExtractAgentEnabled}
isConfidenceScoreReviewEnabled={isConfidenceScoreReviewEnabled}
onSelectMetadataField={handleSelectMetadataField}
selectedMetadataFieldId={selectedMetadataFieldId}
/>
)}
{showList && (
Expand All @@ -345,6 +355,8 @@ function MetadataSidebarRedesign({
setIsDeleteButtonDisabled(false);
setShouldShowOnlyReviewFields(shouldEnableReviewFilter);
}}
onSelectMetadataField={handleSelectMetadataField}
selectedMetadataFieldId={selectedMetadataFieldId}
templateInstances={templateInstancesList}
taxonomyNodeFetcher={taxonomyNodeFetcher}
isConfidenceScoreReviewEnabled={isConfidenceScoreReviewEnabled}
Expand Down
1 change: 1 addition & 0 deletions src/elements/content-sidebar/SidebarPanels.js
Original file line number Diff line number Diff line change
Expand Up @@ -490,6 +490,7 @@ class SidebarPanels extends React.Component<Props, State> {
? match.params.filteredTemplateIds.split(',')
: []
}
getPreview={getPreview}
hasSidebarInitialized={isInitialized}
isBoxAiSuggestionsEnabled={isMetadataAiSuggestionsEnabled}
ref={this.metadataSidebar}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,18 @@ import {
type MetadataSidebarRedesignProps,
} from '../MetadataSidebarRedesign';
import useSidebarMetadataFetcher, { STATUS } from '../hooks/useSidebarMetadataFetcher';
import useMetadataFieldSelection from '../hooks/useMetadataFieldSelection';

jest.mock('../hooks/useSidebarMetadataFetcher');
const mockUseSidebarMetadataFetcher = useSidebarMetadataFetcher as jest.MockedFunction<
typeof useSidebarMetadataFetcher
>;

jest.mock('../hooks/useMetadataFieldSelection');
const mockUseMetadataFieldSelection = useMetadataFieldSelection as jest.MockedFunction<
typeof useMetadataFieldSelection
>;

const getStructuredTextRep = jest.fn().mockResolvedValue('structured-text-rep');
const api = {
options: {
Expand Down Expand Up @@ -117,6 +123,11 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
};

beforeEach(() => {
mockUseMetadataFieldSelection.mockReturnValue({
selectedMetadataFieldId: null,
handleSelectMetadataField: jest.fn(),
});

mockUseSidebarMetadataFetcher.mockReturnValue({
clearExtractError: jest.fn(),
extractSuggestions: jest.fn(),
Expand Down Expand Up @@ -500,4 +511,11 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
expect(createSessionRequest).not.toHaveBeenCalledTimes(1);
expect(createSessionRequest).not.toHaveBeenCalledWith({ items: [{ id: undefined }] }, undefined);
});

test('should pass getPreview to useMetadataFieldSelection', () => {
const getPreview = jest.fn();
renderComponent({ getPreview });

expect(mockUseMetadataFieldSelection).toHaveBeenCalledWith(getPreview);
});
});
14 changes: 14 additions & 0 deletions src/elements/content-sidebar/__tests__/clampPercentage.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import clampPercentage from '../utils/clampPercentage';

describe('clampPercentage', () => {
test.each([
[50, 50],
[0, 0],
[100, 100],
[-0.5, 0],
[100.5, 100],
[99.999, 99.999],
])('clampPercentage(%s) should return %s', (input, expected) => {
expect(clampPercentage(input)).toBe(expected);
});
});
Loading
Loading