box-ui-elements 23.4.0-beta.31 → 23.4.0-beta.32

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 (59) hide show
  1. package/dist/explorer.js +1 -1
  2. package/dist/openwith.js +1 -1
  3. package/dist/picker.js +1 -1
  4. package/dist/preview.js +1 -1
  5. package/dist/sharing.js +1 -1
  6. package/dist/sidebar.js +1 -1
  7. package/dist/uploader.js +1 -1
  8. package/es/common/types/metadata.js.flow +6 -0
  9. package/es/common/types/metadata.js.map +1 -1
  10. package/es/features/metadata-instance-editor/CascadePolicy.js +40 -20
  11. package/es/features/metadata-instance-editor/CascadePolicy.js.flow +52 -24
  12. package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
  13. package/es/features/metadata-instance-editor/Instance.js +24 -2
  14. package/es/features/metadata-instance-editor/Instance.js.flow +31 -1
  15. package/es/features/metadata-instance-editor/Instance.js.map +1 -1
  16. package/es/features/metadata-instance-editor/constants.js +4 -1
  17. package/es/features/metadata-instance-editor/constants.js.flow +10 -1
  18. package/es/features/metadata-instance-editor/constants.js.map +1 -1
  19. package/es/features/metadata-instance-editor/messages.js +8 -0
  20. package/es/features/metadata-instance-editor/messages.js.flow +10 -0
  21. package/es/features/metadata-instance-editor/messages.js.map +1 -1
  22. package/i18n/bn-IN.js +2 -0
  23. package/i18n/da-DK.js +2 -0
  24. package/i18n/de-DE.js +2 -0
  25. package/i18n/en-AU.js +2 -0
  26. package/i18n/en-CA.js +2 -0
  27. package/i18n/en-GB.js +2 -0
  28. package/i18n/en-US.js +2 -0
  29. package/i18n/en-US.properties +4 -0
  30. package/i18n/en-x-pseudo.js +2 -0
  31. package/i18n/es-419.js +2 -0
  32. package/i18n/es-ES.js +2 -0
  33. package/i18n/fi-FI.js +2 -0
  34. package/i18n/fr-CA.js +2 -0
  35. package/i18n/fr-FR.js +2 -0
  36. package/i18n/hi-IN.js +2 -0
  37. package/i18n/it-IT.js +2 -0
  38. package/i18n/ja-JP.js +2 -0
  39. package/i18n/ko-KR.js +2 -0
  40. package/i18n/nb-NO.js +2 -0
  41. package/i18n/nl-NL.js +2 -0
  42. package/i18n/pl-PL.js +2 -0
  43. package/i18n/pt-BR.js +2 -0
  44. package/i18n/ru-RU.js +2 -0
  45. package/i18n/sv-SE.js +2 -0
  46. package/i18n/tr-TR.js +2 -0
  47. package/i18n/zh-CN.js +2 -0
  48. package/i18n/zh-TW.js +2 -0
  49. package/package.json +3 -3
  50. package/src/common/types/metadata.js +6 -0
  51. package/src/features/metadata-instance-editor/CascadePolicy.js +52 -24
  52. package/src/features/metadata-instance-editor/Instance.js +31 -1
  53. package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +50 -3
  54. package/src/features/metadata-instance-editor/__tests__/Instance.test.js +20 -2
  55. package/src/features/metadata-instance-editor/__tests__/Instances.test.js +15 -10
  56. package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +53 -10
  57. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +1 -0
  58. package/src/features/metadata-instance-editor/constants.js +10 -1
  59. package/src/features/metadata-instance-editor/messages.js +10 -0
@@ -93,10 +93,15 @@ type MetadataCascadePolicy = {
93
93
  cascadePolicyType?: string,
94
94
  };
95
95
 
96
+ type MetadataCascadePolicyConfiguration = {
97
+ agent: string,
98
+ };
99
+
96
100
  type MetadataCascadingPolicyData = {
97
101
  id?: string,
98
102
  isEnabled: boolean,
99
103
  overwrite: boolean,
104
+ cascadePolicyConfiguration: MetadataCascadePolicyConfiguration | null,
100
105
  };
101
106
 
102
107
  type MetadataInstance = {
@@ -187,6 +192,7 @@ export type {
187
192
  MetadataQueryInstanceTypeField,
188
193
  MetadataType,
189
194
  MetadataCascadePolicy,
195
+ MetadataCascadePolicyConfiguration,
190
196
  MetadataCascadingPolicyData,
191
197
  MetadataInstanceV2,
192
198
  MetadataEditor,
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","names":["FIELD_TYPE_DATE","FIELD_TYPE_ENUM","FIELD_TYPE_FLOAT","FIELD_TYPE_MULTISELECT","FIELD_TYPE_STRING","FIELD_TYPE_TAXONOMY"],"sources":["../../../src/common/types/metadata.js"],"sourcesContent":["// @flow strict\nimport {\n FIELD_TYPE_DATE,\n FIELD_TYPE_ENUM,\n FIELD_TYPE_FLOAT,\n FIELD_TYPE_MULTISELECT,\n FIELD_TYPE_STRING,\n FIELD_TYPE_TAXONOMY,\n} from '../../features/metadata-instance-fields/constants';\nimport type { SkillCards } from './skills';\n\ntype MetadataFieldType =\n | typeof FIELD_TYPE_DATE\n | typeof FIELD_TYPE_ENUM\n | typeof FIELD_TYPE_FLOAT\n | typeof FIELD_TYPE_MULTISELECT\n | typeof FIELD_TYPE_STRING\n | typeof FIELD_TYPE_TAXONOMY;\n\ntype MetadataTemplateFieldOption = {\n id?: string,\n key: string,\n};\n\nexport type TaxonomyLevel = {\n description: string,\n displayName: string,\n level: number,\n};\n\ntype MetadataTemplateField = {\n description?: string,\n displayName: string,\n hidden?: boolean,\n id: string,\n isHidden?: boolean,\n key: string, // V2\n options?: Array<MetadataTemplateFieldOption>, // V3\n type: MetadataFieldType,\n levels?: Array<TaxonomyLevel>,\n namespace?: string,\n taxonomyKey?: string,\n taxonomy_key?: string,\n};\n\ntype MetadataTemplate = {\n displayName?: string,\n fields?: Array<MetadataTemplateField>,\n hidden?: boolean,\n id: string,\n isHidden?: boolean,\n scope: string, // V2\n templateKey: string, // V3\n};\n\ntype MetadataTemplateSchemaResponse = {\n data?: MetadataTemplate,\n};\n\ntype MetadataSkillsTemplate = {\n archivedItemTemplate?: {\n archiveDate: string,\n },\n boxSkillsCards?: SkillCards,\n};\n\n// $FlowFixMe flow strict doesn't like use of \"any\"\ntype MetadataFieldValue = string | number | Array<any>;\n\ntype MetadataFields = { [string]: MetadataFieldValue };\n\ntype MetadataQueryInstanceTypeField = {\n displayName: string,\n key: string,\n options?: MetadataTemplateFieldOption,\n type: string,\n value: ?MetadataFieldValue,\n};\n\ntype MetadataQueryInstanceTemplate = {\n fields: Array<MetadataQueryInstanceTypeField>,\n id: string,\n};\n\ntype MetadataType = {\n enterprise?: MetadataQueryInstanceTemplate,\n global?: MetadataSkillsTemplate,\n};\n\ntype MetadataCascadePolicy = {\n canEdit?: boolean,\n id?: string,\n cascadePolicyType?: string,\n};\n\ntype MetadataCascadingPolicyData = {\n id?: string,\n isEnabled: boolean,\n overwrite: boolean,\n};\n\ntype MetadataInstance = {\n canEdit: boolean,\n cascadePolicy?: MetadataCascadePolicy,\n data: MetadataFields,\n id: string,\n};\n\ntype MetadataInstanceV2 = {\n $canEdit: boolean,\n $id: string,\n $parent: string,\n $scope: string,\n $template: string,\n $type: string,\n $typeVersion: number,\n $version: number,\n};\n\ntype MetadataEditor = {\n hasError?: boolean,\n instance: MetadataInstance,\n isDirty?: boolean,\n template: MetadataTemplate,\n};\n\ntype MetadataSuggestion = {\n $scope: string,\n $templateKey: string,\n suggestions: { [key: string]: string | number | string[] },\n};\n\ntype MetadataOptionEntryAncestor = {\n id: string,\n display_name: string,\n level: string,\n};\n\ntype MetadataOptionEntry = {\n id: string,\n display_name: string,\n level: number,\n ancestors: MetadataOptionEntryAncestor[],\n deprecated: boolean,\n selectable: boolean,\n};\n\ntype MetadataOptions = {\n entries: MetadataOptionEntry[],\n next_marker: string | null,\n result_count: number,\n};\n\ntype MetadataTemplateInstanceField = {\n description?: string,\n displayName?: string,\n hidden?: boolean,\n id?: string,\n key: string, // V2\n levels?: Array<TaxonomyLevel>,\n options?: Array<MetadataTemplateFieldOption>, // V3\n type: MetadataFieldType,\n value: MetadataFieldValue,\n};\n\ntype MetadataTemplateInstance = {\n canEdit: boolean,\n displayName?: string,\n hidden?: boolean,\n id: string,\n fields: MetadataTemplateInstanceField[],\n scope: string,\n templateKey: string,\n type: string,\n};\n\nexport type {\n MetadataTemplateInstanceField,\n MetadataTemplateInstance,\n MetadataFieldType,\n MetadataTemplateFieldOption,\n MetadataTemplateField,\n MetadataTemplate,\n MetadataTemplateSchemaResponse,\n MetadataFieldValue,\n MetadataFields,\n MetadataQueryInstanceTypeField,\n MetadataType,\n MetadataCascadePolicy,\n MetadataCascadingPolicyData,\n MetadataInstanceV2,\n MetadataEditor,\n MetadataSuggestion,\n MetadataOptions,\n};\n"],"mappings":"AACA,SACIA,eAAe,EACfC,eAAe,EACfC,gBAAgB,EAChBC,sBAAsB,EACtBC,iBAAiB,EACjBC,mBAAmB,QAChB,mDAAmD;;AA0D1D","ignoreList":[]}
1
+ {"version":3,"file":"metadata.js","names":["FIELD_TYPE_DATE","FIELD_TYPE_ENUM","FIELD_TYPE_FLOAT","FIELD_TYPE_MULTISELECT","FIELD_TYPE_STRING","FIELD_TYPE_TAXONOMY"],"sources":["../../../src/common/types/metadata.js"],"sourcesContent":["// @flow strict\nimport {\n FIELD_TYPE_DATE,\n FIELD_TYPE_ENUM,\n FIELD_TYPE_FLOAT,\n FIELD_TYPE_MULTISELECT,\n FIELD_TYPE_STRING,\n FIELD_TYPE_TAXONOMY,\n} from '../../features/metadata-instance-fields/constants';\nimport type { SkillCards } from './skills';\n\ntype MetadataFieldType =\n | typeof FIELD_TYPE_DATE\n | typeof FIELD_TYPE_ENUM\n | typeof FIELD_TYPE_FLOAT\n | typeof FIELD_TYPE_MULTISELECT\n | typeof FIELD_TYPE_STRING\n | typeof FIELD_TYPE_TAXONOMY;\n\ntype MetadataTemplateFieldOption = {\n id?: string,\n key: string,\n};\n\nexport type TaxonomyLevel = {\n description: string,\n displayName: string,\n level: number,\n};\n\ntype MetadataTemplateField = {\n description?: string,\n displayName: string,\n hidden?: boolean,\n id: string,\n isHidden?: boolean,\n key: string, // V2\n options?: Array<MetadataTemplateFieldOption>, // V3\n type: MetadataFieldType,\n levels?: Array<TaxonomyLevel>,\n namespace?: string,\n taxonomyKey?: string,\n taxonomy_key?: string,\n};\n\ntype MetadataTemplate = {\n displayName?: string,\n fields?: Array<MetadataTemplateField>,\n hidden?: boolean,\n id: string,\n isHidden?: boolean,\n scope: string, // V2\n templateKey: string, // V3\n};\n\ntype MetadataTemplateSchemaResponse = {\n data?: MetadataTemplate,\n};\n\ntype MetadataSkillsTemplate = {\n archivedItemTemplate?: {\n archiveDate: string,\n },\n boxSkillsCards?: SkillCards,\n};\n\n// $FlowFixMe flow strict doesn't like use of \"any\"\ntype MetadataFieldValue = string | number | Array<any>;\n\ntype MetadataFields = { [string]: MetadataFieldValue };\n\ntype MetadataQueryInstanceTypeField = {\n displayName: string,\n key: string,\n options?: MetadataTemplateFieldOption,\n type: string,\n value: ?MetadataFieldValue,\n};\n\ntype MetadataQueryInstanceTemplate = {\n fields: Array<MetadataQueryInstanceTypeField>,\n id: string,\n};\n\ntype MetadataType = {\n enterprise?: MetadataQueryInstanceTemplate,\n global?: MetadataSkillsTemplate,\n};\n\ntype MetadataCascadePolicy = {\n canEdit?: boolean,\n id?: string,\n cascadePolicyType?: string,\n};\n\ntype MetadataCascadePolicyConfiguration = {\n agent: string,\n};\n\ntype MetadataCascadingPolicyData = {\n id?: string,\n isEnabled: boolean,\n overwrite: boolean,\n cascadePolicyConfiguration: MetadataCascadePolicyConfiguration | null,\n};\n\ntype MetadataInstance = {\n canEdit: boolean,\n cascadePolicy?: MetadataCascadePolicy,\n data: MetadataFields,\n id: string,\n};\n\ntype MetadataInstanceV2 = {\n $canEdit: boolean,\n $id: string,\n $parent: string,\n $scope: string,\n $template: string,\n $type: string,\n $typeVersion: number,\n $version: number,\n};\n\ntype MetadataEditor = {\n hasError?: boolean,\n instance: MetadataInstance,\n isDirty?: boolean,\n template: MetadataTemplate,\n};\n\ntype MetadataSuggestion = {\n $scope: string,\n $templateKey: string,\n suggestions: { [key: string]: string | number | string[] },\n};\n\ntype MetadataOptionEntryAncestor = {\n id: string,\n display_name: string,\n level: string,\n};\n\ntype MetadataOptionEntry = {\n id: string,\n display_name: string,\n level: number,\n ancestors: MetadataOptionEntryAncestor[],\n deprecated: boolean,\n selectable: boolean,\n};\n\ntype MetadataOptions = {\n entries: MetadataOptionEntry[],\n next_marker: string | null,\n result_count: number,\n};\n\ntype MetadataTemplateInstanceField = {\n description?: string,\n displayName?: string,\n hidden?: boolean,\n id?: string,\n key: string, // V2\n levels?: Array<TaxonomyLevel>,\n options?: Array<MetadataTemplateFieldOption>, // V3\n type: MetadataFieldType,\n value: MetadataFieldValue,\n};\n\ntype MetadataTemplateInstance = {\n canEdit: boolean,\n displayName?: string,\n hidden?: boolean,\n id: string,\n fields: MetadataTemplateInstanceField[],\n scope: string,\n templateKey: string,\n type: string,\n};\n\nexport type {\n MetadataTemplateInstanceField,\n MetadataTemplateInstance,\n MetadataFieldType,\n MetadataTemplateFieldOption,\n MetadataTemplateField,\n MetadataTemplate,\n MetadataTemplateSchemaResponse,\n MetadataFieldValue,\n MetadataFields,\n MetadataQueryInstanceTypeField,\n MetadataType,\n MetadataCascadePolicy,\n MetadataCascadePolicyConfiguration,\n MetadataCascadingPolicyData,\n MetadataInstanceV2,\n MetadataEditor,\n MetadataSuggestion,\n MetadataOptions,\n};\n"],"mappings":"AACA,SACIA,eAAe,EACfC,eAAe,EACfC,gBAAgB,EAChBC,sBAAsB,EACtBC,iBAAiB,EACjBC,mBAAmB,QAChB,mDAAmD;;AA0D1D","ignoreList":[]}
@@ -1,27 +1,22 @@
1
1
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
2
  import * as React from 'react';
3
- import { FormattedMessage, useIntl } from 'react-intl';
4
3
  import { InlineNotice } from '@box/blueprint-web';
5
- import { BoxAiAgentSelector } from '@box/box-ai-agent-selector';
4
+ import { useCallback } from 'react';
5
+ import { FormattedMessage, useIntl } from 'react-intl';
6
+
7
+ // $FlowFixMe
8
+ import { BoxAiAdvancedColor, BoxAiColor } from '@box/blueprint-web-assets/icons/Medium';
6
9
  // $FlowFixMe
7
- import BoxAiLogo from '@box/blueprint-web-assets/icons/Logo/BoxAiLogo';
10
+ import { BoxAiAgentSelectorWithApiContainer } from '@box/box-ai-agent-selector';
8
11
  import Toggle from '../../components/toggle';
9
12
  import { RadioButton, RadioGroup } from '../../components/radio';
10
13
  import Link from '../../components/link/Link';
11
14
  import IconAlertDefault from '../../icons/general/IconAlertDefault';
12
15
  import messages from './messages';
13
16
  import './CascadePolicy.scss';
17
+ import { STANDARD_AGENT_ID, ENHANCED_AGENT_ID } from './constants';
14
18
  const COMMUNITY_LINK = 'https://support.box.com/hc/en-us/articles/360044195873-Cascading-metadata-in-folders';
15
19
  const AI_LINK = 'https://www.box.com/ai';
16
- const agents = [{
17
- id: '1',
18
- name: 'Basic',
19
- isEnterpriseDefault: true
20
- }, {
21
- id: '2',
22
- name: 'Enhanced (Gemini 2.5 Pro)',
23
- isEnterpriseDefault: false
24
- }];
25
20
  const CascadePolicy = ({
26
21
  canEdit,
27
22
  canUseAIFolderExtraction,
@@ -32,6 +27,7 @@ const CascadePolicy = ({
32
27
  isAIFolderExtractionEnabled,
33
28
  isExistingCascadePolicy,
34
29
  onAIFolderExtractionToggle,
30
+ onAIAgentSelect,
35
31
  onCascadeToggle,
36
32
  onCascadeModeChange,
37
33
  shouldShowCascadeOptions
@@ -42,6 +38,30 @@ const CascadePolicy = ({
42
38
  const readOnlyState = isCascadingEnabled ? /*#__PURE__*/React.createElement("div", {
43
39
  className: "metadata-cascade-notice"
44
40
  }, /*#__PURE__*/React.createElement(FormattedMessage, messages.metadataCascadePolicyEnabledInfo)) : null;
41
+ const agents = React.useMemo(() => [{
42
+ id: STANDARD_AGENT_ID,
43
+ name: formatMessage(messages.standardAgentName),
44
+ isEnterpriseDefault: true
45
+ }, {
46
+ id: ENHANCED_AGENT_ID,
47
+ name: formatMessage(messages.enhancedAgentName),
48
+ isEnterpriseDefault: false,
49
+ customIcon: BoxAiAdvancedColor
50
+ }], [formatMessage]);
51
+
52
+ // BoxAiAgentSelectorWithApiContainer expects a function that returns a Promise<AgentListResponse>
53
+ // Since we're passing in our own agents, we don't need to make an API call,
54
+ // so we wrap the store data in a Promise to satisfy the component's interface requirements.
55
+ const agentFetcher = useCallback(() => {
56
+ return Promise.resolve({
57
+ agents
58
+ });
59
+ }, [agents]);
60
+ const handleAgentSelect = useCallback(agent => {
61
+ if (onAIAgentSelect) {
62
+ onAIAgentSelect(agent);
63
+ }
64
+ }, [onAIAgentSelect]);
45
65
  return canEdit ? /*#__PURE__*/React.createElement(React.Fragment, null, isExistingCascadePolicy && /*#__PURE__*/React.createElement(InlineNotice, {
46
66
  variant: "info",
47
67
  variantIconAriaLabel: formatMessage(messages.cascadePolicyOptionsDisabledNoticeIconAriaLabel)
@@ -53,6 +73,7 @@ const CascadePolicy = ({
53
73
  }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(FormattedMessage, _extends({
54
74
  tagName: "strong"
55
75
  }, messages.enableCascadePolicy)), !isCustomMetadata && /*#__PURE__*/React.createElement(Toggle, {
76
+ "aria-label": formatMessage(messages.enableCascadePolicy),
56
77
  className: `metadata-cascade-toggle ${isCascadingEnabled ? 'cascade-on' : 'cascade-off'}`,
57
78
  isOn: isCascadingEnabled,
58
79
  label: "",
@@ -86,13 +107,14 @@ const CascadePolicy = ({
86
107
  "data-testid": "ai-folder-extraction"
87
108
  }, /*#__PURE__*/React.createElement("div", {
88
109
  className: "metadata-cascade-enable"
89
- }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(BoxAiLogo, {
110
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(BoxAiColor, {
90
111
  className: "metadata-cascade-ai-logo",
91
112
  width: 16,
92
113
  height: 16
93
114
  }), /*#__PURE__*/React.createElement(FormattedMessage, _extends({
94
115
  tagName: "strong"
95
116
  }, messages.enableAIAutofill)), /*#__PURE__*/React.createElement(Toggle, {
117
+ "aria-label": formatMessage(messages.enableAIAutofill),
96
118
  className: "metadata-cascade-toggle",
97
119
  isOn: isAIFolderExtractionEnabled,
98
120
  isDisabled: isExistingCascadePolicy,
@@ -104,15 +126,13 @@ const CascadePolicy = ({
104
126
  className: "cascade-policy-link",
105
127
  href: AI_LINK,
106
128
  target: "_blank"
107
- }, /*#__PURE__*/React.createElement(FormattedMessage, messages.aiAutofillLearnMore))), canUseAIFolderExtractionAgentSelector && /*#__PURE__*/React.createElement("div", {
129
+ }, /*#__PURE__*/React.createElement(FormattedMessage, messages.aiAutofillLearnMore))), canUseAIFolderExtractionAgentSelector && isAIFolderExtractionEnabled && /*#__PURE__*/React.createElement("div", {
108
130
  className: "metadata-cascade-ai-agent-selector"
109
- }, /*#__PURE__*/React.createElement(BoxAiAgentSelector, {
110
- agents: agents,
131
+ }, /*#__PURE__*/React.createElement(BoxAiAgentSelectorWithApiContainer, {
111
132
  disabled: isExistingCascadePolicy,
112
- onErrorAction: () => {},
113
- requestState: "success",
114
- selectedAgent: agents[0],
115
- variant: "sidebar"
133
+ fetcher: agentFetcher,
134
+ onSelectAgent: handleAgentSelect,
135
+ recordAction: () => {}
116
136
  }))))) : readOnlyState;
117
137
  };
118
138
  export default CascadePolicy;
@@ -1,11 +1,16 @@
1
1
  // @flow
2
2
  import * as React from 'react';
3
- import { FormattedMessage, useIntl } from 'react-intl';
4
3
 
5
4
  import { InlineNotice } from '@box/blueprint-web';
6
- import { BoxAiAgentSelector } from '@box/box-ai-agent-selector';
5
+ import { useCallback } from 'react';
6
+ import { FormattedMessage, useIntl } from 'react-intl';
7
+
7
8
  // $FlowFixMe
8
- import BoxAiLogo from '@box/blueprint-web-assets/icons/Logo/BoxAiLogo';
9
+ import { BoxAiAdvancedColor, BoxAiColor } from '@box/blueprint-web-assets/icons/Medium';
10
+ import { type AgentType } from '@box/box-ai-agent-selector';
11
+
12
+ // $FlowFixMe
13
+ import { BoxAiAgentSelectorWithApiContainer } from '@box/box-ai-agent-selector';
9
14
 
10
15
  import Toggle from '../../components/toggle';
11
16
  import { RadioButton, RadioGroup } from '../../components/radio';
@@ -13,23 +18,11 @@ import Link from '../../components/link/Link';
13
18
  import IconAlertDefault from '../../icons/general/IconAlertDefault';
14
19
  import messages from './messages';
15
20
  import './CascadePolicy.scss';
21
+ import { STANDARD_AGENT_ID, ENHANCED_AGENT_ID } from './constants';
16
22
 
17
23
  const COMMUNITY_LINK = 'https://support.box.com/hc/en-us/articles/360044195873-Cascading-metadata-in-folders';
18
24
  const AI_LINK = 'https://www.box.com/ai';
19
25
 
20
- const agents = [
21
- {
22
- id: '1',
23
- name: 'Basic',
24
- isEnterpriseDefault: true,
25
- },
26
- {
27
- id: '2',
28
- name: 'Enhanced (Gemini 2.5 Pro)',
29
- isEnterpriseDefault: false,
30
- },
31
- ];
32
-
33
26
  type Props = {
34
27
  canEdit: boolean,
35
28
  canUseAIFolderExtraction: boolean,
@@ -40,6 +33,7 @@ type Props = {
40
33
  isCustomMetadata: boolean,
41
34
  isExistingCascadePolicy: boolean,
42
35
  onAIFolderExtractionToggle: (value: boolean) => void,
36
+ onAIAgentSelect?: (agent: AgentType | null) => void,
43
37
  onCascadeModeChange: (value: boolean) => void,
44
38
  onCascadeToggle: (value: boolean) => void,
45
39
  shouldShowCascadeOptions: boolean,
@@ -55,6 +49,7 @@ const CascadePolicy = ({
55
49
  isAIFolderExtractionEnabled,
56
50
  isExistingCascadePolicy,
57
51
  onAIFolderExtractionToggle,
52
+ onAIAgentSelect,
58
53
  onCascadeToggle,
59
54
  onCascadeModeChange,
60
55
  shouldShowCascadeOptions,
@@ -67,6 +62,39 @@ const CascadePolicy = ({
67
62
  </div>
68
63
  ) : null;
69
64
 
65
+ const agents = React.useMemo(
66
+ () => [
67
+ {
68
+ id: STANDARD_AGENT_ID,
69
+ name: formatMessage(messages.standardAgentName),
70
+ isEnterpriseDefault: true,
71
+ },
72
+ {
73
+ id: ENHANCED_AGENT_ID,
74
+ name: formatMessage(messages.enhancedAgentName),
75
+ isEnterpriseDefault: false,
76
+ customIcon: BoxAiAdvancedColor,
77
+ },
78
+ ],
79
+ [formatMessage],
80
+ );
81
+
82
+ // BoxAiAgentSelectorWithApiContainer expects a function that returns a Promise<AgentListResponse>
83
+ // Since we're passing in our own agents, we don't need to make an API call,
84
+ // so we wrap the store data in a Promise to satisfy the component's interface requirements.
85
+ const agentFetcher = useCallback(() => {
86
+ return Promise.resolve({ agents });
87
+ }, [agents]);
88
+
89
+ const handleAgentSelect = useCallback(
90
+ (agent: AgentType | null) => {
91
+ if (onAIAgentSelect) {
92
+ onAIAgentSelect(agent);
93
+ }
94
+ },
95
+ [onAIAgentSelect],
96
+ );
97
+
70
98
  return canEdit ? (
71
99
  <>
72
100
  {isExistingCascadePolicy && (
@@ -83,6 +111,7 @@ const CascadePolicy = ({
83
111
  <FormattedMessage tagName="strong" {...messages.enableCascadePolicy} />
84
112
  {!isCustomMetadata && (
85
113
  <Toggle
114
+ aria-label={formatMessage(messages.enableCascadePolicy)}
86
115
  className={`metadata-cascade-toggle ${
87
116
  isCascadingEnabled ? 'cascade-on' : 'cascade-off'
88
117
  }`}
@@ -141,9 +170,10 @@ const CascadePolicy = ({
141
170
  <div className="metadata-cascade-editor" data-testid="ai-folder-extraction">
142
171
  <div className="metadata-cascade-enable">
143
172
  <div>
144
- <BoxAiLogo className="metadata-cascade-ai-logo" width={16} height={16} />
173
+ <BoxAiColor className="metadata-cascade-ai-logo" width={16} height={16} />
145
174
  <FormattedMessage tagName="strong" {...messages.enableAIAutofill} />
146
175
  <Toggle
176
+ aria-label={formatMessage(messages.enableAIAutofill)}
147
177
  className="metadata-cascade-toggle"
148
178
  isOn={isAIFolderExtractionEnabled}
149
179
  isDisabled={isExistingCascadePolicy}
@@ -158,15 +188,13 @@ const CascadePolicy = ({
158
188
  <FormattedMessage {...messages.aiAutofillLearnMore} />
159
189
  </Link>
160
190
  </div>
161
- {canUseAIFolderExtractionAgentSelector && (
191
+ {canUseAIFolderExtractionAgentSelector && isAIFolderExtractionEnabled && (
162
192
  <div className="metadata-cascade-ai-agent-selector">
163
- <BoxAiAgentSelector
164
- agents={agents}
193
+ <BoxAiAgentSelectorWithApiContainer
165
194
  disabled={isExistingCascadePolicy}
166
- onErrorAction={() => {}}
167
- requestState="success"
168
- selectedAgent={agents[0]}
169
- variant="sidebar"
195
+ fetcher={agentFetcher}
196
+ onSelectAgent={handleAgentSelect}
197
+ recordAction={() => {}}
170
198
  />
171
199
  </div>
172
200
  )}
@@ -1 +1 @@
1
- {"version":3,"file":"CascadePolicy.js","names":["React","FormattedMessage","useIntl","InlineNotice","BoxAiAgentSelector","BoxAiLogo","Toggle","RadioButton","RadioGroup","Link","IconAlertDefault","messages","COMMUNITY_LINK","AI_LINK","agents","id","name","isEnterpriseDefault","CascadePolicy","canEdit","canUseAIFolderExtraction","canUseAIFolderExtractionAgentSelector","isCascadingEnabled","isCascadingOverwritten","isCustomMetadata","isAIFolderExtractionEnabled","isExistingCascadePolicy","onAIFolderExtractionToggle","onCascadeToggle","onCascadeModeChange","shouldShowCascadeOptions","formatMessage","readOnlyState","createElement","className","metadataCascadePolicyEnabledInfo","Fragment","variant","variantIconAriaLabel","cascadePolicyOptionsDisabledNoticeIconAriaLabel","cascadePolicyOptionsDisabledNotice","_extends","tagName","enableCascadePolicy","isOn","label","onChange","e","target","checked","applyCascadePolicyText","href","cascadePolicyLearnMore","cannotApplyCascadePolicyText","cascadePolicyModeQuestion","operationNotImmediate","value","isDisabled","cascadePolicySkipMode","cascadePolicyOverwriteMode","width","height","enableAIAutofill","aiAutofillDescription","aiAutofillLearnMore","disabled","onErrorAction","requestState","selectedAgent"],"sources":["../../../src/features/metadata-instance-editor/CascadePolicy.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\nimport { InlineNotice } from '@box/blueprint-web';\nimport { BoxAiAgentSelector } from '@box/box-ai-agent-selector';\n// $FlowFixMe\nimport BoxAiLogo from '@box/blueprint-web-assets/icons/Logo/BoxAiLogo';\n\nimport Toggle from '../../components/toggle';\nimport { RadioButton, RadioGroup } from '../../components/radio';\nimport Link from '../../components/link/Link';\nimport IconAlertDefault from '../../icons/general/IconAlertDefault';\nimport messages from './messages';\nimport './CascadePolicy.scss';\n\nconst COMMUNITY_LINK = 'https://support.box.com/hc/en-us/articles/360044195873-Cascading-metadata-in-folders';\nconst AI_LINK = 'https://www.box.com/ai';\n\nconst agents = [\n {\n id: '1',\n name: 'Basic',\n isEnterpriseDefault: true,\n },\n {\n id: '2',\n name: 'Enhanced (Gemini 2.5 Pro)',\n isEnterpriseDefault: false,\n },\n];\n\ntype Props = {\n canEdit: boolean,\n canUseAIFolderExtraction: boolean,\n canUseAIFolderExtractionAgentSelector: boolean,\n isAIFolderExtractionEnabled: boolean,\n isCascadingEnabled: boolean,\n isCascadingOverwritten: boolean,\n isCustomMetadata: boolean,\n isExistingCascadePolicy: boolean,\n onAIFolderExtractionToggle: (value: boolean) => void,\n onCascadeModeChange: (value: boolean) => void,\n onCascadeToggle: (value: boolean) => void,\n shouldShowCascadeOptions: boolean,\n};\n\nconst CascadePolicy = ({\n canEdit,\n canUseAIFolderExtraction,\n canUseAIFolderExtractionAgentSelector,\n isCascadingEnabled,\n isCascadingOverwritten,\n isCustomMetadata,\n isAIFolderExtractionEnabled,\n isExistingCascadePolicy,\n onAIFolderExtractionToggle,\n onCascadeToggle,\n onCascadeModeChange,\n shouldShowCascadeOptions,\n}: Props) => {\n const { formatMessage } = useIntl();\n\n const readOnlyState = isCascadingEnabled ? (\n <div className=\"metadata-cascade-notice\">\n <FormattedMessage {...messages.metadataCascadePolicyEnabledInfo} />\n </div>\n ) : null;\n\n return canEdit ? (\n <>\n {isExistingCascadePolicy && (\n <InlineNotice\n variant=\"info\"\n variantIconAriaLabel={formatMessage(messages.cascadePolicyOptionsDisabledNoticeIconAriaLabel)}\n >\n <FormattedMessage {...messages.cascadePolicyOptionsDisabledNotice} />\n </InlineNotice>\n )}\n <div className=\"metadata-cascade-editor\">\n <div className=\"metadata-cascade-enable\" data-testid=\"metadata-cascade-enable\">\n <div>\n <FormattedMessage tagName=\"strong\" {...messages.enableCascadePolicy} />\n {!isCustomMetadata && (\n <Toggle\n className={`metadata-cascade-toggle ${\n isCascadingEnabled ? 'cascade-on' : 'cascade-off'\n }`}\n isOn={isCascadingEnabled}\n label=\"\"\n onChange={e => onCascadeToggle(e.target.checked)}\n />\n )}\n </div>\n {!isCustomMetadata ? (\n <div className=\"cascade-policy-text\">\n <FormattedMessage {...messages.applyCascadePolicyText} />\n &nbsp;\n <Link className=\"cascade-policy-link\" href={COMMUNITY_LINK} target=\"_blank\">\n <FormattedMessage {...messages.cascadePolicyLearnMore} />\n </Link>\n </div>\n ) : (\n <div>\n <FormattedMessage {...messages.cannotApplyCascadePolicyText} />\n </div>\n )}\n </div>\n </div>\n {shouldShowCascadeOptions && (\n <div className=\"metadata-cascade-editor\">\n <div className=\"metadata-cascading-mode\">\n <FormattedMessage {...messages.cascadePolicyModeQuestion} />\n\n <div className=\"metadata-operation-not-immediate\">\n <IconAlertDefault />\n <span>\n <FormattedMessage {...messages.operationNotImmediate} />\n </span>\n </div>\n <RadioGroup\n className=\"metadata-cascading-options\"\n onChange={e => onCascadeModeChange(e.target.value === 'overwrite')}\n value={isCascadingOverwritten ? 'overwrite' : 'skip'}\n >\n <RadioButton\n isDisabled={isExistingCascadePolicy}\n label={<FormattedMessage {...messages.cascadePolicySkipMode} />}\n value=\"skip\"\n />\n <RadioButton\n isDisabled={isExistingCascadePolicy}\n label={<FormattedMessage {...messages.cascadePolicyOverwriteMode} />}\n value=\"overwrite\"\n />\n </RadioGroup>\n </div>\n </div>\n )}\n {shouldShowCascadeOptions && canUseAIFolderExtraction && (\n <div className=\"metadata-cascade-editor\" data-testid=\"ai-folder-extraction\">\n <div className=\"metadata-cascade-enable\">\n <div>\n <BoxAiLogo className=\"metadata-cascade-ai-logo\" width={16} height={16} />\n <FormattedMessage tagName=\"strong\" {...messages.enableAIAutofill} />\n <Toggle\n className=\"metadata-cascade-toggle\"\n isOn={isAIFolderExtractionEnabled}\n isDisabled={isExistingCascadePolicy}\n label=\"\"\n onChange={e => onAIFolderExtractionToggle(e.target.checked)}\n />\n </div>\n <div className=\"cascade-policy-text\">\n <FormattedMessage {...messages.aiAutofillDescription} />\n &nbsp;\n <Link className=\"cascade-policy-link\" href={AI_LINK} target=\"_blank\">\n <FormattedMessage {...messages.aiAutofillLearnMore} />\n </Link>\n </div>\n {canUseAIFolderExtractionAgentSelector && (\n <div className=\"metadata-cascade-ai-agent-selector\">\n <BoxAiAgentSelector\n agents={agents}\n disabled={isExistingCascadePolicy}\n onErrorAction={() => {}}\n requestState=\"success\"\n selectedAgent={agents[0]}\n variant=\"sidebar\"\n />\n </div>\n )}\n </div>\n </div>\n )}\n </>\n ) : (\n readOnlyState\n );\n};\n\nexport default CascadePolicy;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"CascadePolicy.js","names":["React","InlineNotice","useCallback","FormattedMessage","useIntl","BoxAiAdvancedColor","BoxAiColor","BoxAiAgentSelectorWithApiContainer","Toggle","RadioButton","RadioGroup","Link","IconAlertDefault","messages","STANDARD_AGENT_ID","ENHANCED_AGENT_ID","COMMUNITY_LINK","AI_LINK","CascadePolicy","canEdit","canUseAIFolderExtraction","canUseAIFolderExtractionAgentSelector","isCascadingEnabled","isCascadingOverwritten","isCustomMetadata","isAIFolderExtractionEnabled","isExistingCascadePolicy","onAIFolderExtractionToggle","onAIAgentSelect","onCascadeToggle","onCascadeModeChange","shouldShowCascadeOptions","formatMessage","readOnlyState","createElement","className","metadataCascadePolicyEnabledInfo","agents","useMemo","id","name","standardAgentName","isEnterpriseDefault","enhancedAgentName","customIcon","agentFetcher","Promise","resolve","handleAgentSelect","agent","Fragment","variant","variantIconAriaLabel","cascadePolicyOptionsDisabledNoticeIconAriaLabel","cascadePolicyOptionsDisabledNotice","_extends","tagName","enableCascadePolicy","isOn","label","onChange","e","target","checked","applyCascadePolicyText","href","cascadePolicyLearnMore","cannotApplyCascadePolicyText","cascadePolicyModeQuestion","operationNotImmediate","value","isDisabled","cascadePolicySkipMode","cascadePolicyOverwriteMode","width","height","enableAIAutofill","aiAutofillDescription","aiAutofillLearnMore","disabled","fetcher","onSelectAgent","recordAction"],"sources":["../../../src/features/metadata-instance-editor/CascadePolicy.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\n\nimport { InlineNotice } from '@box/blueprint-web';\nimport { useCallback } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\n\n// $FlowFixMe\nimport { BoxAiAdvancedColor, BoxAiColor } from '@box/blueprint-web-assets/icons/Medium';\nimport { type AgentType } from '@box/box-ai-agent-selector';\n\n// $FlowFixMe\nimport { BoxAiAgentSelectorWithApiContainer } from '@box/box-ai-agent-selector';\n\nimport Toggle from '../../components/toggle';\nimport { RadioButton, RadioGroup } from '../../components/radio';\nimport Link from '../../components/link/Link';\nimport IconAlertDefault from '../../icons/general/IconAlertDefault';\nimport messages from './messages';\nimport './CascadePolicy.scss';\nimport { STANDARD_AGENT_ID, ENHANCED_AGENT_ID } from './constants';\n\nconst COMMUNITY_LINK = 'https://support.box.com/hc/en-us/articles/360044195873-Cascading-metadata-in-folders';\nconst AI_LINK = 'https://www.box.com/ai';\n\ntype Props = {\n canEdit: boolean,\n canUseAIFolderExtraction: boolean,\n canUseAIFolderExtractionAgentSelector: boolean,\n isAIFolderExtractionEnabled: boolean,\n isCascadingEnabled: boolean,\n isCascadingOverwritten: boolean,\n isCustomMetadata: boolean,\n isExistingCascadePolicy: boolean,\n onAIFolderExtractionToggle: (value: boolean) => void,\n onAIAgentSelect?: (agent: AgentType | null) => void,\n onCascadeModeChange: (value: boolean) => void,\n onCascadeToggle: (value: boolean) => void,\n shouldShowCascadeOptions: boolean,\n};\n\nconst CascadePolicy = ({\n canEdit,\n canUseAIFolderExtraction,\n canUseAIFolderExtractionAgentSelector,\n isCascadingEnabled,\n isCascadingOverwritten,\n isCustomMetadata,\n isAIFolderExtractionEnabled,\n isExistingCascadePolicy,\n onAIFolderExtractionToggle,\n onAIAgentSelect,\n onCascadeToggle,\n onCascadeModeChange,\n shouldShowCascadeOptions,\n}: Props) => {\n const { formatMessage } = useIntl();\n\n const readOnlyState = isCascadingEnabled ? (\n <div className=\"metadata-cascade-notice\">\n <FormattedMessage {...messages.metadataCascadePolicyEnabledInfo} />\n </div>\n ) : null;\n\n const agents = React.useMemo(\n () => [\n {\n id: STANDARD_AGENT_ID,\n name: formatMessage(messages.standardAgentName),\n isEnterpriseDefault: true,\n },\n {\n id: ENHANCED_AGENT_ID,\n name: formatMessage(messages.enhancedAgentName),\n isEnterpriseDefault: false,\n customIcon: BoxAiAdvancedColor,\n },\n ],\n [formatMessage],\n );\n\n // BoxAiAgentSelectorWithApiContainer expects a function that returns a Promise<AgentListResponse>\n // Since we're passing in our own agents, we don't need to make an API call,\n // so we wrap the store data in a Promise to satisfy the component's interface requirements.\n const agentFetcher = useCallback(() => {\n return Promise.resolve({ agents });\n }, [agents]);\n\n const handleAgentSelect = useCallback(\n (agent: AgentType | null) => {\n if (onAIAgentSelect) {\n onAIAgentSelect(agent);\n }\n },\n [onAIAgentSelect],\n );\n\n return canEdit ? (\n <>\n {isExistingCascadePolicy && (\n <InlineNotice\n variant=\"info\"\n variantIconAriaLabel={formatMessage(messages.cascadePolicyOptionsDisabledNoticeIconAriaLabel)}\n >\n <FormattedMessage {...messages.cascadePolicyOptionsDisabledNotice} />\n </InlineNotice>\n )}\n <div className=\"metadata-cascade-editor\">\n <div className=\"metadata-cascade-enable\" data-testid=\"metadata-cascade-enable\">\n <div>\n <FormattedMessage tagName=\"strong\" {...messages.enableCascadePolicy} />\n {!isCustomMetadata && (\n <Toggle\n aria-label={formatMessage(messages.enableCascadePolicy)}\n className={`metadata-cascade-toggle ${\n isCascadingEnabled ? 'cascade-on' : 'cascade-off'\n }`}\n isOn={isCascadingEnabled}\n label=\"\"\n onChange={e => onCascadeToggle(e.target.checked)}\n />\n )}\n </div>\n {!isCustomMetadata ? (\n <div className=\"cascade-policy-text\">\n <FormattedMessage {...messages.applyCascadePolicyText} />\n &nbsp;\n <Link className=\"cascade-policy-link\" href={COMMUNITY_LINK} target=\"_blank\">\n <FormattedMessage {...messages.cascadePolicyLearnMore} />\n </Link>\n </div>\n ) : (\n <div>\n <FormattedMessage {...messages.cannotApplyCascadePolicyText} />\n </div>\n )}\n </div>\n </div>\n {shouldShowCascadeOptions && (\n <div className=\"metadata-cascade-editor\">\n <div className=\"metadata-cascading-mode\">\n <FormattedMessage {...messages.cascadePolicyModeQuestion} />\n\n <div className=\"metadata-operation-not-immediate\">\n <IconAlertDefault />\n <span>\n <FormattedMessage {...messages.operationNotImmediate} />\n </span>\n </div>\n <RadioGroup\n className=\"metadata-cascading-options\"\n onChange={e => onCascadeModeChange(e.target.value === 'overwrite')}\n value={isCascadingOverwritten ? 'overwrite' : 'skip'}\n >\n <RadioButton\n isDisabled={isExistingCascadePolicy}\n label={<FormattedMessage {...messages.cascadePolicySkipMode} />}\n value=\"skip\"\n />\n <RadioButton\n isDisabled={isExistingCascadePolicy}\n label={<FormattedMessage {...messages.cascadePolicyOverwriteMode} />}\n value=\"overwrite\"\n />\n </RadioGroup>\n </div>\n </div>\n )}\n {shouldShowCascadeOptions && canUseAIFolderExtraction && (\n <div className=\"metadata-cascade-editor\" data-testid=\"ai-folder-extraction\">\n <div className=\"metadata-cascade-enable\">\n <div>\n <BoxAiColor className=\"metadata-cascade-ai-logo\" width={16} height={16} />\n <FormattedMessage tagName=\"strong\" {...messages.enableAIAutofill} />\n <Toggle\n aria-label={formatMessage(messages.enableAIAutofill)}\n className=\"metadata-cascade-toggle\"\n isOn={isAIFolderExtractionEnabled}\n isDisabled={isExistingCascadePolicy}\n label=\"\"\n onChange={e => onAIFolderExtractionToggle(e.target.checked)}\n />\n </div>\n <div className=\"cascade-policy-text\">\n <FormattedMessage {...messages.aiAutofillDescription} />\n &nbsp;\n <Link className=\"cascade-policy-link\" href={AI_LINK} target=\"_blank\">\n <FormattedMessage {...messages.aiAutofillLearnMore} />\n </Link>\n </div>\n {canUseAIFolderExtractionAgentSelector && isAIFolderExtractionEnabled && (\n <div className=\"metadata-cascade-ai-agent-selector\">\n <BoxAiAgentSelectorWithApiContainer\n disabled={isExistingCascadePolicy}\n fetcher={agentFetcher}\n onSelectAgent={handleAgentSelect}\n recordAction={() => {}}\n />\n </div>\n )}\n </div>\n </div>\n )}\n </>\n ) : (\n readOnlyState\n );\n};\n\nexport default CascadePolicy;\n"],"mappings":"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","ignoreList":[]}
@@ -27,7 +27,7 @@ import MetadataInstanceConfirmDialog from './MetadataInstanceConfirmDialog';
27
27
  import Footer from './Footer';
28
28
  import messages from './messages';
29
29
  import { FIELD_TYPE_FLOAT, FIELD_TYPE_INTEGER } from '../metadata-instance-fields/constants';
30
- import { CASCADE_POLICY_TYPE_AI_EXTRACT, TEMPLATE_CUSTOM_PROPERTIES } from './constants';
30
+ import { CASCADE_POLICY_TYPE_AI_EXTRACT, TEMPLATE_CUSTOM_PROPERTIES, ENHANCED_AGENT_CONFIGURATION, ENHANCED_AGENT_ID } from './constants';
31
31
  import { JSON_PATCH_OP_REMOVE, JSON_PATCH_OP_ADD, JSON_PATCH_OP_REPLACE, JSON_PATCH_OP_TEST } from '../../common/constants';
32
32
  import { isValidValue } from '../metadata-instance-fields/validateMetadataField';
33
33
  import { isHidden } from './metadataUtil';
@@ -126,6 +126,7 @@ class Instance extends React.PureComponent {
126
126
  onSave
127
127
  } = this.props;
128
128
  const {
129
+ cascadePolicyConfiguration,
129
130
  data: currentData,
130
131
  errors,
131
132
  isAIFolderExtractionEnabled,
@@ -146,7 +147,8 @@ class Instance extends React.PureComponent {
146
147
  id: cascadePolicy ? cascadePolicy.id : undefined,
147
148
  isEnabled: isCascadingEnabled,
148
149
  overwrite: isCascadingOverwritten,
149
- isAIFolderExtractionEnabled
150
+ isAIFolderExtractionEnabled,
151
+ cascadePolicyConfiguration
150
152
  } : undefined, cloneDeep(currentData));
151
153
  });
152
154
  /**
@@ -247,6 +249,24 @@ class Instance extends React.PureComponent {
247
249
  isAIFolderExtractionEnabled: value
248
250
  }, this.setDirty);
249
251
  });
252
+ /**
253
+ * Handles the selection of an AI agent
254
+ * @param {AgentType | null} agent - The selected agent
255
+ */
256
+ _defineProperty(this, "onAIAgentSelect", agent => {
257
+ // '2' is the id for the enhanced agent
258
+ if (agent && agent.id === ENHANCED_AGENT_ID) {
259
+ this.setState({
260
+ cascadePolicyConfiguration: {
261
+ agent: ENHANCED_AGENT_CONFIGURATION
262
+ }
263
+ });
264
+ } else {
265
+ this.setState({
266
+ cascadePolicyConfiguration: null
267
+ });
268
+ }
269
+ });
250
270
  /**
251
271
  * Render the correct delete message to show based on custom metadata and file/folder metadata
252
272
  */
@@ -393,6 +413,7 @@ class Instance extends React.PureComponent {
393
413
  getState(props) {
394
414
  const isCascadingEnabled = this.isCascadingEnabledThroughProps(props);
395
415
  return {
416
+ cascadePolicyConfiguration: null,
396
417
  data: cloneDeep(props.data),
397
418
  errors: {},
398
419
  isAIFolderExtractionEnabled: this.isAIFolderExtractionEnabledThroughProps(props),
@@ -625,6 +646,7 @@ class Instance extends React.PureComponent {
625
646
  isCascadingOverwritten: isCascadingOverwritten,
626
647
  isCustomMetadata: isProperties,
627
648
  isExistingCascadePolicy: isExistingCascadePolicy,
649
+ onAIAgentSelect: this.onAIAgentSelect,
628
650
  onAIFolderExtractionToggle: this.onAIFolderExtractionToggle,
629
651
  onCascadeModeChange: this.onCascadeModeChange,
630
652
  onCascadeToggle: this.onCascadeToggle,
@@ -6,6 +6,7 @@ import isEqual from 'lodash/isEqual';
6
6
  import cloneDeep from 'lodash/cloneDeep';
7
7
  import noop from 'lodash/noop';
8
8
 
9
+ import type { AgentType } from '@box/box-ai-agent-selector';
9
10
  import Collapsible from '../../components/collapsible/Collapsible';
10
11
  import Form from '../../components/form-elements/form/Form';
11
12
  import LoadingIndicatorWrapper from '../../components/loading-indicator/LoadingIndicatorWrapper';
@@ -24,7 +25,12 @@ import MetadataInstanceConfirmDialog from './MetadataInstanceConfirmDialog';
24
25
  import Footer from './Footer';
25
26
  import messages from './messages';
26
27
  import { FIELD_TYPE_FLOAT, FIELD_TYPE_INTEGER } from '../metadata-instance-fields/constants';
27
- import { CASCADE_POLICY_TYPE_AI_EXTRACT, TEMPLATE_CUSTOM_PROPERTIES } from './constants';
28
+ import {
29
+ CASCADE_POLICY_TYPE_AI_EXTRACT,
30
+ TEMPLATE_CUSTOM_PROPERTIES,
31
+ ENHANCED_AGENT_CONFIGURATION,
32
+ ENHANCED_AGENT_ID,
33
+ } from './constants';
28
34
  import {
29
35
  JSON_PATCH_OP_REMOVE,
30
36
  JSON_PATCH_OP_ADD,
@@ -38,6 +44,7 @@ import type {
38
44
  MetadataFields,
39
45
  MetadataTemplate,
40
46
  MetadataCascadePolicy,
47
+ MetadataCascadePolicyConfiguration,
41
48
  MetadataCascadingPolicyData,
42
49
  MetadataTemplateField,
43
50
  MetadataFieldValue,
@@ -69,6 +76,7 @@ type Props = {
69
76
  };
70
77
 
71
78
  type State = {
79
+ cascadePolicyConfiguration: MetadataCascadePolicyConfiguration | null,
72
80
  data: Object,
73
81
  errors: { [string]: React.Node },
74
82
  isAIFolderExtractionEnabled: boolean,
@@ -212,6 +220,7 @@ class Instance extends React.PureComponent<Props, State> {
212
220
  onSave,
213
221
  }: Props = this.props;
214
222
  const {
223
+ cascadePolicyConfiguration,
215
224
  data: currentData,
216
225
  errors,
217
226
  isAIFolderExtractionEnabled,
@@ -229,6 +238,7 @@ class Instance extends React.PureComponent<Props, State> {
229
238
  // reset state if cascading policy is removed
230
239
  isAIFolderExtractionEnabled: isCascadingEnabled ? isAIFolderExtractionEnabled : false,
231
240
  });
241
+
232
242
  onSave(
233
243
  id,
234
244
  this.createJSONPatch(currentData, originalData),
@@ -239,6 +249,7 @@ class Instance extends React.PureComponent<Props, State> {
239
249
  isEnabled: isCascadingEnabled,
240
250
  overwrite: isCascadingOverwritten,
241
251
  isAIFolderExtractionEnabled,
252
+ cascadePolicyConfiguration,
242
253
  }
243
254
  : undefined,
244
255
  cloneDeep(currentData),
@@ -342,6 +353,23 @@ class Instance extends React.PureComponent<Props, State> {
342
353
  this.setState({ isAIFolderExtractionEnabled: value }, this.setDirty);
343
354
  };
344
355
 
356
+ /**
357
+ * Handles the selection of an AI agent
358
+ * @param {AgentType | null} agent - The selected agent
359
+ */
360
+ onAIAgentSelect = (agent: AgentType | null): void => {
361
+ // '2' is the id for the enhanced agent
362
+ if (agent && agent.id === ENHANCED_AGENT_ID) {
363
+ this.setState({
364
+ cascadePolicyConfiguration: {
365
+ agent: ENHANCED_AGENT_CONFIGURATION,
366
+ },
367
+ });
368
+ } else {
369
+ this.setState({ cascadePolicyConfiguration: null });
370
+ }
371
+ };
372
+
345
373
  /**
346
374
  * Returns the state from props
347
375
  *
@@ -351,6 +379,7 @@ class Instance extends React.PureComponent<Props, State> {
351
379
  const isCascadingEnabled = this.isCascadingEnabledThroughProps(props);
352
380
 
353
381
  return {
382
+ cascadePolicyConfiguration: null,
354
383
  data: cloneDeep(props.data),
355
384
  errors: {},
356
385
  isAIFolderExtractionEnabled: this.isAIFolderExtractionEnabledThroughProps(props),
@@ -681,6 +710,7 @@ class Instance extends React.PureComponent<Props, State> {
681
710
  isCascadingOverwritten={isCascadingOverwritten}
682
711
  isCustomMetadata={isProperties}
683
712
  isExistingCascadePolicy={isExistingCascadePolicy}
713
+ onAIAgentSelect={this.onAIAgentSelect}
684
714
  onAIFolderExtractionToggle={this.onAIFolderExtractionToggle}
685
715
  onCascadeModeChange={this.onCascadeModeChange}
686
716
  onCascadeToggle={this.onCascadeToggle}