box-ui-elements 23.4.0-beta.11 → 23.4.0-beta.13

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 (37) 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/api/uploads/FolderUploadNode.js +41 -6
  16. package/es/api/uploads/FolderUploadNode.js.flow +45 -5
  17. package/es/api/uploads/FolderUploadNode.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/features/metadata-instance-fields/MetadataField.js +12 -1
  21. package/es/features/metadata-instance-fields/MetadataField.js.flow +14 -0
  22. package/es/features/metadata-instance-fields/MetadataField.js.map +1 -1
  23. package/es/src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.d.ts +1 -1
  24. package/es/utils/sleep.js +3 -0
  25. package/es/utils/sleep.js.flow +2 -0
  26. package/es/utils/sleep.js.map +1 -0
  27. package/package.json +5 -5
  28. package/src/api/schemas/AiAgentReference.js +15 -0
  29. package/src/api/schemas/AiExtractStructured.js +7 -1
  30. package/src/api/uploads/FolderUploadNode.js +45 -5
  31. package/src/api/uploads/__tests__/FolderUploadNode.test.js +49 -0
  32. package/src/elements/content-sidebar/__tests__/useSidebarMetadataFetcher.test.tsx +58 -0
  33. package/src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.ts +11 -7
  34. package/src/features/metadata-instance-fields/MetadataField.js +14 -0
  35. package/src/features/metadata-instance-fields/__tests__/MetadataField.test.js +6 -0
  36. package/src/features/metadata-instance-fields/__tests__/__snapshots__/MetadataField.test.js.snap +7 -0
  37. package/src/utils/sleep.js +2 -0
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=AiAgentReference.js.map
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @flow
3
+ * @author Box
4
+ */
5
+
6
+ export type AiAgentTypeField = 'ai_agent_id';
7
+
8
+ export interface AiAgentReference {
9
+ /**
10
+ * AI Agent Reference to pass custom AI Agent ID to requests.
11
+ * See https://developer.box.com/reference/resources/ai-agent-reference/
12
+ */
13
+ +type: AiAgentTypeField;
14
+ +id: string;
15
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AiAgentReference.js","names":[],"sources":["../../../src/api/schemas/AiAgentReference.js"],"sourcesContent":["/**\n * @flow\n * @author Box\n */\n\nexport type AiAgentTypeField = 'ai_agent_id';\n\nexport interface AiAgentReference {\n /**\n * AI Agent Reference to pass custom AI Agent ID to requests.\n * See https://developer.box.com/reference/resources/ai-agent-reference/\n */\n +type: AiAgentTypeField;\n +id: string;\n}\n"],"mappings":"","ignoreList":[]}
@@ -4,5 +4,6 @@
4
4
  */
5
5
 
6
6
  import { AiAgentExtractStructured } from './AiAgentExtractStructured';
7
+ import { AiAgentReference } from './AiAgentReference';
7
8
  import { AiItemBase } from './AiItemBase';
8
9
  //# sourceMappingURL=AiExtractStructured.js.map
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import { AiAgentExtractStructured } from './AiAgentExtractStructured';
7
+ import { AiAgentReference } from './AiAgentReference';
7
8
  import { AiItemBase } from './AiItemBase';
8
9
 
9
10
  export type AiExtractStructuredMetadataTemplateTypeField = 'metadata_template';
@@ -80,5 +81,10 @@ export interface AiExtractStructured {
80
81
  * The JSON blob that contains overrides for the agent config.
81
82
  */
82
83
  +agent_config?: string;
83
- +ai_agent?: AiAgentExtractStructured;
84
+ /**
85
+ * * AI agent definition to use for extraction.
86
+ * – `AiAgentExtractStructured`: customise Basic-Text / Long-Text agents
87
+ * – `AiAgentReference` : reference a custom AI-Agent by ID
88
+ */
89
+ +ai_agent?: AiAgentExtractStructured | AiAgentReference;
84
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AiExtractStructured.js","names":["AiAgentExtractStructured","AiItemBase"],"sources":["../../../src/api/schemas/AiExtractStructured.js"],"sourcesContent":["/**\n * @flow\n * @author Box\n */\n\nimport { AiAgentExtractStructured } from './AiAgentExtractStructured';\nimport { AiItemBase } from './AiItemBase';\n\nexport type AiExtractStructuredMetadataTemplateTypeField = 'metadata_template';\n\nexport interface AiExtractStructuredMetadataTemplateField {\n /**\n * The name of the metadata template.\n */\n +template_key?: string;\n /**\n * Value is always `metadata_template`.\n */\n +type?: AiExtractStructuredMetadataTemplateTypeField;\n /**\n * The scope of the metadata template can either be global or\n enterprise_*. The global scope is used for templates that are\n available to any Box enterprise. The enterprise_* scope represents\n templates that have been created within a specific enterprise,\n where * will be the ID of that enterprise.\n */\n +scope?: string;\n}\n\nexport interface AiExtractStructuredFieldsOptionsField {\n /**\n * A unique identifier for the field.\n */\n +key: string;\n}\n\nexport interface AiExtractStructuredFieldsField {\n /**\n * A unique identifier for the field.\n */\n +key: string;\n /**\n * A description of the field.\n */\n +description?: string;\n /**\n * The display name of the field.\n */\n +display_name?: string;\n /**\n * Context about the key that may include how to find and how to format it.\n */\n +prompt?: string;\n /**\n * The type of the field. Can include but is not limited to string, float, date, enum, and multiSelect.\n */\n +type?: string;\n /**\n * A list of options for this field. This is most often used in combination with the enum and multiSelect field types.\n */\n +options?: $ReadOnlyArray<AiExtractStructuredFieldsOptionsField>;\n}\n\nexport interface AiExtractStructured {\n /**\n * The items to be processed by the LLM, often files.\n */\n +items: $ReadOnlyArray<AiItemBase>;\n /**\n * The metadata template containing the fields to extract. Cannot be used\n in combination with `fields`.\n */\n +metadata_template?: AiExtractStructuredMetadataTemplateField;\n /**\n * The fields to be extracted from the items. Cannot be used in combination\n with `metadata_template`.\n */\n +fields?: $ReadOnlyArray<AiExtractStructuredFieldsField>;\n /**\n * The JSON blob that contains overrides for the agent config.\n */\n +agent_config?: string;\n +ai_agent?: AiAgentExtractStructured;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA,SAASA,wBAAwB,QAAQ,4BAA4B;AACrE,SAASC,UAAU,QAAQ,cAAc","ignoreList":[]}
1
+ {"version":3,"file":"AiExtractStructured.js","names":["AiAgentExtractStructured","AiAgentReference","AiItemBase"],"sources":["../../../src/api/schemas/AiExtractStructured.js"],"sourcesContent":["/**\n * @flow\n * @author Box\n */\n\nimport { AiAgentExtractStructured } from './AiAgentExtractStructured';\nimport { AiAgentReference } from './AiAgentReference';\nimport { AiItemBase } from './AiItemBase';\n\nexport type AiExtractStructuredMetadataTemplateTypeField = 'metadata_template';\n\nexport interface AiExtractStructuredMetadataTemplateField {\n /**\n * The name of the metadata template.\n */\n +template_key?: string;\n /**\n * Value is always `metadata_template`.\n */\n +type?: AiExtractStructuredMetadataTemplateTypeField;\n /**\n * The scope of the metadata template can either be global or\n enterprise_*. The global scope is used for templates that are\n available to any Box enterprise. The enterprise_* scope represents\n templates that have been created within a specific enterprise,\n where * will be the ID of that enterprise.\n */\n +scope?: string;\n}\n\nexport interface AiExtractStructuredFieldsOptionsField {\n /**\n * A unique identifier for the field.\n */\n +key: string;\n}\n\nexport interface AiExtractStructuredFieldsField {\n /**\n * A unique identifier for the field.\n */\n +key: string;\n /**\n * A description of the field.\n */\n +description?: string;\n /**\n * The display name of the field.\n */\n +display_name?: string;\n /**\n * Context about the key that may include how to find and how to format it.\n */\n +prompt?: string;\n /**\n * The type of the field. Can include but is not limited to string, float, date, enum, and multiSelect.\n */\n +type?: string;\n /**\n * A list of options for this field. This is most often used in combination with the enum and multiSelect field types.\n */\n +options?: $ReadOnlyArray<AiExtractStructuredFieldsOptionsField>;\n}\n\nexport interface AiExtractStructured {\n /**\n * The items to be processed by the LLM, often files.\n */\n +items: $ReadOnlyArray<AiItemBase>;\n /**\n * The metadata template containing the fields to extract. Cannot be used\n in combination with `fields`.\n */\n +metadata_template?: AiExtractStructuredMetadataTemplateField;\n /**\n * The fields to be extracted from the items. Cannot be used in combination\n with `metadata_template`.\n */\n +fields?: $ReadOnlyArray<AiExtractStructuredFieldsField>;\n /**\n * The JSON blob that contains overrides for the agent config.\n */\n +agent_config?: string;\n /**\n * * AI agent definition to use for extraction.\n * – `AiAgentExtractStructured`: customise Basic-Text / Long-Text agents\n * – `AiAgentReference` : reference a custom AI-Agent by ID\n */\n +ai_agent?: AiAgentExtractStructured | AiAgentReference;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA,SAASA,wBAAwB,QAAQ,4BAA4B;AACrE,SAASC,gBAAgB,QAAQ,oBAAoB;AACrD,SAASC,UAAU,QAAQ,cAAc","ignoreList":[]}
@@ -11,7 +11,10 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
11
11
  import noop from 'lodash/noop';
12
12
  import { getFileFromEntry } from '../../utils/uploads';
13
13
  import FolderAPI from '../Folder';
14
- import { STATUS_COMPLETE, STATUS_ERROR, ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED, ERROR_CODE_ITEM_NAME_IN_USE } from '../../constants';
14
+ import { STATUS_COMPLETE, STATUS_ERROR, ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED, ERROR_CODE_ITEM_NAME_IN_USE, DEFAULT_RETRY_DELAY_MS, MS_IN_S } from '../../constants';
15
+ import sleep from '../../utils/sleep';
16
+ const CHILD_FOLDER_UPLOAD_CONCURRENCY = 3;
17
+ const MAX_RETRIES = 3;
15
18
  class FolderUploadNode {
16
19
  /**
17
20
  * [constructor]
@@ -32,10 +35,30 @@ class FolderUploadNode {
32
35
  * @returns {Promise}
33
36
  */
34
37
  _defineProperty(this, "uploadChildFolders", async errorCallback => {
38
+ // Gets FolderUploadNode values from this.folders key value pairs object
35
39
  // $FlowFixMe
36
40
  const folders = Object.values(this.folders);
37
- const promises = folders.map(folder => folder.upload(this.folderId, errorCallback));
38
- await Promise.all(promises);
41
+
42
+ // Worker function: picks the next folder from the array and uploads until no more folders are available
43
+ const worker = async () => {
44
+ while (folders.length > 0) {
45
+ const folder = folders.pop();
46
+ if (folder) {
47
+ // Await is needed to help ensure rate limit is respected
48
+ // eslint-disable-next-line no-await-in-loop
49
+ await folder.upload(this.folderId, errorCallback);
50
+ }
51
+ }
52
+ };
53
+
54
+ // Spawns up to CHILD_FOLDER_UPLOAD_CONCURRENCY workers that upload folders in parallel until folders array is empty
55
+ const workers = [];
56
+ for (let i = 0; i < CHILD_FOLDER_UPLOAD_CONCURRENCY && i < folders.length; i += 1) {
57
+ workers.push(worker());
58
+ }
59
+
60
+ // Waits for all workers to finish
61
+ await Promise.all(workers);
39
62
  });
40
63
  /**
41
64
  * Create folder and add it to the upload queue
@@ -45,7 +68,7 @@ class FolderUploadNode {
45
68
  * @param {boolean} isRoot
46
69
  * @returns {Promise}
47
70
  */
48
- _defineProperty(this, "createAndUploadFolder", async (errorCallback, isRoot) => {
71
+ _defineProperty(this, "createAndUploadFolder", async (errorCallback, isRoot, retryCount = 0) => {
49
72
  await this.buildCurrentFolderFromEntry();
50
73
  let errorEncountered = false;
51
74
  let errorCode = '';
@@ -53,9 +76,20 @@ class FolderUploadNode {
53
76
  const data = await this.createFolder();
54
77
  this.folderId = data.id;
55
78
  } catch (error) {
56
- // @TODO: Handle 429
57
79
  if (error.code === ERROR_CODE_ITEM_NAME_IN_USE) {
58
80
  this.folderId = error.context_info.conflicts[0].id;
81
+ } else if (error.status === 429 && retryCount < MAX_RETRIES) {
82
+ // Set a default exponential backoff delay with a random jitter(0–999 ms) to avoid all requests being sent at once
83
+ // This will be overridden if the Retry-After header is present in the response
84
+ let retryAfterMs = DEFAULT_RETRY_DELAY_MS * 2 ** retryCount + Math.floor(Math.random() * 1000);
85
+ if (error.headers) {
86
+ const retryAfterHeaderSec = parseInt(error.headers['retry-after'] || error.headers.get('Retry-After'), 10);
87
+ if (!Number.isNaN(retryAfterHeaderSec)) {
88
+ retryAfterMs = retryAfterHeaderSec * MS_IN_S;
89
+ }
90
+ }
91
+ await sleep(retryAfterMs);
92
+ return this.createAndUploadFolder(errorCallback, isRoot, retryCount + 1);
59
93
  } else if (isRoot) {
60
94
  errorCallback(error);
61
95
  } else {
@@ -73,7 +107,7 @@ class FolderUploadNode {
73
107
 
74
108
  // The root folder has already been added to the upload queue in ContentUploader
75
109
  if (isRoot) {
76
- return;
110
+ return undefined;
77
111
  }
78
112
  const folderObject = {
79
113
  extension: '',
@@ -90,6 +124,7 @@ class FolderUploadNode {
90
124
  };
91
125
  }
92
126
  this.addFolderToUploadQueue(folderObject);
127
+ return undefined;
93
128
  });
94
129
  /**
95
130
  * Format files to Array<UploadFileWithAPIOptions> for upload
@@ -11,6 +11,8 @@ import {
11
11
  STATUS_ERROR,
12
12
  ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED,
13
13
  ERROR_CODE_ITEM_NAME_IN_USE,
14
+ DEFAULT_RETRY_DELAY_MS,
15
+ MS_IN_S,
14
16
  } from '../../constants';
15
17
  import type {
16
18
  UploadFileWithAPIOptions,
@@ -18,6 +20,10 @@ import type {
18
20
  FolderUploadItem,
19
21
  DirectoryReader,
20
22
  } from '../../common/types/upload';
23
+ import sleep from '../../utils/sleep';
24
+
25
+ const CHILD_FOLDER_UPLOAD_CONCURRENCY = 3;
26
+ const MAX_RETRIES = 3;
21
27
 
22
28
  class FolderUploadNode {
23
29
  addFolderToUploadQueue: Function;
@@ -93,11 +99,30 @@ class FolderUploadNode {
93
99
  * @returns {Promise}
94
100
  */
95
101
  uploadChildFolders = async (errorCallback: Function) => {
102
+ // Gets FolderUploadNode values from this.folders key value pairs object
96
103
  // $FlowFixMe
97
104
  const folders: Array<FolderUploadNode> = Object.values(this.folders);
98
- const promises = folders.map(folder => folder.upload(this.folderId, errorCallback));
99
105
 
100
- await Promise.all(promises);
106
+ // Worker function: picks the next folder from the array and uploads until no more folders are available
107
+ const worker = async () => {
108
+ while (folders.length > 0) {
109
+ const folder = folders.pop();
110
+ if (folder) {
111
+ // Await is needed to help ensure rate limit is respected
112
+ // eslint-disable-next-line no-await-in-loop
113
+ await folder.upload(this.folderId, errorCallback);
114
+ }
115
+ }
116
+ };
117
+
118
+ // Spawns up to CHILD_FOLDER_UPLOAD_CONCURRENCY workers that upload folders in parallel until folders array is empty
119
+ const workers = [];
120
+ for (let i = 0; i < CHILD_FOLDER_UPLOAD_CONCURRENCY && i < folders.length; i += 1) {
121
+ workers.push(worker());
122
+ }
123
+
124
+ // Waits for all workers to finish
125
+ await Promise.all(workers);
101
126
  };
102
127
 
103
128
  /**
@@ -108,7 +133,7 @@ class FolderUploadNode {
108
133
  * @param {boolean} isRoot
109
134
  * @returns {Promise}
110
135
  */
111
- createAndUploadFolder = async (errorCallback: Function, isRoot: boolean) => {
136
+ createAndUploadFolder = async (errorCallback: Function, isRoot: boolean, retryCount: number = 0) => {
112
137
  await this.buildCurrentFolderFromEntry();
113
138
 
114
139
  let errorEncountered = false;
@@ -117,9 +142,23 @@ class FolderUploadNode {
117
142
  const data = await this.createFolder();
118
143
  this.folderId = data.id;
119
144
  } catch (error) {
120
- // @TODO: Handle 429
121
145
  if (error.code === ERROR_CODE_ITEM_NAME_IN_USE) {
122
146
  this.folderId = error.context_info.conflicts[0].id;
147
+ } else if (error.status === 429 && retryCount < MAX_RETRIES) {
148
+ // Set a default exponential backoff delay with a random jitter(0–999 ms) to avoid all requests being sent at once
149
+ // This will be overridden if the Retry-After header is present in the response
150
+ let retryAfterMs = DEFAULT_RETRY_DELAY_MS * 2 ** retryCount + Math.floor(Math.random() * 1000);
151
+ if (error.headers) {
152
+ const retryAfterHeaderSec = parseInt(
153
+ error.headers['retry-after'] || error.headers.get('Retry-After'),
154
+ 10,
155
+ );
156
+ if (!Number.isNaN(retryAfterHeaderSec)) {
157
+ retryAfterMs = retryAfterHeaderSec * MS_IN_S;
158
+ }
159
+ }
160
+ await sleep(retryAfterMs);
161
+ return this.createAndUploadFolder(errorCallback, isRoot, retryCount + 1);
123
162
  } else if (isRoot) {
124
163
  errorCallback(error);
125
164
  } else {
@@ -135,7 +174,7 @@ class FolderUploadNode {
135
174
 
136
175
  // The root folder has already been added to the upload queue in ContentUploader
137
176
  if (isRoot) {
138
- return;
177
+ return undefined;
139
178
  }
140
179
 
141
180
  const folderObject: FolderUploadItem = {
@@ -153,6 +192,7 @@ class FolderUploadNode {
153
192
  }
154
193
 
155
194
  this.addFolderToUploadQueue(folderObject);
195
+ return undefined;
156
196
  };
157
197
 
158
198
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"FolderUploadNode.js","names":["noop","getFileFromEntry","FolderAPI","STATUS_COMPLETE","STATUS_ERROR","ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED","ERROR_CODE_ITEM_NAME_IN_USE","FolderUploadNode","constructor","name","addFilesToUploadQueue","addFolderToUploadQueue","fileAPIOptions","baseAPIOptions","entry","_defineProperty","errorCallback","folders","Object","values","promises","map","folder","upload","folderId","Promise","all","isRoot","buildCurrentFolderFromEntry","errorEncountered","errorCode","data","createFolder","id","error","code","context_info","conflicts","folderObject","extension","status","isFolder","size","progress","files","file","options","_objectSpread","uploadInitTimestamp","Date","now","entries","isFile","push","reader","resolve","readEntries","length","createFolderUploadNodesFromEntries","readEntry","createReader","parentFolderId","createAndUploadFolder","getFolderId","getFormattedFiles","uploadChildFolders","folderAPI","reject","create"],"sources":["../../../src/api/uploads/FolderUploadNode.js"],"sourcesContent":["/**\n * @flow\n * @file Recursively create folder and upload files\n * @author Box\n */\nimport noop from 'lodash/noop';\nimport { getFileFromEntry } from '../../utils/uploads';\nimport FolderAPI from '../Folder';\nimport {\n STATUS_COMPLETE,\n STATUS_ERROR,\n ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED,\n ERROR_CODE_ITEM_NAME_IN_USE,\n} from '../../constants';\nimport type {\n UploadFileWithAPIOptions,\n FileSystemFileEntry,\n FolderUploadItem,\n DirectoryReader,\n} from '../../common/types/upload';\n\nclass FolderUploadNode {\n addFolderToUploadQueue: Function;\n\n files: Array<File> = [];\n\n folderId: string;\n\n folders: Object = {};\n\n name: string;\n\n parentFolderId: string;\n\n addFilesToUploadQueue: Function;\n\n fileAPIOptions: Object;\n\n baseAPIOptions: Object;\n\n entry: ?FileSystemFileEntry;\n\n /**\n * [constructor]\n *\n * @param {string} name\n * @param {Function} addFilesToUploadQueue\n * @param {Function} addFolderToUploadQueue\n * @returns {void}\n */\n constructor(\n name: string,\n addFilesToUploadQueue: Function,\n addFolderToUploadQueue: Function,\n fileAPIOptions: Object,\n baseAPIOptions: Object,\n entry?: FileSystemFileEntry,\n ) {\n this.name = name;\n this.addFilesToUploadQueue = addFilesToUploadQueue;\n this.addFolderToUploadQueue = addFolderToUploadQueue;\n this.fileAPIOptions = fileAPIOptions;\n this.baseAPIOptions = baseAPIOptions;\n this.entry = entry;\n }\n\n /**\n * Upload a folder\n *\n * @public\n * @param {string} parentFolderId\n * @param {Function} errorCallback\n * @param {boolean} isRoot\n * @returns {Promise}\n */\n async upload(parentFolderId: string, errorCallback: Function, isRoot: boolean = false) {\n this.parentFolderId = parentFolderId;\n\n await this.createAndUploadFolder(errorCallback, isRoot);\n\n // Check if folder was successfully created before we attempt to upload its contents.\n if (this.getFolderId()) {\n this.addFilesToUploadQueue(this.getFormattedFiles(), noop, true);\n await this.uploadChildFolders(errorCallback);\n }\n }\n\n /**\n * Upload all child folders\n *\n * @private\n * @param {Function} errorCallback\n * @returns {Promise}\n */\n uploadChildFolders = async (errorCallback: Function) => {\n // $FlowFixMe\n const folders: Array<FolderUploadNode> = Object.values(this.folders);\n const promises = folders.map(folder => folder.upload(this.folderId, errorCallback));\n\n await Promise.all(promises);\n };\n\n /**\n * Create folder and add it to the upload queue\n *\n * @private\n * @param {Function} errorCallback\n * @param {boolean} isRoot\n * @returns {Promise}\n */\n createAndUploadFolder = async (errorCallback: Function, isRoot: boolean) => {\n await this.buildCurrentFolderFromEntry();\n\n let errorEncountered = false;\n let errorCode = '';\n try {\n const data = await this.createFolder();\n this.folderId = data.id;\n } catch (error) {\n // @TODO: Handle 429\n if (error.code === ERROR_CODE_ITEM_NAME_IN_USE) {\n this.folderId = error.context_info.conflicts[0].id;\n } else if (isRoot) {\n errorCallback(error);\n } else {\n // If this is a child folder of the folder being uploaded, this errorCallback will set\n // an error message on the root folder being uploaded. Set a generic messages saying that a\n // child has caused the error. The child folder will be tagged with the error message in\n // the call to this.addFolderToUploadQueue below\n errorEncountered = true;\n errorCode = error.code;\n errorCallback({ code: ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED });\n }\n }\n\n // The root folder has already been added to the upload queue in ContentUploader\n if (isRoot) {\n return;\n }\n\n const folderObject: FolderUploadItem = {\n extension: '',\n name: this.name,\n status: STATUS_COMPLETE,\n isFolder: true,\n size: 1,\n progress: 100,\n };\n\n if (errorEncountered) {\n folderObject.status = STATUS_ERROR;\n folderObject.error = { code: errorCode };\n }\n\n this.addFolderToUploadQueue(folderObject);\n };\n\n /**\n * Format files to Array<UploadFileWithAPIOptions> for upload\n *\n * @private\n * @returns {Array<UploadFileWithAPIOptions>}\n */\n getFormattedFiles = (): Array<UploadFileWithAPIOptions> =>\n this.files.map((file: File) => ({\n file,\n options: {\n ...this.fileAPIOptions,\n folderId: this.folderId,\n uploadInitTimestamp: Date.now(),\n },\n }));\n\n /**\n * Promisify create folder\n *\n * @private\n * @returns {Promise}\n */\n createFolder(): Promise<any> {\n const folderAPI = new FolderAPI({\n ...this.baseAPIOptions,\n id: `folder_${this.parentFolderId}`,\n });\n return new Promise((resolve, reject) => {\n folderAPI.create(this.parentFolderId, this.name, resolve, reject);\n });\n }\n\n /**\n * Create FolderUploadNode instances from entries\n *\n * @private\n * @param {Array<FileSystemFileEntry>} entries\n * @returns {Promise<any>}\n */\n createFolderUploadNodesFromEntries = async (entries: Array<FileSystemFileEntry>): Promise<any> => {\n await Promise.all(\n entries.map(async entry => {\n const { isFile, name } = entry;\n\n if (isFile) {\n const file = await getFileFromEntry(entry);\n this.files.push(file);\n return;\n }\n\n this.folders[name] = new FolderUploadNode(\n name,\n this.addFilesToUploadQueue,\n this.addFolderToUploadQueue,\n this.fileAPIOptions,\n {\n ...this.baseAPIOptions,\n ...this.fileAPIOptions,\n },\n entry,\n );\n }),\n );\n };\n\n /**\n * Recursively read an entry\n *\n * @private\n * @param {DirectoryReader} reader\n * @param {Function} resolve\n * @returns {void}\n */\n readEntry = (reader: DirectoryReader, resolve: Function) => {\n reader.readEntries(async entries => {\n // Quit recursing when there are no remaining entries.\n if (!entries.length) {\n resolve();\n return;\n }\n\n await this.createFolderUploadNodesFromEntries(entries);\n\n this.readEntry(reader, resolve);\n }, noop);\n };\n\n /**\n * Build current folder from entry\n *\n * @private\n * @returns {Promise<any>}\n */\n buildCurrentFolderFromEntry = (): Promise<any> => {\n if (!this.entry) {\n return Promise.resolve();\n }\n\n return new Promise(resolve => {\n // $FlowFixMe entry is not empty\n const reader = this.entry.createReader();\n\n this.readEntry(reader, resolve);\n });\n };\n\n /**\n * Returns the folderId\n * @returns {string}\n */\n getFolderId = (): string => {\n return this.folderId;\n };\n}\n\nexport default FolderUploadNode;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"FolderUploadNode.js","names":["noop","getFileFromEntry","FolderAPI","STATUS_COMPLETE","STATUS_ERROR","ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED","ERROR_CODE_ITEM_NAME_IN_USE","DEFAULT_RETRY_DELAY_MS","MS_IN_S","sleep","CHILD_FOLDER_UPLOAD_CONCURRENCY","MAX_RETRIES","FolderUploadNode","constructor","name","addFilesToUploadQueue","addFolderToUploadQueue","fileAPIOptions","baseAPIOptions","entry","_defineProperty","errorCallback","folders","Object","values","worker","length","folder","pop","upload","folderId","workers","i","push","Promise","all","isRoot","retryCount","buildCurrentFolderFromEntry","errorEncountered","errorCode","data","createFolder","id","error","code","context_info","conflicts","status","retryAfterMs","Math","floor","random","headers","retryAfterHeaderSec","parseInt","get","Number","isNaN","createAndUploadFolder","undefined","folderObject","extension","isFolder","size","progress","files","map","file","options","_objectSpread","uploadInitTimestamp","Date","now","entries","isFile","reader","resolve","readEntries","createFolderUploadNodesFromEntries","readEntry","createReader","parentFolderId","getFolderId","getFormattedFiles","uploadChildFolders","folderAPI","reject","create"],"sources":["../../../src/api/uploads/FolderUploadNode.js"],"sourcesContent":["/**\n * @flow\n * @file Recursively create folder and upload files\n * @author Box\n */\nimport noop from 'lodash/noop';\nimport { getFileFromEntry } from '../../utils/uploads';\nimport FolderAPI from '../Folder';\nimport {\n STATUS_COMPLETE,\n STATUS_ERROR,\n ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED,\n ERROR_CODE_ITEM_NAME_IN_USE,\n DEFAULT_RETRY_DELAY_MS,\n MS_IN_S,\n} from '../../constants';\nimport type {\n UploadFileWithAPIOptions,\n FileSystemFileEntry,\n FolderUploadItem,\n DirectoryReader,\n} from '../../common/types/upload';\nimport sleep from '../../utils/sleep';\n\nconst CHILD_FOLDER_UPLOAD_CONCURRENCY = 3;\nconst MAX_RETRIES = 3;\n\nclass FolderUploadNode {\n addFolderToUploadQueue: Function;\n\n files: Array<File> = [];\n\n folderId: string;\n\n folders: Object = {};\n\n name: string;\n\n parentFolderId: string;\n\n addFilesToUploadQueue: Function;\n\n fileAPIOptions: Object;\n\n baseAPIOptions: Object;\n\n entry: ?FileSystemFileEntry;\n\n /**\n * [constructor]\n *\n * @param {string} name\n * @param {Function} addFilesToUploadQueue\n * @param {Function} addFolderToUploadQueue\n * @returns {void}\n */\n constructor(\n name: string,\n addFilesToUploadQueue: Function,\n addFolderToUploadQueue: Function,\n fileAPIOptions: Object,\n baseAPIOptions: Object,\n entry?: FileSystemFileEntry,\n ) {\n this.name = name;\n this.addFilesToUploadQueue = addFilesToUploadQueue;\n this.addFolderToUploadQueue = addFolderToUploadQueue;\n this.fileAPIOptions = fileAPIOptions;\n this.baseAPIOptions = baseAPIOptions;\n this.entry = entry;\n }\n\n /**\n * Upload a folder\n *\n * @public\n * @param {string} parentFolderId\n * @param {Function} errorCallback\n * @param {boolean} isRoot\n * @returns {Promise}\n */\n async upload(parentFolderId: string, errorCallback: Function, isRoot: boolean = false) {\n this.parentFolderId = parentFolderId;\n\n await this.createAndUploadFolder(errorCallback, isRoot);\n\n // Check if folder was successfully created before we attempt to upload its contents.\n if (this.getFolderId()) {\n this.addFilesToUploadQueue(this.getFormattedFiles(), noop, true);\n await this.uploadChildFolders(errorCallback);\n }\n }\n\n /**\n * Upload all child folders\n *\n * @private\n * @param {Function} errorCallback\n * @returns {Promise}\n */\n uploadChildFolders = async (errorCallback: Function) => {\n // Gets FolderUploadNode values from this.folders key value pairs object\n // $FlowFixMe\n const folders: Array<FolderUploadNode> = Object.values(this.folders);\n\n // Worker function: picks the next folder from the array and uploads until no more folders are available\n const worker = async () => {\n while (folders.length > 0) {\n const folder = folders.pop();\n if (folder) {\n // Await is needed to help ensure rate limit is respected\n // eslint-disable-next-line no-await-in-loop\n await folder.upload(this.folderId, errorCallback);\n }\n }\n };\n\n // Spawns up to CHILD_FOLDER_UPLOAD_CONCURRENCY workers that upload folders in parallel until folders array is empty\n const workers = [];\n for (let i = 0; i < CHILD_FOLDER_UPLOAD_CONCURRENCY && i < folders.length; i += 1) {\n workers.push(worker());\n }\n\n // Waits for all workers to finish\n await Promise.all(workers);\n };\n\n /**\n * Create folder and add it to the upload queue\n *\n * @private\n * @param {Function} errorCallback\n * @param {boolean} isRoot\n * @returns {Promise}\n */\n createAndUploadFolder = async (errorCallback: Function, isRoot: boolean, retryCount: number = 0) => {\n await this.buildCurrentFolderFromEntry();\n\n let errorEncountered = false;\n let errorCode = '';\n try {\n const data = await this.createFolder();\n this.folderId = data.id;\n } catch (error) {\n if (error.code === ERROR_CODE_ITEM_NAME_IN_USE) {\n this.folderId = error.context_info.conflicts[0].id;\n } else if (error.status === 429 && retryCount < MAX_RETRIES) {\n // Set a default exponential backoff delay with a random jitter(0–999 ms) to avoid all requests being sent at once\n // This will be overridden if the Retry-After header is present in the response\n let retryAfterMs = DEFAULT_RETRY_DELAY_MS * 2 ** retryCount + Math.floor(Math.random() * 1000);\n if (error.headers) {\n const retryAfterHeaderSec = parseInt(\n error.headers['retry-after'] || error.headers.get('Retry-After'),\n 10,\n );\n if (!Number.isNaN(retryAfterHeaderSec)) {\n retryAfterMs = retryAfterHeaderSec * MS_IN_S;\n }\n }\n await sleep(retryAfterMs);\n return this.createAndUploadFolder(errorCallback, isRoot, retryCount + 1);\n } else if (isRoot) {\n errorCallback(error);\n } else {\n // If this is a child folder of the folder being uploaded, this errorCallback will set\n // an error message on the root folder being uploaded. Set a generic messages saying that a\n // child has caused the error. The child folder will be tagged with the error message in\n // the call to this.addFolderToUploadQueue below\n errorEncountered = true;\n errorCode = error.code;\n errorCallback({ code: ERROR_CODE_UPLOAD_CHILD_FOLDER_FAILED });\n }\n }\n\n // The root folder has already been added to the upload queue in ContentUploader\n if (isRoot) {\n return undefined;\n }\n\n const folderObject: FolderUploadItem = {\n extension: '',\n name: this.name,\n status: STATUS_COMPLETE,\n isFolder: true,\n size: 1,\n progress: 100,\n };\n\n if (errorEncountered) {\n folderObject.status = STATUS_ERROR;\n folderObject.error = { code: errorCode };\n }\n\n this.addFolderToUploadQueue(folderObject);\n return undefined;\n };\n\n /**\n * Format files to Array<UploadFileWithAPIOptions> for upload\n *\n * @private\n * @returns {Array<UploadFileWithAPIOptions>}\n */\n getFormattedFiles = (): Array<UploadFileWithAPIOptions> =>\n this.files.map((file: File) => ({\n file,\n options: {\n ...this.fileAPIOptions,\n folderId: this.folderId,\n uploadInitTimestamp: Date.now(),\n },\n }));\n\n /**\n * Promisify create folder\n *\n * @private\n * @returns {Promise}\n */\n createFolder(): Promise<any> {\n const folderAPI = new FolderAPI({\n ...this.baseAPIOptions,\n id: `folder_${this.parentFolderId}`,\n });\n return new Promise((resolve, reject) => {\n folderAPI.create(this.parentFolderId, this.name, resolve, reject);\n });\n }\n\n /**\n * Create FolderUploadNode instances from entries\n *\n * @private\n * @param {Array<FileSystemFileEntry>} entries\n * @returns {Promise<any>}\n */\n createFolderUploadNodesFromEntries = async (entries: Array<FileSystemFileEntry>): Promise<any> => {\n await Promise.all(\n entries.map(async entry => {\n const { isFile, name } = entry;\n\n if (isFile) {\n const file = await getFileFromEntry(entry);\n this.files.push(file);\n return;\n }\n\n this.folders[name] = new FolderUploadNode(\n name,\n this.addFilesToUploadQueue,\n this.addFolderToUploadQueue,\n this.fileAPIOptions,\n {\n ...this.baseAPIOptions,\n ...this.fileAPIOptions,\n },\n entry,\n );\n }),\n );\n };\n\n /**\n * Recursively read an entry\n *\n * @private\n * @param {DirectoryReader} reader\n * @param {Function} resolve\n * @returns {void}\n */\n readEntry = (reader: DirectoryReader, resolve: Function) => {\n reader.readEntries(async entries => {\n // Quit recursing when there are no remaining entries.\n if (!entries.length) {\n resolve();\n return;\n }\n\n await this.createFolderUploadNodesFromEntries(entries);\n\n this.readEntry(reader, resolve);\n }, noop);\n };\n\n /**\n * Build current folder from entry\n *\n * @private\n * @returns {Promise<any>}\n */\n buildCurrentFolderFromEntry = (): Promise<any> => {\n if (!this.entry) {\n return Promise.resolve();\n }\n\n return new Promise(resolve => {\n // $FlowFixMe entry is not empty\n const reader = this.entry.createReader();\n\n this.readEntry(reader, resolve);\n });\n };\n\n /**\n * Returns the folderId\n * @returns {string}\n */\n getFolderId = (): string => {\n return this.folderId;\n };\n}\n\nexport default FolderUploadNode;\n"],"mappings":"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","ignoreList":[]}
@@ -96,22 +96,29 @@ function useSidebarMetadataFetcher(api, fileId, onError, onSuccess, isFeatureEna
96
96
  });
97
97
  }, [api, file, onApiError, onSuccess]);
98
98
  const [, setError] = React.useState();
99
- const extractSuggestions = React.useCallback(async (templateKey, scope) => {
99
+ const extractSuggestions = React.useCallback(async (templateKey, scope, agentId) => {
100
100
  const aiAPI = api.getIntelligenceAPI();
101
101
  setExtractErrorCode(null);
102
102
  let answer = null;
103
+ const customAiAgent = agentId ? {
104
+ ai_agent: {
105
+ type: 'ai_agent_id',
106
+ id: agentId
107
+ }
108
+ } : {};
109
+ const requestBody = _objectSpread({
110
+ items: [{
111
+ id: file.id,
112
+ type: file.type
113
+ }],
114
+ metadata_template: {
115
+ template_key: templateKey,
116
+ scope,
117
+ type: 'metadata_template'
118
+ }
119
+ }, customAiAgent);
103
120
  try {
104
- answer = await aiAPI.extractStructured({
105
- items: [{
106
- id: file.id,
107
- type: file.type
108
- }],
109
- metadata_template: {
110
- template_key: templateKey,
111
- scope,
112
- type: 'metadata_template'
113
- }
114
- });
121
+ answer = await aiAPI.extractStructured(requestBody);
115
122
  } catch (error) {
116
123
  // Axios makes the status code nested under the response object
117
124
  if (error.response?.status === 408) {
@@ -1 +1 @@
1
- {"version":3,"file":"useSidebarMetadataFetcher.js","names":["React","getProp","isEmpty","isUserCorrectableError","ERROR_CODE_EMPTY_METADATA_SUGGESTIONS","ERROR_CODE_FETCH_METADATA_SUGGESTIONS","ERROR_CODE_METADATA_AUTOFILL_TIMEOUT","ERROR_CODE_UNKNOWN","ERROR_CODE_METADATA_PRECONDITION_FAILED","FIELD_IS_EXTERNALLY_OWNED","FIELD_PERMISSIONS_CAN_UPLOAD","FIELD_PERMISSIONS","SUCCESS_CODE_UPDATE_METADATA_TEMPLATE_INSTANCE","SUCCESS_CODE_DELETE_METADATA_TEMPLATE_INSTANCE","messages","STATUS","useSidebarMetadataFetcher","api","fileId","onError","onSuccess","isFeatureEnabled","status","setStatus","useState","IDLE","file","setFile","templates","setTemplates","errorMessage","setErrorMessage","templateInstances","setTemplateInstances","extractErrorCode","setExtractErrorCode","onApiError","useCallback","error","code","message","errorStatus","isValidError","ERROR","isErrorDisplayed","fetchMetadataSuccessCallback","fetchedTemplates","fetchedTemplateInstances","SUCCESS","fetchMetadataErrorCallback","e","sidebarMetadataFetchingErrorContent","fetchMetadata","fetchedFile","getMetadataAPI","getMetadata","refreshCache","fetchFileSuccessCallback","currentFile","currentFileCanUpload","newFileCanUpload","shouldFetchMetadata","fetchFileErrorCallback","undefined","sidebarMetadataEditingErrorContent","handleDeleteMetadataInstance","metadataInstance","LOADING","deleteMetadata","handleCreateMetadataInstance","templateInstance","successCallback","createMetadataRedesign","handleUpdateMetadataInstance","JSONPatch","updateMetadataRedesign","setError","extractSuggestions","templateKey","scope","aiAPI","getIntelligenceAPI","answer","extractStructured","items","id","type","metadata_template","template_key","response","showNotification","Error","find","template","fields","map","field","value","key","_objectSpread","aiSuggestion","useEffect","getFileAPI","getFile","clearExtractError"],"sources":["../../../../src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.ts"],"sourcesContent":["import * as React from 'react';\nimport getProp from 'lodash/get';\nimport { type MessageDescriptor } from 'react-intl';\nimport {\n type JSONPatchOperations,\n type MetadataTemplate,\n type MetadataTemplateInstance,\n type MetadataTemplateField,\n type MetadataFieldValue,\n} from '@box/metadata-editor';\nimport isEmpty from 'lodash/isEmpty';\nimport API from '../../../api';\nimport { type ElementsXhrError } from '../../../common/types/api';\nimport { isUserCorrectableError } from '../../../utils/error';\nimport {\n ERROR_CODE_EMPTY_METADATA_SUGGESTIONS,\n ERROR_CODE_FETCH_METADATA_SUGGESTIONS,\n ERROR_CODE_METADATA_AUTOFILL_TIMEOUT,\n ERROR_CODE_UNKNOWN,\n ERROR_CODE_METADATA_PRECONDITION_FAILED,\n FIELD_IS_EXTERNALLY_OWNED,\n FIELD_PERMISSIONS_CAN_UPLOAD,\n FIELD_PERMISSIONS,\n SUCCESS_CODE_UPDATE_METADATA_TEMPLATE_INSTANCE,\n SUCCESS_CODE_DELETE_METADATA_TEMPLATE_INSTANCE,\n} from '../../../constants';\n\nimport messages from '../../common/messages';\n\nimport { type BoxItem } from '../../../common/types/core';\nimport { type ErrorContextProps, type ExternalProps, type SuccessContextProps } from '../MetadataSidebarRedesign';\n\nexport enum STATUS {\n IDLE = 'idle',\n LOADING = 'loading',\n ERROR = 'error',\n SUCCESS = 'success',\n}\n\ninterface DataFetcher {\n clearExtractError: () => void;\n errorMessage: MessageDescriptor | null;\n extractErrorCode:\n | ERROR_CODE_METADATA_AUTOFILL_TIMEOUT\n | ERROR_CODE_METADATA_PRECONDITION_FAILED\n | ERROR_CODE_UNKNOWN\n | null;\n extractSuggestions: (templateKey: string, scope: string) => Promise<MetadataTemplateField[]>;\n file: BoxItem | null;\n handleCreateMetadataInstance: (\n templateInstance: MetadataTemplateInstance,\n successCallback: () => void,\n ) => Promise<void>;\n handleDeleteMetadataInstance: (metadataInstance: MetadataTemplateInstance) => Promise<void>;\n handleUpdateMetadataInstance: (\n metadataTemplateInstance: MetadataTemplateInstance,\n JSONPatch: Array<Object>,\n successCallback: () => void,\n ) => Promise<void>;\n status: STATUS;\n templateInstances: Array<MetadataTemplateInstance>;\n templates: Array<MetadataTemplate>;\n}\n\nfunction useSidebarMetadataFetcher(\n api: API,\n fileId: string,\n onError: ErrorContextProps['onError'],\n onSuccess: SuccessContextProps['onSuccess'],\n isFeatureEnabled: ExternalProps['isFeatureEnabled'],\n): DataFetcher {\n const [status, setStatus] = React.useState<STATUS>(STATUS.IDLE);\n const [file, setFile] = React.useState<BoxItem>(null);\n const [templates, setTemplates] = React.useState(null);\n const [errorMessage, setErrorMessage] = React.useState<MessageDescriptor | null>(null);\n const [templateInstances, setTemplateInstances] = React.useState<Array<MetadataTemplateInstance>>([]);\n const [extractErrorCode, setExtractErrorCode] = React.useState<string | null>(null);\n\n const onApiError = React.useCallback(\n (error: ElementsXhrError, code: string, message: MessageDescriptor) => {\n const { status: errorStatus } = error;\n const isValidError = isUserCorrectableError(errorStatus);\n setStatus(STATUS.ERROR);\n setErrorMessage(message);\n onError(error, code, {\n error,\n isErrorDisplayed: isValidError,\n });\n },\n [onError],\n );\n\n const fetchMetadataSuccessCallback = React.useCallback(\n ({\n templates: fetchedTemplates,\n templateInstances: fetchedTemplateInstances,\n }: {\n templates: Array<MetadataTemplate>;\n templateInstances: Array<MetadataTemplateInstance>;\n }) => {\n setErrorMessage(null);\n setStatus(STATUS.SUCCESS);\n setTemplateInstances(fetchedTemplateInstances);\n setTemplates(fetchedTemplates);\n },\n [],\n );\n\n const fetchMetadataErrorCallback = React.useCallback(\n (e: ElementsXhrError, code: string) => {\n setTemplates(null);\n setTemplateInstances(null);\n onApiError(e, code, messages.sidebarMetadataFetchingErrorContent);\n },\n [onApiError],\n );\n\n const fetchMetadata = React.useCallback(\n (fetchedFile: BoxItem) => {\n api.getMetadataAPI(false).getMetadata(\n fetchedFile,\n fetchMetadataSuccessCallback,\n fetchMetadataErrorCallback,\n isFeatureEnabled,\n { refreshCache: true },\n true,\n );\n },\n [api, fetchMetadataErrorCallback, fetchMetadataSuccessCallback, isFeatureEnabled],\n );\n\n const fetchFileSuccessCallback = React.useCallback(\n (fetchedFile: BoxItem) => {\n const { currentFile } = file ?? {};\n const currentFileCanUpload = getProp(currentFile, FIELD_PERMISSIONS_CAN_UPLOAD, false);\n const newFileCanUpload = getProp(fetchedFile, FIELD_PERMISSIONS_CAN_UPLOAD, false);\n const shouldFetchMetadata = !currentFile || currentFileCanUpload !== newFileCanUpload;\n setFile(fetchedFile);\n if (shouldFetchMetadata && fetchedFile) {\n fetchMetadata(fetchedFile);\n } else {\n setStatus(STATUS.SUCCESS);\n }\n },\n [fetchMetadata, file],\n );\n\n const fetchFileErrorCallback = React.useCallback(\n (e: ElementsXhrError, code: string) => {\n setFile(undefined);\n onApiError(e, code, messages.sidebarMetadataEditingErrorContent);\n },\n [onApiError],\n );\n\n const handleDeleteMetadataInstance = React.useCallback(\n async (metadataInstance: MetadataTemplateInstance): Promise<void> => {\n if (!file || !metadataInstance) {\n return;\n }\n setStatus(STATUS.LOADING);\n await api.getMetadataAPI(false).deleteMetadata(\n file,\n metadataInstance,\n () => {\n setStatus(STATUS.SUCCESS);\n onSuccess(SUCCESS_CODE_DELETE_METADATA_TEMPLATE_INSTANCE, true);\n },\n (error: ElementsXhrError, code: string) => {\n onApiError(error, code, messages.sidebarMetadataEditingErrorContent);\n },\n true,\n );\n },\n [api, onApiError, onSuccess, file],\n );\n\n const handleCreateMetadataInstance = React.useCallback(\n async (templateInstance: MetadataTemplateInstance, successCallback: () => void): Promise<void> => {\n await api\n .getMetadataAPI(false)\n .createMetadataRedesign(\n file,\n templateInstance,\n successCallback,\n (error: ElementsXhrError, code: string) =>\n onApiError(error, code, messages.sidebarMetadataEditingErrorContent),\n );\n },\n [api, file, onApiError],\n );\n\n const handleUpdateMetadataInstance = React.useCallback(\n async (\n metadataInstance: MetadataTemplateInstance,\n JSONPatch: JSONPatchOperations,\n successCallback: () => void,\n ) => {\n await api.getMetadataAPI(false).updateMetadataRedesign(\n file,\n metadataInstance,\n JSONPatch,\n () => {\n successCallback();\n onSuccess(SUCCESS_CODE_UPDATE_METADATA_TEMPLATE_INSTANCE, true);\n },\n (error: ElementsXhrError, code: string) => {\n onApiError(error, code, messages.sidebarMetadataEditingErrorContent);\n },\n );\n },\n [api, file, onApiError, onSuccess],\n );\n\n const [, setError] = React.useState();\n const extractSuggestions = React.useCallback(\n async (templateKey: string, scope: string): Promise<MetadataTemplateField[]> => {\n const aiAPI = api.getIntelligenceAPI();\n setExtractErrorCode(null);\n\n let answer = null;\n try {\n answer = (await aiAPI.extractStructured({\n items: [{ id: file.id, type: file.type }],\n metadata_template: { template_key: templateKey, scope, type: 'metadata_template' },\n })) as Record<string, MetadataFieldValue>;\n } catch (error) {\n // Axios makes the status code nested under the response object\n if (error.response?.status === 408) {\n onError(error, ERROR_CODE_METADATA_AUTOFILL_TIMEOUT);\n setExtractErrorCode(ERROR_CODE_METADATA_AUTOFILL_TIMEOUT);\n } else if (error.response?.status === 412) {\n onError(error, ERROR_CODE_METADATA_PRECONDITION_FAILED);\n setExtractErrorCode(ERROR_CODE_METADATA_PRECONDITION_FAILED);\n } else if (error.response?.status === 500) {\n onError(error, ERROR_CODE_UNKNOWN);\n setExtractErrorCode(ERROR_CODE_UNKNOWN);\n } else if (isUserCorrectableError(error.response?.status)) {\n onError(error, ERROR_CODE_FETCH_METADATA_SUGGESTIONS, { showNotification: true });\n } else {\n onError(error, ERROR_CODE_UNKNOWN, { showNotification: true });\n // react way of throwing errors from async callbacks - https://github.com/facebook/react/issues/14981#issuecomment-468460187\n setError(() => {\n throw error;\n });\n }\n return [];\n }\n\n if (isEmpty(answer)) {\n const error = new Error('No suggestions found.');\n onError(error, ERROR_CODE_EMPTY_METADATA_SUGGESTIONS, { showNotification: true });\n return [];\n }\n\n const templateInstance = templates.find(template => template.templateKey === templateKey && template.scope);\n const fields = templateInstance?.fields || [];\n\n return fields.map(field => {\n const value = answer[field.key];\n // TODO: @box/metadadata-editor does not support AI suggestions, enable once supported\n if (!value || field.type === 'taxonomy') {\n return field;\n }\n return {\n ...field,\n aiSuggestion: value,\n };\n });\n },\n [api, file, onError, templates],\n );\n\n React.useEffect(() => {\n if (status === STATUS.IDLE) {\n setStatus(STATUS.LOADING);\n api.getFileAPI().getFile(fileId, fetchFileSuccessCallback, fetchFileErrorCallback, {\n fields: [FIELD_IS_EXTERNALLY_OWNED, FIELD_PERMISSIONS],\n refreshCache: true,\n });\n }\n }, [api, fetchFileErrorCallback, fetchFileSuccessCallback, fileId, status]);\n\n return {\n clearExtractError: () => setExtractErrorCode(null),\n extractSuggestions,\n handleCreateMetadataInstance,\n handleDeleteMetadataInstance,\n handleUpdateMetadataInstance,\n extractErrorCode,\n errorMessage,\n file,\n status,\n templateInstances,\n templates,\n };\n}\n\nexport default useSidebarMetadataFetcher;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useSidebarMetadataFetcher.js","names":["React","getProp","isEmpty","isUserCorrectableError","ERROR_CODE_EMPTY_METADATA_SUGGESTIONS","ERROR_CODE_FETCH_METADATA_SUGGESTIONS","ERROR_CODE_METADATA_AUTOFILL_TIMEOUT","ERROR_CODE_UNKNOWN","ERROR_CODE_METADATA_PRECONDITION_FAILED","FIELD_IS_EXTERNALLY_OWNED","FIELD_PERMISSIONS_CAN_UPLOAD","FIELD_PERMISSIONS","SUCCESS_CODE_UPDATE_METADATA_TEMPLATE_INSTANCE","SUCCESS_CODE_DELETE_METADATA_TEMPLATE_INSTANCE","messages","STATUS","useSidebarMetadataFetcher","api","fileId","onError","onSuccess","isFeatureEnabled","status","setStatus","useState","IDLE","file","setFile","templates","setTemplates","errorMessage","setErrorMessage","templateInstances","setTemplateInstances","extractErrorCode","setExtractErrorCode","onApiError","useCallback","error","code","message","errorStatus","isValidError","ERROR","isErrorDisplayed","fetchMetadataSuccessCallback","fetchedTemplates","fetchedTemplateInstances","SUCCESS","fetchMetadataErrorCallback","e","sidebarMetadataFetchingErrorContent","fetchMetadata","fetchedFile","getMetadataAPI","getMetadata","refreshCache","fetchFileSuccessCallback","currentFile","currentFileCanUpload","newFileCanUpload","shouldFetchMetadata","fetchFileErrorCallback","undefined","sidebarMetadataEditingErrorContent","handleDeleteMetadataInstance","metadataInstance","LOADING","deleteMetadata","handleCreateMetadataInstance","templateInstance","successCallback","createMetadataRedesign","handleUpdateMetadataInstance","JSONPatch","updateMetadataRedesign","setError","extractSuggestions","templateKey","scope","agentId","aiAPI","getIntelligenceAPI","answer","customAiAgent","ai_agent","type","id","requestBody","_objectSpread","items","metadata_template","template_key","extractStructured","response","showNotification","Error","find","template","fields","map","field","value","key","aiSuggestion","useEffect","getFileAPI","getFile","clearExtractError"],"sources":["../../../../src/elements/content-sidebar/hooks/useSidebarMetadataFetcher.ts"],"sourcesContent":["import * as React from 'react';\nimport getProp from 'lodash/get';\nimport { type MessageDescriptor } from 'react-intl';\nimport {\n type JSONPatchOperations,\n type MetadataTemplate,\n type MetadataTemplateInstance,\n type MetadataTemplateField,\n type MetadataFieldValue,\n} from '@box/metadata-editor';\nimport isEmpty from 'lodash/isEmpty';\nimport API from '../../../api';\nimport { type ElementsXhrError } from '../../../common/types/api';\nimport { isUserCorrectableError } from '../../../utils/error';\nimport {\n ERROR_CODE_EMPTY_METADATA_SUGGESTIONS,\n ERROR_CODE_FETCH_METADATA_SUGGESTIONS,\n ERROR_CODE_METADATA_AUTOFILL_TIMEOUT,\n ERROR_CODE_UNKNOWN,\n ERROR_CODE_METADATA_PRECONDITION_FAILED,\n FIELD_IS_EXTERNALLY_OWNED,\n FIELD_PERMISSIONS_CAN_UPLOAD,\n FIELD_PERMISSIONS,\n SUCCESS_CODE_UPDATE_METADATA_TEMPLATE_INSTANCE,\n SUCCESS_CODE_DELETE_METADATA_TEMPLATE_INSTANCE,\n} from '../../../constants';\n\nimport messages from '../../common/messages';\n\nimport { type BoxItem } from '../../../common/types/core';\nimport { type ErrorContextProps, type ExternalProps, type SuccessContextProps } from '../MetadataSidebarRedesign';\nimport { type AiExtractStructured } from '../../../api/schemas/AiExtractStructured';\n\nexport enum STATUS {\n IDLE = 'idle',\n LOADING = 'loading',\n ERROR = 'error',\n SUCCESS = 'success',\n}\n\ninterface DataFetcher {\n clearExtractError: () => void;\n errorMessage: MessageDescriptor | null;\n extractErrorCode:\n | ERROR_CODE_METADATA_AUTOFILL_TIMEOUT\n | ERROR_CODE_METADATA_PRECONDITION_FAILED\n | ERROR_CODE_UNKNOWN\n | null;\n extractSuggestions: (templateKey: string, scope: string, agentId?: string) => Promise<MetadataTemplateField[]>;\n file: BoxItem | null;\n handleCreateMetadataInstance: (\n templateInstance: MetadataTemplateInstance,\n successCallback: () => void,\n ) => Promise<void>;\n handleDeleteMetadataInstance: (metadataInstance: MetadataTemplateInstance) => Promise<void>;\n handleUpdateMetadataInstance: (\n metadataTemplateInstance: MetadataTemplateInstance,\n JSONPatch: Array<Object>,\n successCallback: () => void,\n ) => Promise<void>;\n status: STATUS;\n templateInstances: Array<MetadataTemplateInstance>;\n templates: Array<MetadataTemplate>;\n}\n\nfunction useSidebarMetadataFetcher(\n api: API,\n fileId: string,\n onError: ErrorContextProps['onError'],\n onSuccess: SuccessContextProps['onSuccess'],\n isFeatureEnabled: ExternalProps['isFeatureEnabled'],\n): DataFetcher {\n const [status, setStatus] = React.useState<STATUS>(STATUS.IDLE);\n const [file, setFile] = React.useState<BoxItem>(null);\n const [templates, setTemplates] = React.useState(null);\n const [errorMessage, setErrorMessage] = React.useState<MessageDescriptor | null>(null);\n const [templateInstances, setTemplateInstances] = React.useState<Array<MetadataTemplateInstance>>([]);\n const [extractErrorCode, setExtractErrorCode] = React.useState<string | null>(null);\n\n const onApiError = React.useCallback(\n (error: ElementsXhrError, code: string, message: MessageDescriptor) => {\n const { status: errorStatus } = error;\n const isValidError = isUserCorrectableError(errorStatus);\n setStatus(STATUS.ERROR);\n setErrorMessage(message);\n onError(error, code, {\n error,\n isErrorDisplayed: isValidError,\n });\n },\n [onError],\n );\n\n const fetchMetadataSuccessCallback = React.useCallback(\n ({\n templates: fetchedTemplates,\n templateInstances: fetchedTemplateInstances,\n }: {\n templates: Array<MetadataTemplate>;\n templateInstances: Array<MetadataTemplateInstance>;\n }) => {\n setErrorMessage(null);\n setStatus(STATUS.SUCCESS);\n setTemplateInstances(fetchedTemplateInstances);\n setTemplates(fetchedTemplates);\n },\n [],\n );\n\n const fetchMetadataErrorCallback = React.useCallback(\n (e: ElementsXhrError, code: string) => {\n setTemplates(null);\n setTemplateInstances(null);\n onApiError(e, code, messages.sidebarMetadataFetchingErrorContent);\n },\n [onApiError],\n );\n\n const fetchMetadata = React.useCallback(\n (fetchedFile: BoxItem) => {\n api.getMetadataAPI(false).getMetadata(\n fetchedFile,\n fetchMetadataSuccessCallback,\n fetchMetadataErrorCallback,\n isFeatureEnabled,\n { refreshCache: true },\n true,\n );\n },\n [api, fetchMetadataErrorCallback, fetchMetadataSuccessCallback, isFeatureEnabled],\n );\n\n const fetchFileSuccessCallback = React.useCallback(\n (fetchedFile: BoxItem) => {\n const { currentFile } = file ?? {};\n const currentFileCanUpload = getProp(currentFile, FIELD_PERMISSIONS_CAN_UPLOAD, false);\n const newFileCanUpload = getProp(fetchedFile, FIELD_PERMISSIONS_CAN_UPLOAD, false);\n const shouldFetchMetadata = !currentFile || currentFileCanUpload !== newFileCanUpload;\n setFile(fetchedFile);\n if (shouldFetchMetadata && fetchedFile) {\n fetchMetadata(fetchedFile);\n } else {\n setStatus(STATUS.SUCCESS);\n }\n },\n [fetchMetadata, file],\n );\n\n const fetchFileErrorCallback = React.useCallback(\n (e: ElementsXhrError, code: string) => {\n setFile(undefined);\n onApiError(e, code, messages.sidebarMetadataEditingErrorContent);\n },\n [onApiError],\n );\n\n const handleDeleteMetadataInstance = React.useCallback(\n async (metadataInstance: MetadataTemplateInstance): Promise<void> => {\n if (!file || !metadataInstance) {\n return;\n }\n setStatus(STATUS.LOADING);\n await api.getMetadataAPI(false).deleteMetadata(\n file,\n metadataInstance,\n () => {\n setStatus(STATUS.SUCCESS);\n onSuccess(SUCCESS_CODE_DELETE_METADATA_TEMPLATE_INSTANCE, true);\n },\n (error: ElementsXhrError, code: string) => {\n onApiError(error, code, messages.sidebarMetadataEditingErrorContent);\n },\n true,\n );\n },\n [api, onApiError, onSuccess, file],\n );\n\n const handleCreateMetadataInstance = React.useCallback(\n async (templateInstance: MetadataTemplateInstance, successCallback: () => void): Promise<void> => {\n await api\n .getMetadataAPI(false)\n .createMetadataRedesign(\n file,\n templateInstance,\n successCallback,\n (error: ElementsXhrError, code: string) =>\n onApiError(error, code, messages.sidebarMetadataEditingErrorContent),\n );\n },\n [api, file, onApiError],\n );\n\n const handleUpdateMetadataInstance = React.useCallback(\n async (\n metadataInstance: MetadataTemplateInstance,\n JSONPatch: JSONPatchOperations,\n successCallback: () => void,\n ) => {\n await api.getMetadataAPI(false).updateMetadataRedesign(\n file,\n metadataInstance,\n JSONPatch,\n () => {\n successCallback();\n onSuccess(SUCCESS_CODE_UPDATE_METADATA_TEMPLATE_INSTANCE, true);\n },\n (error: ElementsXhrError, code: string) => {\n onApiError(error, code, messages.sidebarMetadataEditingErrorContent);\n },\n );\n },\n [api, file, onApiError, onSuccess],\n );\n\n const [, setError] = React.useState();\n const extractSuggestions = React.useCallback(\n async (templateKey: string, scope: string, agentId?: string): Promise<MetadataTemplateField[]> => {\n const aiAPI = api.getIntelligenceAPI();\n setExtractErrorCode(null);\n let answer = null;\n const customAiAgent = agentId ? { ai_agent: { type: 'ai_agent_id', id: agentId } } : {};\n const requestBody: AiExtractStructured = {\n items: [{ id: file.id, type: file.type }],\n metadata_template: { template_key: templateKey, scope, type: 'metadata_template' },\n ...customAiAgent,\n };\n\n try {\n answer = (await aiAPI.extractStructured(requestBody)) as Record<string, MetadataFieldValue>;\n } catch (error) {\n // Axios makes the status code nested under the response object\n if (error.response?.status === 408) {\n onError(error, ERROR_CODE_METADATA_AUTOFILL_TIMEOUT);\n setExtractErrorCode(ERROR_CODE_METADATA_AUTOFILL_TIMEOUT);\n } else if (error.response?.status === 412) {\n onError(error, ERROR_CODE_METADATA_PRECONDITION_FAILED);\n setExtractErrorCode(ERROR_CODE_METADATA_PRECONDITION_FAILED);\n } else if (error.response?.status === 500) {\n onError(error, ERROR_CODE_UNKNOWN);\n setExtractErrorCode(ERROR_CODE_UNKNOWN);\n } else if (isUserCorrectableError(error.response?.status)) {\n onError(error, ERROR_CODE_FETCH_METADATA_SUGGESTIONS, { showNotification: true });\n } else {\n onError(error, ERROR_CODE_UNKNOWN, { showNotification: true });\n // react way of throwing errors from async callbacks - https://github.com/facebook/react/issues/14981#issuecomment-468460187\n setError(() => {\n throw error;\n });\n }\n return [];\n }\n\n if (isEmpty(answer)) {\n const error = new Error('No suggestions found.');\n onError(error, ERROR_CODE_EMPTY_METADATA_SUGGESTIONS, { showNotification: true });\n return [];\n }\n\n const templateInstance = templates.find(template => template.templateKey === templateKey && template.scope);\n const fields = templateInstance?.fields || [];\n\n return fields.map(field => {\n const value = answer[field.key];\n // TODO: @box/metadadata-editor does not support AI suggestions, enable once supported\n if (!value || field.type === 'taxonomy') {\n return field;\n }\n return {\n ...field,\n aiSuggestion: value,\n };\n });\n },\n [api, file, onError, templates],\n );\n\n React.useEffect(() => {\n if (status === STATUS.IDLE) {\n setStatus(STATUS.LOADING);\n api.getFileAPI().getFile(fileId, fetchFileSuccessCallback, fetchFileErrorCallback, {\n fields: [FIELD_IS_EXTERNALLY_OWNED, FIELD_PERMISSIONS],\n refreshCache: true,\n });\n }\n }, [api, fetchFileErrorCallback, fetchFileSuccessCallback, fileId, status]);\n\n return {\n clearExtractError: () => setExtractErrorCode(null),\n extractSuggestions,\n handleCreateMetadataInstance,\n handleDeleteMetadataInstance,\n handleUpdateMetadataInstance,\n extractErrorCode,\n errorMessage,\n file,\n status,\n templateInstances,\n templates,\n };\n}\n\nexport default useSidebarMetadataFetcher;\n"],"mappings":"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","ignoreList":[]}
@@ -9,7 +9,7 @@ import IntegerMetadataField from './IntegerMetadataField';
9
9
  import MultiSelectMetadataField from './MultiSelectMetadataField';
10
10
  import ReadOnlyMetadataField from './ReadOnlyMetadataField';
11
11
  import messages from './messages';
12
- import { FIELD_TYPE_ENUM, FIELD_TYPE_FLOAT, FIELD_TYPE_INTEGER, FIELD_TYPE_STRING, FIELD_TYPE_DATE, FIELD_TYPE_MULTISELECT } from './constants';
12
+ import { FIELD_TYPE_ENUM, FIELD_TYPE_FLOAT, FIELD_TYPE_INTEGER, FIELD_TYPE_STRING, FIELD_TYPE_DATE, FIELD_TYPE_MULTISELECT, FIELD_TYPE_TAXONOMY } from './constants';
13
13
  const MetadataField = ({
14
14
  blurExceptionClassNames,
15
15
  dataKey,
@@ -108,6 +108,17 @@ const MetadataField = ({
108
108
  onChange: onChange,
109
109
  onRemove: onRemove
110
110
  });
111
+
112
+ // The taxonomy field is a valid field type which,
113
+ // although not yet supported here, should not trigger an error message.
114
+ // For this reason, we are currently setting it to read-only.
115
+ case FIELD_TYPE_TAXONOMY:
116
+ return /*#__PURE__*/React.createElement(ReadOnlyMetadataField, {
117
+ dataValue: dataValue,
118
+ description: description,
119
+ displayName: displayName,
120
+ type: type
121
+ });
111
122
  default:
112
123
  return /*#__PURE__*/React.createElement(InlineError, {
113
124
  title: type
@@ -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}>
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataField.js","names":["React","FormattedMessage","InlineError","TextMetadataField","EnumMetadataField","DateMetadataField","FloatMetadataField","IntegerMetadataField","MultiSelectMetadataField","ReadOnlyMetadataField","messages","FIELD_TYPE_ENUM","FIELD_TYPE_FLOAT","FIELD_TYPE_INTEGER","FIELD_TYPE_STRING","FIELD_TYPE_DATE","FIELD_TYPE_MULTISELECT","MetadataField","blurExceptionClassNames","dataKey","dataValue","displayName","description","error","isDisabled","isHidden","canEdit","onChange","onRemove","options","type","createElement","Error","title","invalidMetadataFieldType"],"sources":["../../../src/features/metadata-instance-fields/MetadataField.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport InlineError from '../../components/inline-error/InlineError';\n\nimport TextMetadataField from './TextMetadataField';\nimport EnumMetadataField from './EnumMetadataField';\nimport DateMetadataField from './DateMetadataField';\nimport FloatMetadataField from './FloatMetadataField';\nimport IntegerMetadataField from './IntegerMetadataField';\nimport MultiSelectMetadataField from './MultiSelectMetadataField';\nimport ReadOnlyMetadataField from './ReadOnlyMetadataField';\nimport messages from './messages';\nimport type { MetadataFieldValue, MetadataTemplateFieldOption, MetadataFieldType } from '../../common/types/metadata';\n\nimport {\n FIELD_TYPE_ENUM,\n FIELD_TYPE_FLOAT,\n FIELD_TYPE_INTEGER,\n FIELD_TYPE_STRING,\n FIELD_TYPE_DATE,\n FIELD_TYPE_MULTISELECT,\n} from './constants';\n\ntype Props = {\n blurExceptionClassNames?: Array<string>,\n canEdit: boolean,\n dataKey: string,\n dataValue?: MetadataFieldValue,\n description?: string,\n displayName: string,\n error?: React.Node,\n isDisabled?: boolean,\n isHidden?: boolean,\n onChange?: (key: string, value: MetadataFieldValue) => void,\n onRemove?: (key: string) => void,\n options?: Array<MetadataTemplateFieldOption>,\n type: MetadataFieldType,\n};\n\nconst MetadataField = ({\n blurExceptionClassNames,\n dataKey,\n dataValue,\n displayName,\n description,\n error,\n isDisabled,\n isHidden,\n canEdit,\n onChange,\n onRemove,\n options,\n type,\n}: Props) => {\n if (isHidden) {\n return null;\n }\n\n if (!canEdit) {\n return (\n <ReadOnlyMetadataField\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n type={type}\n />\n );\n }\n\n if (!onChange || !onRemove) {\n throw new Error('Need to have onChange and onRemove');\n }\n\n switch (type) {\n case FIELD_TYPE_STRING:\n return (\n <TextMetadataField\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n />\n );\n\n case FIELD_TYPE_FLOAT:\n return (\n <FloatMetadataField\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n error={error}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n type={type}\n />\n );\n\n case FIELD_TYPE_INTEGER:\n return (\n <IntegerMetadataField\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n error={error}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n type={type}\n />\n );\n\n case FIELD_TYPE_ENUM:\n return (\n <EnumMetadataField\n blurExceptionClassNames={blurExceptionClassNames}\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n options={options}\n />\n );\n\n case FIELD_TYPE_MULTISELECT:\n return (\n <MultiSelectMetadataField\n blurExceptionClassNames={blurExceptionClassNames}\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n options={options}\n />\n );\n\n case FIELD_TYPE_DATE:\n return (\n <DateMetadataField\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n />\n );\n\n default:\n return (\n <InlineError title={type}>\n <FormattedMessage {...messages.invalidMetadataFieldType} />\n </InlineError>\n );\n }\n};\n\nexport default MetadataField;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MetadataField.js","names":["React","FormattedMessage","InlineError","TextMetadataField","EnumMetadataField","DateMetadataField","FloatMetadataField","IntegerMetadataField","MultiSelectMetadataField","ReadOnlyMetadataField","messages","FIELD_TYPE_ENUM","FIELD_TYPE_FLOAT","FIELD_TYPE_INTEGER","FIELD_TYPE_STRING","FIELD_TYPE_DATE","FIELD_TYPE_MULTISELECT","FIELD_TYPE_TAXONOMY","MetadataField","blurExceptionClassNames","dataKey","dataValue","displayName","description","error","isDisabled","isHidden","canEdit","onChange","onRemove","options","type","createElement","Error","title","invalidMetadataFieldType"],"sources":["../../../src/features/metadata-instance-fields/MetadataField.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\nimport InlineError from '../../components/inline-error/InlineError';\n\nimport TextMetadataField from './TextMetadataField';\nimport EnumMetadataField from './EnumMetadataField';\nimport DateMetadataField from './DateMetadataField';\nimport FloatMetadataField from './FloatMetadataField';\nimport IntegerMetadataField from './IntegerMetadataField';\nimport MultiSelectMetadataField from './MultiSelectMetadataField';\nimport ReadOnlyMetadataField from './ReadOnlyMetadataField';\nimport messages from './messages';\nimport type { MetadataFieldValue, MetadataTemplateFieldOption, MetadataFieldType } from '../../common/types/metadata';\n\nimport {\n FIELD_TYPE_ENUM,\n FIELD_TYPE_FLOAT,\n FIELD_TYPE_INTEGER,\n FIELD_TYPE_STRING,\n FIELD_TYPE_DATE,\n FIELD_TYPE_MULTISELECT,\n FIELD_TYPE_TAXONOMY,\n} from './constants';\n\ntype Props = {\n blurExceptionClassNames?: Array<string>,\n canEdit: boolean,\n dataKey: string,\n dataValue?: MetadataFieldValue,\n description?: string,\n displayName: string,\n error?: React.Node,\n isDisabled?: boolean,\n isHidden?: boolean,\n onChange?: (key: string, value: MetadataFieldValue) => void,\n onRemove?: (key: string) => void,\n options?: Array<MetadataTemplateFieldOption>,\n type: MetadataFieldType,\n};\n\nconst MetadataField = ({\n blurExceptionClassNames,\n dataKey,\n dataValue,\n displayName,\n description,\n error,\n isDisabled,\n isHidden,\n canEdit,\n onChange,\n onRemove,\n options,\n type,\n}: Props) => {\n if (isHidden) {\n return null;\n }\n\n if (!canEdit) {\n return (\n <ReadOnlyMetadataField\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n type={type}\n />\n );\n }\n\n if (!onChange || !onRemove) {\n throw new Error('Need to have onChange and onRemove');\n }\n\n switch (type) {\n case FIELD_TYPE_STRING:\n return (\n <TextMetadataField\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n />\n );\n\n case FIELD_TYPE_FLOAT:\n return (\n <FloatMetadataField\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n error={error}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n type={type}\n />\n );\n\n case FIELD_TYPE_INTEGER:\n return (\n <IntegerMetadataField\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n error={error}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n type={type}\n />\n );\n\n case FIELD_TYPE_ENUM:\n return (\n <EnumMetadataField\n blurExceptionClassNames={blurExceptionClassNames}\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n options={options}\n />\n );\n\n case FIELD_TYPE_MULTISELECT:\n return (\n <MultiSelectMetadataField\n blurExceptionClassNames={blurExceptionClassNames}\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n options={options}\n />\n );\n\n case FIELD_TYPE_DATE:\n return (\n <DateMetadataField\n dataKey={dataKey}\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n isDisabled={isDisabled}\n onChange={onChange}\n onRemove={onRemove}\n />\n );\n\n // The taxonomy field is a valid field type which,\n // although not yet supported here, should not trigger an error message.\n // For this reason, we are currently setting it to read-only.\n case FIELD_TYPE_TAXONOMY:\n return (\n <ReadOnlyMetadataField\n dataValue={dataValue}\n description={description}\n displayName={displayName}\n type={type}\n />\n );\n\n default:\n return (\n <InlineError title={type}>\n <FormattedMessage {...messages.invalidMetadataFieldType} />\n </InlineError>\n );\n }\n};\n\nexport default MetadataField;\n"],"mappings":"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","ignoreList":[]}
@@ -14,7 +14,7 @@ interface DataFetcher {
14
14
  clearExtractError: () => void;
15
15
  errorMessage: MessageDescriptor | null;
16
16
  extractErrorCode: ERROR_CODE_METADATA_AUTOFILL_TIMEOUT | ERROR_CODE_METADATA_PRECONDITION_FAILED | ERROR_CODE_UNKNOWN | null;
17
- extractSuggestions: (templateKey: string, scope: string) => Promise<MetadataTemplateField[]>;
17
+ extractSuggestions: (templateKey: string, scope: string, agentId?: string) => Promise<MetadataTemplateField[]>;
18
18
  file: BoxItem | null;
19
19
  handleCreateMetadataInstance: (templateInstance: MetadataTemplateInstance, successCallback: () => void) => Promise<void>;
20
20
  handleDeleteMetadataInstance: (metadataInstance: MetadataTemplateInstance) => Promise<void>;
@@ -0,0 +1,3 @@
1
+ const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
2
+ export default sleep;
3
+ //# sourceMappingURL=sleep.js.map
@@ -0,0 +1,2 @@
1
+ const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
2
+ export default sleep;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","names":["sleep","ms","Promise","resolve","setTimeout"],"sources":["../../src/utils/sleep.js"],"sourcesContent":["const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));\nexport default sleep;\n"],"mappings":"AAAA,MAAMA,KAAK,GAAGC,EAAE,IAAI,IAAIC,OAAO,CAACC,OAAO,IAAIC,UAAU,CAACD,OAAO,EAAEF,EAAE,CAAC,CAAC;AACnE,eAAeD,KAAK","ignoreList":[]}