Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(metadata-sidebar): pass areAiSuggestionsAvailable based on file ext #3675

Merged
merged 20 commits into from
Oct 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
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
10 changes: 2 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,7 @@
"last 2 Edge versions",
"last 2 iOS versions"
],
"development": [
"last 1 Chrome versions",
"last 1 Firefox versions",
"last 1 Safari versions"
]
"development": ["last 1 Chrome versions", "last 1 Firefox versions", "last 1 Safari versions"]
},
"husky": {
"hooks": {
Expand Down Expand Up @@ -370,8 +366,6 @@
}
},
"msw": {
"workerDirectory": [
".storybook/public"
]
"workerDirectory": [".storybook/public"]
}
}
23 changes: 14 additions & 9 deletions src/elements/content-sidebar/MetadataInstanceEditor.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {
AutofillContextProvider,
AutofillContextProviderProps,
MetadataInstanceForm,
type FormValues,
type JSONPatchOperations,
Expand All @@ -8,48 +9,52 @@ import {
import React from 'react';

export interface MetadataInstanceEditorProps {
areAiSuggestionsAvailable: boolean;
fetchSuggestions: AutofillContextProviderProps['fetchSuggestions'];
isBoxAiSuggestionsEnabled: boolean;
isDeleteButtonDisabled: boolean;
isUnsavedChangesModalOpen: boolean;
onCancel: () => void;
onDelete: (metadataInstance: MetadataTemplateInstance) => void;
template: MetadataTemplateInstance;
onDiscardUnsavedChanges: () => void;
onSubmit: (values: FormValues, operations: JSONPatchOperations) => Promise<void>;
setIsUnsavedChangesModalOpen: (isUnsavedChangesModalOpen: boolean) => void;
onDiscardUnsavedChanges: () => void;
template: MetadataTemplateInstance;
}

const MetadataInstanceEditor: React.FC<MetadataInstanceEditorProps> = ({
areAiSuggestionsAvailable,
fetchSuggestions,
isBoxAiSuggestionsEnabled,
isDeleteButtonDisabled,
isUnsavedChangesModalOpen,
onCancel,
onDelete,
onDiscardUnsavedChanges,
onSubmit,
setIsUnsavedChangesModalOpen,
template,
onCancel,
onDiscardUnsavedChanges,
}) => {
const handleCancel = () => {
onCancel();
};

return (
<AutofillContextProvider
fetchSuggestions={() => Promise.resolve([])}
fetchSuggestions={fetchSuggestions}
isAiSuggestionsFeatureEnabled={isBoxAiSuggestionsEnabled}
>
<MetadataInstanceForm
areAiSuggestionsAvailable={true}
areAiSuggestionsAvailable={areAiSuggestionsAvailable}
isAiSuggestionsFeatureEnabled={isBoxAiSuggestionsEnabled}
isDeleteButtonDisabled={isDeleteButtonDisabled}
isUnsavedChangesModalOpen={isUnsavedChangesModalOpen}
selectedTemplateInstance={template}
onCancel={handleCancel}
onSubmit={onSubmit}
setIsUnsavedChangesModalOpen={setIsUnsavedChangesModalOpen}
onDelete={onDelete}
onDiscardUnsavedChanges={onDiscardUnsavedChanges}
onSubmit={onSubmit}
selectedTemplateInstance={template}
setIsUnsavedChangesModalOpen={setIsUnsavedChangesModalOpen}
/>
</AutofillContextProvider>
);
Expand Down
17 changes: 14 additions & 3 deletions src/elements/content-sidebar/MetadataSidebarRedesign.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@ import { type WithLoggerProps } from '../../common/types/logging';

import messages from '../common/messages';
import './MetadataSidebarRedesign.scss';
import MetadataInstanceEditor from './MetadataInstanceEditor';
import MetadataInstanceEditor, { MetadataInstanceEditorProps } from './MetadataInstanceEditor';
import { convertTemplateToTemplateInstance } from './utils/convertTemplateToTemplateInstance';
import { isExtensionSupportedForMetadataSuggestions } from './utils/isExtensionSupportedForMetadataSuggestions';

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

Expand Down Expand Up @@ -172,6 +173,14 @@ function MetadataSidebarRedesign({ api, elementId, fileId, onError, isFeatureEna
const showEmptyState = !showLoading && showTemplateInstances && templateInstances.length === 0 && !editingTemplate;
const showEditor = !showEmptyState && editingTemplate;
const showList = !showEditor && templateInstances.length > 0 && !editingTemplate;
const areAiSuggestionsAvailable = isExtensionSupportedForMetadataSuggestions(file?.extension ?? '');
const fetchSuggestions = React.useCallback<MetadataInstanceEditorProps['fetchSuggestions']>(
async (templateKey, fields) => {
// should use getIntelligenceAPI().extractStructured
return fields;
},
[],
);

return (
<SidebarContent
Expand All @@ -189,15 +198,17 @@ function MetadataSidebarRedesign({ api, elementId, fileId, onError, isFeatureEna
)}
{editingTemplate && (
<MetadataInstanceEditor
areAiSuggestionsAvailable={areAiSuggestionsAvailable}
fetchSuggestions={fetchSuggestions}
isBoxAiSuggestionsEnabled={isBoxAiSuggestionsEnabled}
isDeleteButtonDisabled={isDeleteButtonDisabled}
isUnsavedChangesModalOpen={isUnsavedChangesModalOpen}
onCancel={handleCancel}
onDelete={handleDeleteInstance}
onDiscardUnsavedChanges={handleDiscardUnsavedChanges}
onSubmit={handleSubmit}
onDelete={handleDeleteInstance}
template={editingTemplate}
setIsUnsavedChangesModalOpen={setIsUnsavedChangesModalOpen}
template={editingTemplate}
/>
)}
{showList && (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,17 @@ describe('MetadataInstanceEditor', () => {
};

const defaultProps: MetadataInstanceEditorProps = {
areAiSuggestionsAvailable: true,
fetchSuggestions: jest.fn(),
isBoxAiSuggestionsEnabled: true,
isDeleteButtonDisabled: false,
isUnsavedChangesModalOpen: false,
template: mockMetadataTemplate,
onCancel: mockOnCancel,
onDelete: jest.fn(),
onDiscardUnsavedChanges: mockOnDiscardUnsavedChanges,
onSubmit: jest.fn(),
setIsUnsavedChangesModalOpen: mockSetIsUnsavedChangesModalOpen,
onDiscardUnsavedChanges: mockOnDiscardUnsavedChanges,
template: mockMetadataTemplate,
};

test('should render MetadataInstanceForm with correct props', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ export const SwitchEditingTemplateInstances: StoryObj<typeof MetadataSidebarRede
expect(templateMetadataOptionBAfterSwitch).toHaveAttribute('aria-disabled');
},
};

export const MetadataInstanceEditorAIEnabled: StoryObj<typeof MetadataSidebarRedesign> = {
args: {
features: {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* @file Metadata suggestions supported extensions
* @author Box
*/

const SUPPORTED_FILE_EXTENSIONS = new Set([
// Text-Based Documents
'as',
'as3',
'asm',
'bat',
'c',
'cc',
'cmake',
'cpp',
'cs',
'css',
'csv',
'cxx',
'diff',
'doc',
'docx',
'erb',
'gdoc',
'groovy',
'gsheet',
'h',
'haml',
'hh',
'htm',
'html',
'java',
'js',
'json',
'less',
'log',
'm',
'make',
'md',
'ml',
'mm',
'msg',
'ods',
'odt',
'pages',
'pdf',
'php',
'pl',
'properties',
'py',
'rb',
'rst',
'rtf',
'sass',
'scala',
'scm',
'script',
'sh',
'sml',
'sql',
'txt',
'vi',
'vim',
'webdoc',
'wpd',
'xhtml',
'xls',
'xlsb',
'xlsm',
'xlsx',
'xml',
'xsd',
'xsl',
'xbd',
'xdw',
'yaml',
// Presentations
'gslide',
'gslides',
'key',
'odp',
'ppt',
'pptx',
]);

export function isExtensionSupportedForMetadataSuggestions(extension: string): boolean {
return SUPPORTED_FILE_EXTENSIONS.has(extension);
}
12 changes: 10 additions & 2 deletions src/test-utils/testing-library.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,16 @@ import { FeatureProvider } from '../elements/common/feature-checking';

jest.unmock('react-intl');

const Wrapper = ({ children, features = {}, isAiSuggestionsFeatureEnabled = false, fetchSuggestions = () => Promise.resolve([]) }) => (
<AutofillContextProvider isAiSuggestionsFeatureEnabled={isAiSuggestionsFeatureEnabled} fetchSuggestions={fetchSuggestions}>
const Wrapper = ({
children,
features = {},
isAiSuggestionsFeatureEnabled = false,
fetchSuggestions = () => Promise.resolve([]),
}) => (
<AutofillContextProvider
isAiSuggestionsFeatureEnabled={isAiSuggestionsFeatureEnabled}
fetchSuggestions={fetchSuggestions}
>
<FeatureProvider features={features}>
<TooltipProvider>
<IntlProvider locale="en">{children}</IntlProvider>
Expand Down
Loading