box-ui-elements 23.4.0-beta.12 → 23.4.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/explorer.css +1 -1
  2. package/dist/explorer.js +1 -1
  3. package/dist/picker.js +1 -1
  4. package/dist/preview.css +1 -1
  5. package/dist/preview.js +1 -1
  6. package/dist/sidebar.css +1 -1
  7. package/dist/sidebar.js +1 -1
  8. package/dist/uploader.js +1 -1
  9. package/es/api/schemas/AiAgentReference.js +2 -0
  10. package/es/api/schemas/AiAgentReference.js.flow +15 -0
  11. package/es/api/schemas/AiAgentReference.js.map +1 -0
  12. package/es/api/schemas/AiExtractStructured.js +1 -0
  13. package/es/api/schemas/AiExtractStructured.js.flow +7 -1
  14. package/es/api/schemas/AiExtractStructured.js.map +1 -1
  15. package/es/elements/common/upload-dialog/UploadDialog.js +1 -0
  16. package/es/elements/common/upload-dialog/UploadDialog.js.flow +1 -0
  17. package/es/elements/common/upload-dialog/UploadDialog.js.map +1 -1
  18. package/es/elements/content-sidebar/hooks/useSidebarMetadataFetcher.js +19 -12
  19. package/es/elements/content-sidebar/hooks/useSidebarMetadataFetcher.js.map +1 -1
  20. package/es/elements/index.js +1 -0
  21. package/es/elements/index.js.flow +1 -0
  22. package/es/elements/index.js.map +1 -1
  23. package/es/elements/wrappers/ContentUploader.js +2 -0
  24. package/es/elements/wrappers/ContentUploader.js.flow +2 -0
  25. package/es/elements/wrappers/ContentUploader.js.map +1 -1
  26. package/es/features/metadata-instance-fields/MetadataField.js +12 -1
  27. package/es/features/metadata-instance-fields/MetadataField.js.flow +14 -0
  28. package/es/features/metadata-instance-fields/MetadataField.js.map +1 -1
  29. package/es/src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.d.ts +1 -1
  30. package/i18n/ja-JP.js +2 -2
  31. package/i18n/ja-JP.properties +2 -2
  32. package/package.json +5 -5
  33. package/src/api/schemas/AiAgentReference.js +15 -0
  34. package/src/api/schemas/AiExtractStructured.js +7 -1
  35. package/src/elements/common/upload-dialog/UploadDialog.js +1 -0
  36. package/src/elements/content-sidebar/__tests__/useSidebarMetadataFetcher.test.tsx +58 -0
  37. package/src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.ts +11 -7
  38. package/src/elements/index.js +1 -0
  39. package/src/elements/wrappers/ContentUploader.js +2 -0
  40. package/src/features/metadata-instance-fields/MetadataField.js +14 -0
  41. package/src/features/metadata-instance-fields/__tests__/MetadataField.test.js +6 -0
  42. package/src/features/metadata-instance-fields/__tests__/__snapshots__/MetadataField.test.js.snap +7 -0
  43. package/es/elements/content-uploader/ContentUploader.js.flow +0 -1322
  44. package/es/elements/content-uploader/ContentUploaderPopup.js.flow +0 -11
  45. package/es/elements/content-uploader/DroppableContent.js.flow +0 -82
  46. package/es/elements/content-uploader/Footer.js.flow +0 -63
  47. package/es/elements/content-uploader/IconName.js.flow +0 -45
  48. package/es/elements/content-uploader/ItemAction.js.flow +0 -128
  49. package/es/elements/content-uploader/ItemList.js.flow +0 -79
  50. package/es/elements/content-uploader/ItemRemove.js.flow +0 -51
  51. package/es/elements/content-uploader/OverallUploadsProgressBar.js.flow +0 -111
  52. package/es/elements/content-uploader/ProgressBar.js.flow +0 -65
  53. package/es/elements/content-uploader/UploadInput.js.flow +0 -50
  54. package/es/elements/content-uploader/UploadState.js.flow +0 -114
  55. package/es/elements/content-uploader/UploadStateContent.js.flow +0 -71
  56. package/es/elements/content-uploader/UploadsManager.js.flow +0 -111
  57. package/es/elements/content-uploader/UploadsManagerAction.js.flow +0 -36
  58. package/es/elements/content-uploader/actionCellRenderer.js.flow +0 -18
  59. package/es/elements/content-uploader/index.js.flow +0 -4
  60. package/es/elements/content-uploader/nameCellRenderer.js.flow +0 -13
  61. package/es/elements/content-uploader/progressCellRenderer.js.flow +0 -81
  62. package/es/elements/content-uploader/removeCellRenderer.js.flow +0 -16
  63. package/src/elements/content-uploader/ContentUploader.js.flow +0 -1322
  64. package/src/elements/content-uploader/ContentUploaderPopup.js.flow +0 -11
  65. package/src/elements/content-uploader/DroppableContent.js.flow +0 -82
  66. package/src/elements/content-uploader/Footer.js.flow +0 -63
  67. package/src/elements/content-uploader/IconName.js.flow +0 -45
  68. package/src/elements/content-uploader/ItemAction.js.flow +0 -128
  69. package/src/elements/content-uploader/ItemList.js.flow +0 -79
  70. package/src/elements/content-uploader/ItemRemove.js.flow +0 -51
  71. package/src/elements/content-uploader/OverallUploadsProgressBar.js.flow +0 -111
  72. package/src/elements/content-uploader/ProgressBar.js.flow +0 -65
  73. package/src/elements/content-uploader/UploadInput.js.flow +0 -50
  74. package/src/elements/content-uploader/UploadState.js.flow +0 -114
  75. package/src/elements/content-uploader/UploadStateContent.js.flow +0 -71
  76. package/src/elements/content-uploader/UploadsManager.js.flow +0 -111
  77. package/src/elements/content-uploader/UploadsManagerAction.js.flow +0 -36
  78. package/src/elements/content-uploader/actionCellRenderer.js.flow +0 -18
  79. package/src/elements/content-uploader/index.js.flow +0 -4
  80. package/src/elements/content-uploader/nameCellRenderer.js.flow +0 -13
  81. package/src/elements/content-uploader/progressCellRenderer.js.flow +0 -81
  82. package/src/elements/content-uploader/removeCellRenderer.js.flow +0 -16
@@ -36,6 +36,7 @@ const mockPreconditionFailedError = {
36
36
  const mockFile = {
37
37
  id: '123',
38
38
  permissions: { [FIELD_PERMISSIONS_CAN_UPLOAD]: true },
39
+ type: 'file',
39
40
  };
40
41
 
41
42
  const mockTemplates = [
@@ -423,5 +424,62 @@ describe('useSidebarMetadataFetcher', () => {
423
424
  }),
424
425
  );
425
426
  });
427
+
428
+ test('should call extractStructured with custom AI agent ID', async () => {
429
+ const { result } = setupHook();
430
+ const agentId = 'custom-agent-123';
431
+
432
+ await result.current.extractSuggestions('templateKey', 'global', agentId);
433
+
434
+ expect(mockAPI.extractStructured).toHaveBeenCalledWith({
435
+ items: [{ id: mockFile.id, type: mockFile.type }],
436
+ metadata_template: { template_key: 'templateKey', scope: 'global', type: 'metadata_template' },
437
+ ai_agent: { type: 'ai_agent_id', id: agentId },
438
+ });
439
+ });
440
+
441
+ test('should not call extractStructured with custom AI agent ID', async () => {
442
+ const { result } = setupHook();
443
+
444
+ await result.current.extractSuggestions('templateKey', 'global');
445
+
446
+ // Assert that ai_agent is NOT present
447
+ expect(mockAPI.extractStructured).toHaveBeenCalledWith(
448
+ expect.not.objectContaining({
449
+ ai_agent: expect.anything(),
450
+ }),
451
+ );
452
+ // Also verify what IS present
453
+ expect(mockAPI.extractStructured).toHaveBeenCalledWith({
454
+ items: [{ id: mockFile.id, type: mockFile.type }],
455
+ metadata_template: { template_key: 'templateKey', scope: 'global', type: 'metadata_template' },
456
+ });
457
+ });
458
+
459
+ test('should handle undefined agentIDs', async () => {
460
+ const { result } = setupHook();
461
+
462
+ await result.current.extractSuggestions('templateKey', 'global', undefined);
463
+
464
+ // Assert that ai_agent is NOT present
465
+ expect(mockAPI.extractStructured).toHaveBeenCalledWith(
466
+ expect.not.objectContaining({
467
+ ai_agent: expect.anything(),
468
+ }),
469
+ );
470
+ // Also verify what IS present
471
+ expect(mockAPI.extractStructured).toHaveBeenCalledWith({
472
+ items: [{ id: mockFile.id, type: mockFile.type }],
473
+ metadata_template: { template_key: 'templateKey', scope: 'global', type: 'metadata_template' },
474
+ });
475
+ mockAPI.extractStructured.mockClear();
476
+
477
+ await result.current.extractSuggestions('templateKey', 'global', '');
478
+ expect(mockAPI.extractStructured).toHaveBeenCalledWith(
479
+ expect.not.objectContaining({
480
+ ai_agent: expect.anything(),
481
+ }),
482
+ );
483
+ });
426
484
  });
427
485
  });
@@ -29,6 +29,7 @@ import messages from '../../common/messages';
29
29
 
30
30
  import { type BoxItem } from '../../../common/types/core';
31
31
  import { type ErrorContextProps, type ExternalProps, type SuccessContextProps } from '../MetadataSidebarRedesign';
32
+ import { type AiExtractStructured } from '../../../api/schemas/AiExtractStructured';
32
33
 
33
34
  export enum STATUS {
34
35
  IDLE = 'idle',
@@ -45,7 +46,7 @@ interface DataFetcher {
45
46
  | ERROR_CODE_METADATA_PRECONDITION_FAILED
46
47
  | ERROR_CODE_UNKNOWN
47
48
  | null;
48
- extractSuggestions: (templateKey: string, scope: string) => Promise<MetadataTemplateField[]>;
49
+ extractSuggestions: (templateKey: string, scope: string, agentId?: string) => Promise<MetadataTemplateField[]>;
49
50
  file: BoxItem | null;
50
51
  handleCreateMetadataInstance: (
51
52
  templateInstance: MetadataTemplateInstance,
@@ -214,16 +215,19 @@ function useSidebarMetadataFetcher(
214
215
 
215
216
  const [, setError] = React.useState();
216
217
  const extractSuggestions = React.useCallback(
217
- async (templateKey: string, scope: string): Promise<MetadataTemplateField[]> => {
218
+ async (templateKey: string, scope: string, agentId?: string): Promise<MetadataTemplateField[]> => {
218
219
  const aiAPI = api.getIntelligenceAPI();
219
220
  setExtractErrorCode(null);
220
-
221
221
  let answer = null;
222
+ const customAiAgent = agentId ? { ai_agent: { type: 'ai_agent_id', id: agentId } } : {};
223
+ const requestBody: AiExtractStructured = {
224
+ items: [{ id: file.id, type: file.type }],
225
+ metadata_template: { template_key: templateKey, scope, type: 'metadata_template' },
226
+ ...customAiAgent,
227
+ };
228
+
222
229
  try {
223
- answer = (await aiAPI.extractStructured({
224
- items: [{ id: file.id, type: file.type }],
225
- metadata_template: { template_key: templateKey, scope, type: 'metadata_template' },
226
- })) as Record<string, MetadataFieldValue>;
230
+ answer = (await aiAPI.extractStructured(requestBody)) as Record<string, MetadataFieldValue>;
227
231
  } catch (error) {
228
232
  // Axios makes the status code nested under the response object
229
233
  if (error.response?.status === 408) {
@@ -3,6 +3,7 @@
3
3
  export { default as ContentExplorer } from './content-explorer';
4
4
  export { default as ContentPreview } from './content-preview';
5
5
  export { default as ContentPicker, ContentPickerPopup } from './content-picker';
6
+ // $FlowFixMe
6
7
  export { default as ContentUploader, ContentUploaderPopup } from './content-uploader';
7
8
  export { default as ContentOpenWith } from './content-open-with';
8
9
  export { default as ContentSidebar } from './content-sidebar';
@@ -9,7 +9,9 @@ import * as React from 'react';
9
9
  // eslint-disable-next-line react/no-deprecated
10
10
  import { render } from 'react-dom';
11
11
  import ES6Wrapper from './ES6Wrapper';
12
+ // $FlowFixMe
12
13
  import ContentUploaderPopup from '../content-uploader/ContentUploaderPopup';
14
+ // $FlowFixMe
13
15
  import WrappedContentUploaderComponent from '../content-uploader/ContentUploader';
14
16
  import type { UploadFileWithAPIOptions } from '../../common/types/upload';
15
17
  import type { BoxItem } from '../../common/types/core';
@@ -21,6 +21,7 @@ import {
21
21
  FIELD_TYPE_STRING,
22
22
  FIELD_TYPE_DATE,
23
23
  FIELD_TYPE_MULTISELECT,
24
+ FIELD_TYPE_TAXONOMY,
24
25
  } from './constants';
25
26
 
26
27
  type Props = {
@@ -160,6 +161,19 @@ const MetadataField = ({
160
161
  />
161
162
  );
162
163
 
164
+ // The taxonomy field is a valid field type which,
165
+ // although not yet supported here, should not trigger an error message.
166
+ // For this reason, we are currently setting it to read-only.
167
+ case FIELD_TYPE_TAXONOMY:
168
+ return (
169
+ <ReadOnlyMetadataField
170
+ dataValue={dataValue}
171
+ description={description}
172
+ displayName={displayName}
173
+ type={type}
174
+ />
175
+ );
176
+
163
177
  default:
164
178
  return (
165
179
  <InlineError title={type}>
@@ -33,6 +33,12 @@ describe('features/metadata-instance-editor/fields/MetadataField', () => {
33
33
  );
34
34
  expect(wrapper).toMatchSnapshot();
35
35
  });
36
+ test('should correctly render a taxonomy field - for the time being, in read-only mode', () => {
37
+ const wrapper = shallow(
38
+ <MetadataField canEdit dataValue="value" onChange={onChange} onRemove={onRemove} type="taxonomy" />,
39
+ );
40
+ expect(wrapper).toMatchSnapshot();
41
+ });
36
42
  test('should correctly render a float field', () => {
37
43
  const wrapper = shallow(
38
44
  <MetadataField canEdit dataValue="value" onChange={onChange} onRemove={onRemove} type="float" />,
@@ -37,6 +37,13 @@ exports[`features/metadata-instance-editor/fields/MetadataField should correctly
37
37
  />
38
38
  `;
39
39
 
40
+ exports[`features/metadata-instance-editor/fields/MetadataField should correctly render a taxonomy field - for the time being, in read-only mode 1`] = `
41
+ <ReadOnlyMetadataField
42
+ dataValue="value"
43
+ type="taxonomy"
44
+ />
45
+ `;
46
+
40
47
  exports[`features/metadata-instance-editor/fields/MetadataField should correctly render a text field 1`] = `
41
48
  <TextMetadataField
42
49
  dataValue="value"