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.
- package/dist/explorer.js +1 -1
- package/dist/openwith.js +1 -1
- package/dist/picker.js +1 -1
- package/dist/preview.js +1 -1
- package/dist/sharing.js +1 -1
- package/dist/sidebar.js +1 -1
- package/dist/uploader.js +1 -1
- package/es/common/types/metadata.js.flow +6 -0
- package/es/common/types/metadata.js.map +1 -1
- package/es/features/metadata-instance-editor/CascadePolicy.js +40 -20
- package/es/features/metadata-instance-editor/CascadePolicy.js.flow +52 -24
- package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
- package/es/features/metadata-instance-editor/Instance.js +24 -2
- package/es/features/metadata-instance-editor/Instance.js.flow +31 -1
- package/es/features/metadata-instance-editor/Instance.js.map +1 -1
- package/es/features/metadata-instance-editor/constants.js +4 -1
- package/es/features/metadata-instance-editor/constants.js.flow +10 -1
- package/es/features/metadata-instance-editor/constants.js.map +1 -1
- package/es/features/metadata-instance-editor/messages.js +8 -0
- package/es/features/metadata-instance-editor/messages.js.flow +10 -0
- package/es/features/metadata-instance-editor/messages.js.map +1 -1
- package/i18n/bn-IN.js +2 -0
- package/i18n/da-DK.js +2 -0
- package/i18n/de-DE.js +2 -0
- package/i18n/en-AU.js +2 -0
- package/i18n/en-CA.js +2 -0
- package/i18n/en-GB.js +2 -0
- package/i18n/en-US.js +2 -0
- package/i18n/en-US.properties +4 -0
- package/i18n/en-x-pseudo.js +2 -0
- package/i18n/es-419.js +2 -0
- package/i18n/es-ES.js +2 -0
- package/i18n/fi-FI.js +2 -0
- package/i18n/fr-CA.js +2 -0
- package/i18n/fr-FR.js +2 -0
- package/i18n/hi-IN.js +2 -0
- package/i18n/it-IT.js +2 -0
- package/i18n/ja-JP.js +2 -0
- package/i18n/ko-KR.js +2 -0
- package/i18n/nb-NO.js +2 -0
- package/i18n/nl-NL.js +2 -0
- package/i18n/pl-PL.js +2 -0
- package/i18n/pt-BR.js +2 -0
- package/i18n/ru-RU.js +2 -0
- package/i18n/sv-SE.js +2 -0
- package/i18n/tr-TR.js +2 -0
- package/i18n/zh-CN.js +2 -0
- package/i18n/zh-TW.js +2 -0
- package/package.json +3 -3
- package/src/common/types/metadata.js +6 -0
- package/src/features/metadata-instance-editor/CascadePolicy.js +52 -24
- package/src/features/metadata-instance-editor/Instance.js +31 -1
- package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +50 -3
- package/src/features/metadata-instance-editor/__tests__/Instance.test.js +20 -2
- package/src/features/metadata-instance-editor/__tests__/Instances.test.js +15 -10
- package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +53 -10
- package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +1 -0
- package/src/features/metadata-instance-editor/constants.js +10 -1
- 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 {
|
|
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
|
|
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(
|
|
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(
|
|
110
|
-
agents: agents,
|
|
131
|
+
}, /*#__PURE__*/React.createElement(BoxAiAgentSelectorWithApiContainer, {
|
|
111
132
|
disabled: isExistingCascadePolicy,
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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 {
|
|
5
|
+
import { useCallback } from 'react';
|
|
6
|
+
import { FormattedMessage, useIntl } from 'react-intl';
|
|
7
|
+
|
|
7
8
|
// $FlowFixMe
|
|
8
|
-
import
|
|
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
|
-
<
|
|
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
|
-
<
|
|
164
|
-
agents={agents}
|
|
193
|
+
<BoxAiAgentSelectorWithApiContainer
|
|
165
194
|
disabled={isExistingCascadePolicy}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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 \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 \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 \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 \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 {
|
|
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}
|