box-ui-elements 23.4.0-beta.30 → 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 (77) hide show
  1. package/dist/explorer.css +1 -1
  2. package/dist/explorer.js +1 -1
  3. package/dist/openwith.js +1 -1
  4. package/dist/picker.js +1 -1
  5. package/dist/preview.css +1 -1
  6. package/dist/preview.js +1 -1
  7. package/dist/sharing.js +1 -1
  8. package/dist/sidebar.css +1 -1
  9. package/dist/sidebar.js +1 -1
  10. package/dist/uploader.js +1 -1
  11. package/es/common/types/metadata.js.flow +6 -0
  12. package/es/common/types/metadata.js.map +1 -1
  13. package/es/elements/content-sidebar/SidebarNav.js +14 -3
  14. package/es/elements/content-sidebar/SidebarNav.js.flow +23 -3
  15. package/es/elements/content-sidebar/SidebarNav.js.map +1 -1
  16. package/es/elements/content-sidebar/SidebarNavTablist.js +58 -17
  17. package/es/elements/content-sidebar/SidebarNavTablist.js.flow +80 -21
  18. package/es/elements/content-sidebar/SidebarNavTablist.js.map +1 -1
  19. package/es/features/metadata-instance-editor/CascadePolicy.js +53 -23
  20. package/es/features/metadata-instance-editor/CascadePolicy.js.flow +69 -27
  21. package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
  22. package/es/features/metadata-instance-editor/Instance.js +26 -4
  23. package/es/features/metadata-instance-editor/Instance.js.flow +33 -4
  24. package/es/features/metadata-instance-editor/Instance.js.map +1 -1
  25. package/es/features/metadata-instance-editor/constants.js +4 -1
  26. package/es/features/metadata-instance-editor/constants.js.flow +10 -1
  27. package/es/features/metadata-instance-editor/constants.js.map +1 -1
  28. package/es/features/metadata-instance-editor/messages.js +16 -0
  29. package/es/features/metadata-instance-editor/messages.js.flow +21 -0
  30. package/es/features/metadata-instance-editor/messages.js.map +1 -1
  31. package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js +32 -0
  32. package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.flow +36 -0
  33. package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.map +1 -0
  34. package/i18n/bn-IN.js +4 -0
  35. package/i18n/da-DK.js +4 -0
  36. package/i18n/de-DE.js +4 -0
  37. package/i18n/en-AU.js +4 -0
  38. package/i18n/en-CA.js +4 -0
  39. package/i18n/en-GB.js +4 -0
  40. package/i18n/en-US.js +4 -0
  41. package/i18n/en-US.properties +8 -0
  42. package/i18n/en-x-pseudo.js +4 -0
  43. package/i18n/es-419.js +4 -0
  44. package/i18n/es-ES.js +4 -0
  45. package/i18n/fi-FI.js +4 -0
  46. package/i18n/fr-CA.js +4 -0
  47. package/i18n/fr-FR.js +4 -0
  48. package/i18n/hi-IN.js +4 -0
  49. package/i18n/it-IT.js +4 -0
  50. package/i18n/ja-JP.js +4 -0
  51. package/i18n/ko-KR.js +4 -0
  52. package/i18n/nb-NO.js +4 -0
  53. package/i18n/nl-NL.js +4 -0
  54. package/i18n/pl-PL.js +4 -0
  55. package/i18n/pt-BR.js +4 -0
  56. package/i18n/ru-RU.js +4 -0
  57. package/i18n/sv-SE.js +4 -0
  58. package/i18n/tr-TR.js +4 -0
  59. package/i18n/zh-CN.js +4 -0
  60. package/i18n/zh-TW.js +4 -0
  61. package/package.json +7 -7
  62. package/src/common/types/metadata.js +6 -0
  63. package/src/elements/content-sidebar/SidebarNav.js +23 -3
  64. package/src/elements/content-sidebar/SidebarNavTablist.js +80 -21
  65. package/src/elements/content-sidebar/__tests__/SidebarNav.test.js +99 -147
  66. package/src/elements/content-sidebar/__tests__/SidebarNavTablist.test.js +189 -42
  67. package/src/features/metadata-instance-editor/CascadePolicy.js +69 -27
  68. package/src/features/metadata-instance-editor/Instance.js +33 -4
  69. package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +70 -63
  70. package/src/features/metadata-instance-editor/__tests__/Instance.test.js +34 -19
  71. package/src/features/metadata-instance-editor/__tests__/Instances.test.js +15 -10
  72. package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +53 -10
  73. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +2 -1
  74. package/src/features/metadata-instance-editor/constants.js +10 -1
  75. package/src/features/metadata-instance-editor/messages.js +21 -0
  76. package/src/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js +36 -0
  77. package/src/features/metadata-instance-editor/__tests__/__snapshots__/CascadePolicy.test.js.snap +0 -108
@@ -1,26 +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 } from 'react-intl';
4
- import { BoxAiAgentSelector } from '@box/box-ai-agent-selector';
3
+ import { InlineNotice } from '@box/blueprint-web';
4
+ import { useCallback } from 'react';
5
+ import { FormattedMessage, useIntl } from 'react-intl';
6
+
5
7
  // $FlowFixMe
6
- import BoxAiLogo from '@box/blueprint-web-assets/icons/Logo/BoxAiLogo';
8
+ import { BoxAiAdvancedColor, BoxAiColor } from '@box/blueprint-web-assets/icons/Medium';
9
+ // $FlowFixMe
10
+ import { BoxAiAgentSelectorWithApiContainer } from '@box/box-ai-agent-selector';
7
11
  import Toggle from '../../components/toggle';
8
12
  import { RadioButton, RadioGroup } from '../../components/radio';
9
13
  import Link from '../../components/link/Link';
10
14
  import IconAlertDefault from '../../icons/general/IconAlertDefault';
11
15
  import messages from './messages';
12
16
  import './CascadePolicy.scss';
17
+ import { STANDARD_AGENT_ID, ENHANCED_AGENT_ID } from './constants';
13
18
  const COMMUNITY_LINK = 'https://support.box.com/hc/en-us/articles/360044195873-Cascading-metadata-in-folders';
14
19
  const AI_LINK = 'https://www.box.com/ai';
15
- const agents = [{
16
- id: '1',
17
- name: 'Basic',
18
- isEnterpriseDefault: true
19
- }, {
20
- id: '2',
21
- name: 'Enhanced (Gemini 2.5 Pro)',
22
- isEnterpriseDefault: false
23
- }];
24
20
  const CascadePolicy = ({
25
21
  canEdit,
26
22
  canUseAIFolderExtraction,
@@ -29,16 +25,47 @@ const CascadePolicy = ({
29
25
  isCascadingOverwritten,
30
26
  isCustomMetadata,
31
27
  isAIFolderExtractionEnabled,
32
- isExistingAIExtractionCascadePolicy,
28
+ isExistingCascadePolicy,
33
29
  onAIFolderExtractionToggle,
30
+ onAIAgentSelect,
34
31
  onCascadeToggle,
35
32
  onCascadeModeChange,
36
33
  shouldShowCascadeOptions
37
34
  }) => {
35
+ const {
36
+ formatMessage
37
+ } = useIntl();
38
38
  const readOnlyState = isCascadingEnabled ? /*#__PURE__*/React.createElement("div", {
39
39
  className: "metadata-cascade-notice"
40
40
  }, /*#__PURE__*/React.createElement(FormattedMessage, messages.metadataCascadePolicyEnabledInfo)) : null;
41
- return canEdit ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
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]);
65
+ return canEdit ? /*#__PURE__*/React.createElement(React.Fragment, null, isExistingCascadePolicy && /*#__PURE__*/React.createElement(InlineNotice, {
66
+ variant: "info",
67
+ variantIconAriaLabel: formatMessage(messages.cascadePolicyOptionsDisabledNoticeIconAriaLabel)
68
+ }, /*#__PURE__*/React.createElement(FormattedMessage, messages.cascadePolicyOptionsDisabledNotice)), /*#__PURE__*/React.createElement("div", {
42
69
  className: "metadata-cascade-editor"
43
70
  }, /*#__PURE__*/React.createElement("div", {
44
71
  className: "metadata-cascade-enable",
@@ -46,6 +73,7 @@ const CascadePolicy = ({
46
73
  }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(FormattedMessage, _extends({
47
74
  tagName: "strong"
48
75
  }, messages.enableCascadePolicy)), !isCustomMetadata && /*#__PURE__*/React.createElement(Toggle, {
76
+ "aria-label": formatMessage(messages.enableCascadePolicy),
49
77
  className: `metadata-cascade-toggle ${isCascadingEnabled ? 'cascade-on' : 'cascade-off'}`,
50
78
  isOn: isCascadingEnabled,
51
79
  label: "",
@@ -67,9 +95,11 @@ const CascadePolicy = ({
67
95
  onChange: e => onCascadeModeChange(e.target.value === 'overwrite'),
68
96
  value: isCascadingOverwritten ? 'overwrite' : 'skip'
69
97
  }, /*#__PURE__*/React.createElement(RadioButton, {
98
+ isDisabled: isExistingCascadePolicy,
70
99
  label: /*#__PURE__*/React.createElement(FormattedMessage, messages.cascadePolicySkipMode),
71
100
  value: "skip"
72
101
  }), /*#__PURE__*/React.createElement(RadioButton, {
102
+ isDisabled: isExistingCascadePolicy,
73
103
  label: /*#__PURE__*/React.createElement(FormattedMessage, messages.cascadePolicyOverwriteMode),
74
104
  value: "overwrite"
75
105
  })))), shouldShowCascadeOptions && canUseAIFolderExtraction && /*#__PURE__*/React.createElement("div", {
@@ -77,16 +107,17 @@ const CascadePolicy = ({
77
107
  "data-testid": "ai-folder-extraction"
78
108
  }, /*#__PURE__*/React.createElement("div", {
79
109
  className: "metadata-cascade-enable"
80
- }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(BoxAiLogo, {
110
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(BoxAiColor, {
81
111
  className: "metadata-cascade-ai-logo",
82
112
  width: 16,
83
113
  height: 16
84
114
  }), /*#__PURE__*/React.createElement(FormattedMessage, _extends({
85
115
  tagName: "strong"
86
116
  }, messages.enableAIAutofill)), /*#__PURE__*/React.createElement(Toggle, {
117
+ "aria-label": formatMessage(messages.enableAIAutofill),
87
118
  className: "metadata-cascade-toggle",
88
119
  isOn: isAIFolderExtractionEnabled,
89
- isDisabled: isExistingAIExtractionCascadePolicy,
120
+ isDisabled: isExistingCascadePolicy,
90
121
  label: "",
91
122
  onChange: e => onAIFolderExtractionToggle(e.target.checked)
92
123
  })), /*#__PURE__*/React.createElement("div", {
@@ -95,14 +126,13 @@ const CascadePolicy = ({
95
126
  className: "cascade-policy-link",
96
127
  href: AI_LINK,
97
128
  target: "_blank"
98
- }, /*#__PURE__*/React.createElement(FormattedMessage, messages.aiAutofillLearnMore))), canUseAIFolderExtractionAgentSelector && /*#__PURE__*/React.createElement("div", {
129
+ }, /*#__PURE__*/React.createElement(FormattedMessage, messages.aiAutofillLearnMore))), canUseAIFolderExtractionAgentSelector && isAIFolderExtractionEnabled && /*#__PURE__*/React.createElement("div", {
99
130
  className: "metadata-cascade-ai-agent-selector"
100
- }, /*#__PURE__*/React.createElement(BoxAiAgentSelector, {
101
- agents: agents,
102
- onErrorAction: () => {},
103
- requestState: "success",
104
- selectedAgent: agents[0],
105
- variant: "sidebar"
131
+ }, /*#__PURE__*/React.createElement(BoxAiAgentSelectorWithApiContainer, {
132
+ disabled: isExistingCascadePolicy,
133
+ fetcher: agentFetcher,
134
+ onSelectAgent: handleAgentSelect,
135
+ recordAction: () => {}
106
136
  }))))) : readOnlyState;
107
137
  };
108
138
  export default CascadePolicy;
@@ -1,10 +1,16 @@
1
1
  // @flow
2
2
  import * as React from 'react';
3
- import { FormattedMessage } from 'react-intl';
4
3
 
5
- import { BoxAiAgentSelector } from '@box/box-ai-agent-selector';
4
+ import { InlineNotice } from '@box/blueprint-web';
5
+ import { useCallback } from 'react';
6
+ import { FormattedMessage, useIntl } from 'react-intl';
7
+
8
+ // $FlowFixMe
9
+ import { BoxAiAdvancedColor, BoxAiColor } from '@box/blueprint-web-assets/icons/Medium';
10
+ import { type AgentType } from '@box/box-ai-agent-selector';
11
+
6
12
  // $FlowFixMe
7
- import BoxAiLogo from '@box/blueprint-web-assets/icons/Logo/BoxAiLogo';
13
+ import { BoxAiAgentSelectorWithApiContainer } from '@box/box-ai-agent-selector';
8
14
 
9
15
  import Toggle from '../../components/toggle';
10
16
  import { RadioButton, RadioGroup } from '../../components/radio';
@@ -12,23 +18,11 @@ import Link from '../../components/link/Link';
12
18
  import IconAlertDefault from '../../icons/general/IconAlertDefault';
13
19
  import messages from './messages';
14
20
  import './CascadePolicy.scss';
21
+ import { STANDARD_AGENT_ID, ENHANCED_AGENT_ID } from './constants';
15
22
 
16
23
  const COMMUNITY_LINK = 'https://support.box.com/hc/en-us/articles/360044195873-Cascading-metadata-in-folders';
17
24
  const AI_LINK = 'https://www.box.com/ai';
18
25
 
19
- const agents = [
20
- {
21
- id: '1',
22
- name: 'Basic',
23
- isEnterpriseDefault: true,
24
- },
25
- {
26
- id: '2',
27
- name: 'Enhanced (Gemini 2.5 Pro)',
28
- isEnterpriseDefault: false,
29
- },
30
- ];
31
-
32
26
  type Props = {
33
27
  canEdit: boolean,
34
28
  canUseAIFolderExtraction: boolean,
@@ -37,8 +31,9 @@ type Props = {
37
31
  isCascadingEnabled: boolean,
38
32
  isCascadingOverwritten: boolean,
39
33
  isCustomMetadata: boolean,
40
- isExistingAIExtractionCascadePolicy: boolean,
34
+ isExistingCascadePolicy: boolean,
41
35
  onAIFolderExtractionToggle: (value: boolean) => void,
36
+ onAIAgentSelect?: (agent: AgentType | null) => void,
42
37
  onCascadeModeChange: (value: boolean) => void,
43
38
  onCascadeToggle: (value: boolean) => void,
44
39
  shouldShowCascadeOptions: boolean,
@@ -52,26 +47,71 @@ const CascadePolicy = ({
52
47
  isCascadingOverwritten,
53
48
  isCustomMetadata,
54
49
  isAIFolderExtractionEnabled,
55
- isExistingAIExtractionCascadePolicy,
50
+ isExistingCascadePolicy,
56
51
  onAIFolderExtractionToggle,
52
+ onAIAgentSelect,
57
53
  onCascadeToggle,
58
54
  onCascadeModeChange,
59
55
  shouldShowCascadeOptions,
60
56
  }: Props) => {
57
+ const { formatMessage } = useIntl();
58
+
61
59
  const readOnlyState = isCascadingEnabled ? (
62
60
  <div className="metadata-cascade-notice">
63
61
  <FormattedMessage {...messages.metadataCascadePolicyEnabledInfo} />
64
62
  </div>
65
63
  ) : null;
66
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
+
67
98
  return canEdit ? (
68
99
  <>
100
+ {isExistingCascadePolicy && (
101
+ <InlineNotice
102
+ variant="info"
103
+ variantIconAriaLabel={formatMessage(messages.cascadePolicyOptionsDisabledNoticeIconAriaLabel)}
104
+ >
105
+ <FormattedMessage {...messages.cascadePolicyOptionsDisabledNotice} />
106
+ </InlineNotice>
107
+ )}
69
108
  <div className="metadata-cascade-editor">
70
109
  <div className="metadata-cascade-enable" data-testid="metadata-cascade-enable">
71
110
  <div>
72
111
  <FormattedMessage tagName="strong" {...messages.enableCascadePolicy} />
73
112
  {!isCustomMetadata && (
74
113
  <Toggle
114
+ aria-label={formatMessage(messages.enableCascadePolicy)}
75
115
  className={`metadata-cascade-toggle ${
76
116
  isCascadingEnabled ? 'cascade-on' : 'cascade-off'
77
117
  }`}
@@ -113,10 +153,12 @@ const CascadePolicy = ({
113
153
  value={isCascadingOverwritten ? 'overwrite' : 'skip'}
114
154
  >
115
155
  <RadioButton
156
+ isDisabled={isExistingCascadePolicy}
116
157
  label={<FormattedMessage {...messages.cascadePolicySkipMode} />}
117
158
  value="skip"
118
159
  />
119
160
  <RadioButton
161
+ isDisabled={isExistingCascadePolicy}
120
162
  label={<FormattedMessage {...messages.cascadePolicyOverwriteMode} />}
121
163
  value="overwrite"
122
164
  />
@@ -128,12 +170,13 @@ const CascadePolicy = ({
128
170
  <div className="metadata-cascade-editor" data-testid="ai-folder-extraction">
129
171
  <div className="metadata-cascade-enable">
130
172
  <div>
131
- <BoxAiLogo className="metadata-cascade-ai-logo" width={16} height={16} />
173
+ <BoxAiColor className="metadata-cascade-ai-logo" width={16} height={16} />
132
174
  <FormattedMessage tagName="strong" {...messages.enableAIAutofill} />
133
175
  <Toggle
176
+ aria-label={formatMessage(messages.enableAIAutofill)}
134
177
  className="metadata-cascade-toggle"
135
178
  isOn={isAIFolderExtractionEnabled}
136
- isDisabled={isExistingAIExtractionCascadePolicy}
179
+ isDisabled={isExistingCascadePolicy}
137
180
  label=""
138
181
  onChange={e => onAIFolderExtractionToggle(e.target.checked)}
139
182
  />
@@ -145,14 +188,13 @@ const CascadePolicy = ({
145
188
  <FormattedMessage {...messages.aiAutofillLearnMore} />
146
189
  </Link>
147
190
  </div>
148
- {canUseAIFolderExtractionAgentSelector && (
191
+ {canUseAIFolderExtractionAgentSelector && isAIFolderExtractionEnabled && (
149
192
  <div className="metadata-cascade-ai-agent-selector">
150
- <BoxAiAgentSelector
151
- agents={agents}
152
- onErrorAction={() => {}}
153
- requestState="success"
154
- selectedAgent={agents[0]}
155
- variant="sidebar"
193
+ <BoxAiAgentSelectorWithApiContainer
194
+ disabled={isExistingCascadePolicy}
195
+ fetcher={agentFetcher}
196
+ onSelectAgent={handleAgentSelect}
197
+ recordAction={() => {}}
156
198
  />
157
199
  </div>
158
200
  )}
@@ -1 +1 @@
1
- {"version":3,"file":"CascadePolicy.js","names":["React","FormattedMessage","BoxAiAgentSelector","BoxAiLogo","Toggle","RadioButton","RadioGroup","Link","IconAlertDefault","messages","COMMUNITY_LINK","AI_LINK","agents","id","name","isEnterpriseDefault","CascadePolicy","canEdit","canUseAIFolderExtraction","canUseAIFolderExtractionAgentSelector","isCascadingEnabled","isCascadingOverwritten","isCustomMetadata","isAIFolderExtractionEnabled","isExistingAIExtractionCascadePolicy","onAIFolderExtractionToggle","onCascadeToggle","onCascadeModeChange","shouldShowCascadeOptions","readOnlyState","createElement","className","metadataCascadePolicyEnabledInfo","Fragment","_extends","tagName","enableCascadePolicy","isOn","label","onChange","e","target","checked","applyCascadePolicyText","href","cascadePolicyLearnMore","cannotApplyCascadePolicyText","cascadePolicyModeQuestion","operationNotImmediate","value","cascadePolicySkipMode","cascadePolicyOverwriteMode","width","height","enableAIAutofill","isDisabled","aiAutofillDescription","aiAutofillLearnMore","onErrorAction","requestState","selectedAgent","variant"],"sources":["../../../src/features/metadata-instance-editor/CascadePolicy.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\nimport { FormattedMessage } from 'react-intl';\n\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 isExistingAIExtractionCascadePolicy: 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 isExistingAIExtractionCascadePolicy,\n onAIFolderExtractionToggle,\n onCascadeToggle,\n onCascadeModeChange,\n shouldShowCascadeOptions,\n}: Props) => {\n const readOnlyState = isCascadingEnabled ? (\n <div className=\"metadata-cascade-notice\">\n <FormattedMessage {...messages.metadataCascadePolicyEnabledInfo} />\n </div>\n ) : null;\n\n return canEdit ? (\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 label={<FormattedMessage {...messages.cascadePolicySkipMode} />}\n value=\"skip\"\n />\n <RadioButton\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={isExistingAIExtractionCascadePolicy}\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 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":";AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,gBAAgB,QAAQ,YAAY;AAE7C,SAASC,kBAAkB,QAAQ,4BAA4B;AAC/D;AACA,OAAOC,SAAS,MAAM,gDAAgD;AAEtE,OAAOC,MAAM,MAAM,yBAAyB;AAC5C,SAASC,WAAW,EAAEC,UAAU,QAAQ,wBAAwB;AAChE,OAAOC,IAAI,MAAM,4BAA4B;AAC7C,OAAOC,gBAAgB,MAAM,sCAAsC;AACnE,OAAOC,QAAQ,MAAM,YAAY;AACjC,OAAO,sBAAsB;AAE7B,MAAMC,cAAc,GAAG,sFAAsF;AAC7G,MAAMC,OAAO,GAAG,wBAAwB;AAExC,MAAMC,MAAM,GAAG,CACX;EACIC,EAAE,EAAE,GAAG;EACPC,IAAI,EAAE,OAAO;EACbC,mBAAmB,EAAE;AACzB,CAAC,EACD;EACIF,EAAE,EAAE,GAAG;EACPC,IAAI,EAAE,2BAA2B;EACjCC,mBAAmB,EAAE;AACzB,CAAC,CACJ;AAiBD,MAAMC,aAAa,GAAGA,CAAC;EACnBC,OAAO;EACPC,wBAAwB;EACxBC,qCAAqC;EACrCC,kBAAkB;EAClBC,sBAAsB;EACtBC,gBAAgB;EAChBC,2BAA2B;EAC3BC,mCAAmC;EACnCC,0BAA0B;EAC1BC,eAAe;EACfC,mBAAmB;EACnBC;AACG,CAAC,KAAK;EACT,MAAMC,aAAa,GAAGT,kBAAkB,gBACpCpB,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpC/B,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAACuB,gCAAmC,CACjE,CAAC,GACN,IAAI;EAER,OAAOf,OAAO,gBACVjB,KAAA,CAAA8B,aAAA,CAAA9B,KAAA,CAAAiC,QAAA,qBACIjC,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpC/B,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC,yBAAyB;IAAC,eAAY;EAAyB,gBAC1E/B,KAAA,CAAA8B,aAAA,2BACI9B,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAAiC,QAAA;IAACC,OAAO,EAAC;EAAQ,GAAK1B,QAAQ,CAAC2B,mBAAmB,CAAG,CAAC,EACtE,CAACd,gBAAgB,iBACdtB,KAAA,CAAA8B,aAAA,CAAC1B,MAAM;IACH2B,SAAS,EAAE,2BACPX,kBAAkB,GAAG,YAAY,GAAG,aAAa,EAClD;IACHiB,IAAI,EAAEjB,kBAAmB;IACzBkB,KAAK,EAAC,EAAE;IACRC,QAAQ,EAAEC,CAAC,IAAId,eAAe,CAACc,CAAC,CAACC,MAAM,CAACC,OAAO;EAAE,CACpD,CAEJ,CAAC,EACL,CAACpB,gBAAgB,gBACdtB,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAqB,gBAChC/B,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAACkC,sBAAyB,CAAC,QAEzD,eAAA3C,KAAA,CAAA8B,aAAA,CAACvB,IAAI;IAACwB,SAAS,EAAC,qBAAqB;IAACa,IAAI,EAAElC,cAAe;IAAC+B,MAAM,EAAC;EAAQ,gBACvEzC,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAACoC,sBAAyB,CACtD,CACL,CAAC,gBAEN7C,KAAA,CAAA8B,aAAA,2BACI9B,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAACqC,4BAA+B,CAC7D,CAER,CACJ,CAAC,EACLlB,wBAAwB,iBACrB5B,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpC/B,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpC/B,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAACsC,yBAA4B,CAAC,eAE5D/C,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAkC,gBAC7C/B,KAAA,CAAA8B,aAAA,CAACtB,gBAAgB,MAAE,CAAC,eACpBR,KAAA,CAAA8B,aAAA,4BACI9B,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAACuC,qBAAwB,CACrD,CACL,CAAC,eACNhD,KAAA,CAAA8B,aAAA,CAACxB,UAAU;IACPyB,SAAS,EAAC,4BAA4B;IACtCQ,QAAQ,EAAEC,CAAC,IAAIb,mBAAmB,CAACa,CAAC,CAACC,MAAM,CAACQ,KAAK,KAAK,WAAW,CAAE;IACnEA,KAAK,EAAE5B,sBAAsB,GAAG,WAAW,GAAG;EAAO,gBAErDrB,KAAA,CAAA8B,aAAA,CAACzB,WAAW;IACRiC,KAAK,eAAEtC,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAACyC,qBAAwB,CAAE;IAChED,KAAK,EAAC;EAAM,CACf,CAAC,eACFjD,KAAA,CAAA8B,aAAA,CAACzB,WAAW;IACRiC,KAAK,eAAEtC,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAAC0C,0BAA6B,CAAE;IACrEF,KAAK,EAAC;EAAW,CACpB,CACO,CACX,CACJ,CACR,EACArB,wBAAwB,IAAIV,wBAAwB,iBACjDlB,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC,yBAAyB;IAAC,eAAY;EAAsB,gBACvE/B,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpC/B,KAAA,CAAA8B,aAAA,2BACI9B,KAAA,CAAA8B,aAAA,CAAC3B,SAAS;IAAC4B,SAAS,EAAC,0BAA0B;IAACqB,KAAK,EAAE,EAAG;IAACC,MAAM,EAAE;EAAG,CAAE,CAAC,eACzErD,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAAiC,QAAA;IAACC,OAAO,EAAC;EAAQ,GAAK1B,QAAQ,CAAC6C,gBAAgB,CAAG,CAAC,eACpEtD,KAAA,CAAA8B,aAAA,CAAC1B,MAAM;IACH2B,SAAS,EAAC,yBAAyB;IACnCM,IAAI,EAAEd,2BAA4B;IAClCgC,UAAU,EAAE/B,mCAAoC;IAChDc,KAAK,EAAC,EAAE;IACRC,QAAQ,EAAEC,CAAC,IAAIf,0BAA0B,CAACe,CAAC,CAACC,MAAM,CAACC,OAAO;EAAE,CAC/D,CACA,CAAC,eACN1C,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAqB,gBAChC/B,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAAC+C,qBAAwB,CAAC,QAExD,eAAAxD,KAAA,CAAA8B,aAAA,CAACvB,IAAI;IAACwB,SAAS,EAAC,qBAAqB;IAACa,IAAI,EAAEjC,OAAQ;IAAC8B,MAAM,EAAC;EAAQ,gBAChEzC,KAAA,CAAA8B,aAAA,CAAC7B,gBAAgB,EAAKQ,QAAQ,CAACgD,mBAAsB,CACnD,CACL,CAAC,EACLtC,qCAAqC,iBAClCnB,KAAA,CAAA8B,aAAA;IAAKC,SAAS,EAAC;EAAoC,gBAC/C/B,KAAA,CAAA8B,aAAA,CAAC5B,kBAAkB;IACfU,MAAM,EAAEA,MAAO;IACf8C,aAAa,EAAEA,CAAA,KAAM,CAAC,CAAE;IACxBC,YAAY,EAAC,SAAS;IACtBC,aAAa,EAAEhD,MAAM,CAAC,CAAC,CAAE;IACzBiD,OAAO,EAAC;EAAS,CACpB,CACA,CAER,CACJ,CAEX,CAAC,GAEHhC,aACH;AACL,CAAC;AAED,eAAeb,aAAa","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),
@@ -591,7 +612,7 @@ class Instance extends React.PureComponent {
591
612
 
592
613
  // Animate short and tall cards at consistent speeds.
593
614
  const animationDuration = (fields.length + 1) * 50;
594
- const isExistingAIExtractionCascadePolicy = this.isCascadingEnabledThroughProps(this.props) && this.isAIFolderExtractionEnabledThroughProps(this.props);
615
+ const isExistingCascadePolicy = this.isCascadingEnabledThroughProps(this.props);
595
616
  return /*#__PURE__*/React.createElement("div", {
596
617
  ref: this.collapsibleRef
597
618
  }, /*#__PURE__*/React.createElement(Collapsible, {
@@ -624,7 +645,8 @@ class Instance extends React.PureComponent {
624
645
  isCascadingEnabled: isCascadingEnabled,
625
646
  isCascadingOverwritten: isCascadingOverwritten,
626
647
  isCustomMetadata: isProperties,
627
- isExistingAIExtractionCascadePolicy: isExistingAIExtractionCascadePolicy,
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),
@@ -641,8 +670,7 @@ class Instance extends React.PureComponent<Props, State> {
641
670
  // Animate short and tall cards at consistent speeds.
642
671
  const animationDuration = (fields.length + 1) * 50;
643
672
 
644
- const isExistingAIExtractionCascadePolicy =
645
- this.isCascadingEnabledThroughProps(this.props) && this.isAIFolderExtractionEnabledThroughProps(this.props);
673
+ const isExistingCascadePolicy = this.isCascadingEnabledThroughProps(this.props);
646
674
 
647
675
  return (
648
676
  <div ref={this.collapsibleRef}>
@@ -681,7 +709,8 @@ class Instance extends React.PureComponent<Props, State> {
681
709
  isCascadingEnabled={isCascadingEnabled}
682
710
  isCascadingOverwritten={isCascadingOverwritten}
683
711
  isCustomMetadata={isProperties}
684
- isExistingAIExtractionCascadePolicy={isExistingAIExtractionCascadePolicy}
712
+ isExistingCascadePolicy={isExistingCascadePolicy}
713
+ onAIAgentSelect={this.onAIAgentSelect}
685
714
  onAIFolderExtractionToggle={this.onAIFolderExtractionToggle}
686
715
  onCascadeModeChange={this.onCascadeModeChange}
687
716
  onCascadeToggle={this.onCascadeToggle}