Skip to content

Commit c604547

Browse files
authored
feat(metadata-sidebar): Use error code prop in MetadataInstanceEditor (#3921)
* feat(metadata-sidebar): Use error code prop in MetadataInstanceEditor * feat(metadata-sidebar): Fix tests * feat(metadata-sidebar): Throw error if not specified status * feat(metadata-sidebar): Add clear error callback * feat(metadata-editor): Fix storybook test * feat(metadata-editor): Fix storybook test
1 parent 4c0116f commit c604547

File tree

9 files changed

+128
-27
lines changed

9 files changed

+128
-27
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
"@box/frontend": "^10.0.0",
131131
"@box/item-icon": "^0.9.58",
132132
"@box/languages": "^1.0.0",
133-
"@box/metadata-editor": "^0.88.1",
133+
"@box/metadata-editor": "0.91.0",
134134
"@box/react-virtualized": "9.22.3-rc-box.9",
135135
"@cfaester/enzyme-adapter-react-18": "^0.8.0",
136136
"@chromatic-com/storybook": "^1.6.1",

src/constants.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ export const ERROR_CODE_UNEXPECTED_EXCEPTION = 'unexpected_exception_error';
324324
export const ERROR_CODE_SEARCH = 'search_error';
325325
export const ERROR_CODE_METADATA_QUERY = 'metadata_query_error';
326326
export const ERROR_CODE_METADATA_STRUCTURED_TEXT_REP = 'metadata_structured_text_rep_error';
327+
export const ERROR_CODE_METADATA_AUTOFILL_TIMEOUT = 'metadata_autofill_timeout_error';
328+
export const ERROR_CODE_METADATA_PRECONDITION_FAILED = 'metadata_precondition_failed_error';
327329
export const ERROR_CODE_UNKNOWN = 'unknown_error';
328330

329331
/* ------------------ Origins ---------------------- */

src/elements/content-sidebar/MetadataInstanceEditor.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,15 @@ import {
88
type PaginationQueryInput,
99
} from '@box/metadata-editor';
1010
import React from 'react';
11+
import {
12+
ERROR_CODE_METADATA_AUTOFILL_TIMEOUT,
13+
ERROR_CODE_UNKNOWN,
14+
ERROR_CODE_METADATA_PRECONDITION_FAILED,
15+
} from '../../constants';
1116

1217
export interface MetadataInstanceEditorProps {
1318
areAiSuggestionsAvailable: boolean;
19+
errorCode?: ERROR_CODE_METADATA_AUTOFILL_TIMEOUT | ERROR_CODE_METADATA_PRECONDITION_FAILED | ERROR_CODE_UNKNOWN;
1420
isBetaLanguageEnabled: boolean;
1521
isBoxAiSuggestionsEnabled: boolean;
1622
isDeleteButtonDisabled: boolean;
@@ -32,6 +38,7 @@ export interface MetadataInstanceEditorProps {
3238

3339
const MetadataInstanceEditor: React.FC<MetadataInstanceEditorProps> = ({
3440
areAiSuggestionsAvailable,
41+
errorCode,
3542
isBetaLanguageEnabled,
3643
isBoxAiSuggestionsEnabled,
3744
isDeleteButtonDisabled,
@@ -47,6 +54,7 @@ const MetadataInstanceEditor: React.FC<MetadataInstanceEditorProps> = ({
4754
return (
4855
<MetadataInstanceForm
4956
areAiSuggestionsAvailable={areAiSuggestionsAvailable}
57+
errorCode={errorCode}
5058
isAiSuggestionsFeatureEnabled={isBoxAiSuggestionsEnabled}
5159
isBetaLanguageEnabled={isBetaLanguageEnabled}
5260
isDeleteButtonDisabled={isDeleteButtonDisabled}

src/elements/content-sidebar/MetadataSidebarRedesign.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,14 @@ function MetadataSidebarRedesign({
9292
getStructuredTextRep,
9393
}: MetadataSidebarRedesignProps) {
9494
const {
95+
clearExtractError,
9596
extractSuggestions,
9697
file,
9798
handleCreateMetadataInstance,
9899
handleDeleteMetadataInstance,
99100
handleUpdateMetadataInstance,
100101
templates,
102+
extractErrorCode,
101103
errorMessage,
102104
status,
103105
templateInstances,
@@ -156,6 +158,8 @@ function MetadataSidebarRedesign({
156158
}, [editingTemplate, templateInstances, templateInstances.length]);
157159

158160
const handleTemplateSelect = (selectedTemplate: MetadataTemplate) => {
161+
clearExtractError();
162+
159163
if (editingTemplate) {
160164
setPendingTemplateToEdit(convertTemplateToTemplateInstance(file, selectedTemplate));
161165
setIsUnsavedChangesModalOpen(true);
@@ -166,6 +170,7 @@ function MetadataSidebarRedesign({
166170
};
167171

168172
const handleCancel = () => {
173+
clearExtractError();
169174
setEditingTemplate(null);
170175
};
171176

@@ -189,6 +194,7 @@ function MetadataSidebarRedesign({
189194
} catch {
190195
// ignore error, handled in useSidebarMetadataFetcher
191196
}
197+
clearExtractError();
192198
setEditingTemplate(null);
193199
};
194200

@@ -279,6 +285,7 @@ function MetadataSidebarRedesign({
279285
{editingTemplate && (
280286
<MetadataInstanceEditor
281287
areAiSuggestionsAvailable={areAiSuggestionsAvailable}
288+
errorCode={extractErrorCode}
282289
isBetaLanguageEnabled={isBetaLanguageEnabled}
283290
isBoxAiSuggestionsEnabled={isBoxAiSuggestionsEnabled}
284291
isDeleteButtonDisabled={isDeleteButtonDisabled}

src/elements/content-sidebar/__tests__/MetadataSidebarRedesign.test.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
118118

119119
beforeEach(() => {
120120
mockUseSidebarMetadataFetcher.mockReturnValue({
121+
clearExtractError: jest.fn(),
121122
extractSuggestions: jest.fn(),
122123
handleCreateMetadataInstance: jest.fn(),
123124
handleDeleteMetadataInstance: jest.fn(),
@@ -127,6 +128,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
127128
errorMessage: null,
128129
status: STATUS.SUCCESS,
129130
file: mockFile,
131+
extractErrorCode: null,
130132
});
131133
});
132134

@@ -142,6 +144,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
142144

143145
test('should have accessible "All templates" combobox trigger button', () => {
144146
mockUseSidebarMetadataFetcher.mockReturnValue({
147+
clearExtractError: jest.fn(),
145148
extractSuggestions: jest.fn(),
146149
handleCreateMetadataInstance: jest.fn(),
147150
handleDeleteMetadataInstance: jest.fn(),
@@ -151,6 +154,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
151154
errorMessage: null,
152155
status: STATUS.SUCCESS,
153156
file: mockFile,
157+
extractErrorCode: null,
154158
});
155159

156160
renderComponent();
@@ -184,6 +188,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
184188

185189
test('should have accessible "All templates" combobox trigger button', () => {
186190
mockUseSidebarMetadataFetcher.mockReturnValue({
191+
clearExtractError: jest.fn(),
187192
extractSuggestions: jest.fn(),
188193
handleCreateMetadataInstance: jest.fn(),
189194
handleDeleteMetadataInstance: jest.fn(),
@@ -193,6 +198,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
193198
errorMessage: null,
194199
status: STATUS.SUCCESS,
195200
file: mockFile,
201+
extractErrorCode: null,
196202
});
197203

198204
renderComponent();
@@ -204,6 +210,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
204210

205211
test('should render metadata sidebar with error', async () => {
206212
mockUseSidebarMetadataFetcher.mockReturnValue({
213+
clearExtractError: jest.fn(),
207214
extractSuggestions: jest.fn(),
208215
handleCreateMetadataInstance: jest.fn(),
209216
handleDeleteMetadataInstance: jest.fn(),
@@ -216,6 +223,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
216223
},
217224
status: STATUS.ERROR,
218225
file: mockFile,
226+
extractErrorCode: null,
219227
});
220228

221229
const errorMessage = { id: 'error', defaultMessage: 'error message' };
@@ -227,6 +235,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
227235

228236
test('should render metadata sidebar with loading indicator', async () => {
229237
mockUseSidebarMetadataFetcher.mockReturnValue({
238+
clearExtractError: jest.fn(),
230239
extractSuggestions: jest.fn(),
231240
handleCreateMetadataInstance: jest.fn(),
232241
handleDeleteMetadataInstance: jest.fn(),
@@ -236,6 +245,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
236245
errorMessage: null,
237246
status: STATUS.LOADING,
238247
file: mockFile,
248+
extractErrorCode: null,
239249
});
240250

241251
renderComponent();
@@ -266,6 +276,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
266276

267277
test('should render empty state when no visible template instances are present', () => {
268278
mockUseSidebarMetadataFetcher.mockReturnValue({
279+
clearExtractError: jest.fn(),
269280
extractSuggestions: jest.fn(),
270281
handleCreateMetadataInstance: jest.fn(),
271282
handleDeleteMetadataInstance: jest.fn(),
@@ -275,6 +286,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
275286
errorMessage: null,
276287
status: STATUS.SUCCESS,
277288
file: mockFile,
289+
extractErrorCode: null,
278290
});
279291

280292
renderComponent();
@@ -288,6 +300,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
288300

289301
test('should render metadata instance list when templates are present', () => {
290302
mockUseSidebarMetadataFetcher.mockReturnValue({
303+
clearExtractError: jest.fn(),
291304
extractSuggestions: jest.fn(),
292305
handleCreateMetadataInstance: jest.fn(),
293306
handleDeleteMetadataInstance: jest.fn(),
@@ -297,6 +310,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
297310
errorMessage: null,
298311
status: STATUS.SUCCESS,
299312
file: mockFile,
313+
extractErrorCode: null,
300314
});
301315

302316
renderComponent();
@@ -311,6 +325,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
311325

312326
test('should render filter dropdown when more than one templates are present', () => {
313327
mockUseSidebarMetadataFetcher.mockReturnValue({
328+
clearExtractError: jest.fn(),
314329
extractSuggestions: jest.fn(),
315330
handleCreateMetadataInstance: jest.fn(),
316331
handleDeleteMetadataInstance: jest.fn(),
@@ -320,6 +335,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
320335
errorMessage: null,
321336
status: STATUS.SUCCESS,
322337
file: mockFile,
338+
extractErrorCode: null,
323339
});
324340

325341
renderComponent();
@@ -337,6 +353,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
337353
'should not render filter dropdown when only one or none visible template is present',
338354
(templateInstances: MetadataTemplateInstance[]) => {
339355
mockUseSidebarMetadataFetcher.mockReturnValue({
356+
clearExtractError: jest.fn(),
340357
extractSuggestions: jest.fn(),
341358
handleCreateMetadataInstance: jest.fn(),
342359
handleDeleteMetadataInstance: jest.fn(),
@@ -346,6 +363,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
346363
errorMessage: null,
347364
status: STATUS.SUCCESS,
348365
file: mockFile,
366+
extractErrorCode: null,
349367
});
350368

351369
renderComponent();
@@ -356,6 +374,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
356374

357375
test('should render metadata filterd instance list when fileterd templates are present and matching', () => {
358376
mockUseSidebarMetadataFetcher.mockReturnValue({
377+
clearExtractError: jest.fn(),
359378
extractSuggestions: jest.fn(),
360379
handleCreateMetadataInstance: jest.fn(),
361380
handleDeleteMetadataInstance: jest.fn(),
@@ -365,6 +384,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
365384
errorMessage: null,
366385
status: STATUS.SUCCESS,
367386
file: mockFile,
387+
extractErrorCode: null,
368388
});
369389

370390
const filteredTemplateIds = [mockVisibleTemplateInstance.id];
@@ -378,6 +398,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
378398

379399
test('should render metadata unfiltered instance list when fileterd templates are present and do not match existing templates', () => {
380400
mockUseSidebarMetadataFetcher.mockReturnValue({
401+
clearExtractError: jest.fn(),
381402
extractSuggestions: jest.fn(),
382403
handleCreateMetadataInstance: jest.fn(),
383404
handleDeleteMetadataInstance: jest.fn(),
@@ -387,6 +408,7 @@ describe('elements/content-sidebar/Metadata/MetadataSidebarRedesign', () => {
387408
errorMessage: null,
388409
status: STATUS.SUCCESS,
389410
file: mockFile,
411+
extractErrorCode: null,
390412
});
391413

392414
const filteredTemplateIds = ['non-existing-template-id'];

0 commit comments

Comments
 (0)