box-ui-elements 23.4.0-beta.1 → 23.4.0-beta.2

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 (85) hide show
  1. package/dist/explorer.js +1 -1
  2. package/dist/preview.js +1 -1
  3. package/dist/sidebar.js +1 -1
  4. package/es/common/types/metadata.js.flow +1 -0
  5. package/es/common/types/metadata.js.map +1 -1
  6. package/es/features/metadata-instance-editor/CascadePolicy.js +6 -2
  7. package/es/features/metadata-instance-editor/CascadePolicy.js.flow +19 -12
  8. package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
  9. package/es/features/metadata-instance-editor/Instance.js +31 -9
  10. package/es/features/metadata-instance-editor/Instance.js.flow +41 -9
  11. package/es/features/metadata-instance-editor/Instance.js.map +1 -1
  12. package/es/features/metadata-instance-editor/Instances.js +2 -0
  13. package/es/features/metadata-instance-editor/Instances.js.flow +3 -0
  14. package/es/features/metadata-instance-editor/Instances.js.map +1 -1
  15. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js +2 -0
  16. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.flow +3 -0
  17. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.map +1 -1
  18. package/es/features/metadata-instance-editor/TemplateDropdown.js +1 -1
  19. package/es/features/metadata-instance-editor/TemplateDropdown.js.flow +1 -1
  20. package/es/features/metadata-instance-editor/TemplateDropdown.js.map +1 -1
  21. package/es/features/metadata-instance-editor/TemplatedInstance.js +2 -0
  22. package/es/features/metadata-instance-editor/TemplatedInstance.js.flow +11 -1
  23. package/es/features/metadata-instance-editor/TemplatedInstance.js.map +1 -1
  24. package/es/features/metadata-instance-editor/constants.js +2 -1
  25. package/es/features/metadata-instance-editor/constants.js.flow +3 -1
  26. package/es/features/metadata-instance-editor/constants.js.map +1 -1
  27. package/es/features/metadata-instance-fields/DateMetadataField.js +30 -25
  28. package/es/features/metadata-instance-fields/DateMetadataField.js.flow +31 -27
  29. package/es/features/metadata-instance-fields/DateMetadataField.js.map +1 -1
  30. package/es/features/metadata-instance-fields/EnumMetadataField.js +8 -5
  31. package/es/features/metadata-instance-fields/EnumMetadataField.js.flow +8 -6
  32. package/es/features/metadata-instance-fields/EnumMetadataField.js.map +1 -1
  33. package/es/features/metadata-instance-fields/FloatMetadataField.js +2 -0
  34. package/es/features/metadata-instance-fields/FloatMetadataField.js.flow +3 -0
  35. package/es/features/metadata-instance-fields/FloatMetadataField.js.map +1 -1
  36. package/es/features/metadata-instance-fields/IntegerMetadataField.js +2 -0
  37. package/es/features/metadata-instance-fields/IntegerMetadataField.js.flow +3 -0
  38. package/es/features/metadata-instance-fields/IntegerMetadataField.js.map +1 -1
  39. package/es/features/metadata-instance-fields/MetadataField.js +7 -0
  40. package/es/features/metadata-instance-fields/MetadataField.js.flow +8 -0
  41. package/es/features/metadata-instance-fields/MetadataField.js.map +1 -1
  42. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js +2 -0
  43. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js.flow +3 -0
  44. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js.map +1 -1
  45. package/es/features/metadata-instance-fields/TextMetadataField.js +8 -5
  46. package/es/features/metadata-instance-fields/TextMetadataField.js.flow +8 -6
  47. package/es/features/metadata-instance-fields/TextMetadataField.js.map +1 -1
  48. package/package.json +1 -1
  49. package/src/common/types/metadata.js +1 -0
  50. package/src/features/metadata-instance-editor/CascadePolicy.js +19 -12
  51. package/src/features/metadata-instance-editor/Instance.js +41 -9
  52. package/src/features/metadata-instance-editor/Instances.js +3 -0
  53. package/src/features/metadata-instance-editor/MetadataInstanceEditor.js +3 -0
  54. package/src/features/metadata-instance-editor/TemplateDropdown.js +1 -1
  55. package/src/features/metadata-instance-editor/TemplatedInstance.js +11 -1
  56. package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +92 -1
  57. package/src/features/metadata-instance-editor/__tests__/Instance.test.js +207 -2
  58. package/src/features/metadata-instance-editor/__tests__/Instances.test.js +92 -3
  59. package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +105 -0
  60. package/src/features/metadata-instance-editor/__tests__/TemplatedInstance.test.js +83 -1
  61. package/src/features/metadata-instance-editor/__tests__/__snapshots__/CascadePolicy.test.js.snap +1 -0
  62. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +16 -5
  63. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instances.test.js.snap +4 -2
  64. package/src/features/metadata-instance-editor/__tests__/__snapshots__/MetadataInstanceEditor.test.js.snap +1 -0
  65. package/src/features/metadata-instance-editor/__tests__/__snapshots__/TemplatedInstance.test.js.snap +2 -2
  66. package/src/features/metadata-instance-editor/constants.js +3 -1
  67. package/src/features/metadata-instance-fields/DateMetadataField.js +31 -27
  68. package/src/features/metadata-instance-fields/EnumMetadataField.js +8 -6
  69. package/src/features/metadata-instance-fields/FloatMetadataField.js +3 -0
  70. package/src/features/metadata-instance-fields/IntegerMetadataField.js +3 -0
  71. package/src/features/metadata-instance-fields/MetadataField.js +8 -0
  72. package/src/features/metadata-instance-fields/MultiSelectMetadataField.js +3 -0
  73. package/src/features/metadata-instance-fields/TextMetadataField.js +8 -6
  74. package/src/features/metadata-instance-fields/__tests__/DateMetadataField.test.js +59 -8
  75. package/src/features/metadata-instance-fields/__tests__/EnumMetadataField.test.js +63 -18
  76. package/src/features/metadata-instance-fields/__tests__/FloatMetadataField.test.js +68 -4
  77. package/src/features/metadata-instance-fields/__tests__/IntegerMetadataField.test.js +90 -4
  78. package/src/features/metadata-instance-fields/__tests__/MultiSelectMetadataField.test.js +95 -7
  79. package/src/features/metadata-instance-fields/__tests__/TextMetadataField.test.js +107 -14
  80. package/src/features/metadata-instance-fields/__tests__/__snapshots__/DateMetadataField.test.js.snap +0 -18
  81. package/src/features/metadata-instance-fields/__tests__/__snapshots__/EnumMetadataField.test.js.snap +0 -84
  82. package/src/features/metadata-instance-fields/__tests__/__snapshots__/FloatMetadataField.test.js.snap +0 -8
  83. package/src/features/metadata-instance-fields/__tests__/__snapshots__/IntegerMetadataField.test.js.snap +0 -8
  84. package/src/features/metadata-instance-fields/__tests__/__snapshots__/MultiSelectMetadataField.test.js.snap +0 -58
  85. package/src/features/metadata-instance-fields/__tests__/__snapshots__/TextMetadataField.test.js.snap +0 -31
@@ -90,6 +90,7 @@ type MetadataType = {
90
90
  type MetadataCascadePolicy = {
91
91
  canEdit?: boolean,
92
92
  id?: string,
93
+ cascadePolicyType?: string,
93
94
  };
94
95
 
95
96
  type MetadataCascadingPolicyData = {
@@ -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};\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 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":[]}
@@ -26,10 +26,12 @@ const agents = [{
26
26
  const CascadePolicy = ({
27
27
  canEdit,
28
28
  canUseAIFolderExtraction,
29
+ canUseAIFolderExtractionAgentSelector,
29
30
  isCascadingEnabled,
30
31
  isCascadingOverwritten,
31
32
  isCustomMetadata,
32
33
  isAIFolderExtractionEnabled,
34
+ isExistingAIExtractionCascadePolicy,
33
35
  onAIFolderExtractionToggle,
34
36
  onCascadeToggle,
35
37
  onCascadeModeChange,
@@ -41,7 +43,8 @@ const CascadePolicy = ({
41
43
  return canEdit ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
42
44
  className: "metadata-cascade-editor"
43
45
  }, /*#__PURE__*/React.createElement("div", {
44
- className: "metadata-cascade-enable"
46
+ className: "metadata-cascade-enable",
47
+ "data-testid": "metadata-cascade-enable"
45
48
  }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(FormattedMessage, _extends({
46
49
  tagName: "strong"
47
50
  }, messages.enableCascadePolicy)), !isCustomMetadata && /*#__PURE__*/React.createElement(Toggle, {
@@ -85,6 +88,7 @@ const CascadePolicy = ({
85
88
  }, messages.enableAIAutofill)), /*#__PURE__*/React.createElement(Toggle, {
86
89
  className: "metadata-cascade-toggle",
87
90
  isOn: isAIFolderExtractionEnabled,
91
+ isDisabled: isExistingAIExtractionCascadePolicy,
88
92
  label: "",
89
93
  onChange: e => onAIFolderExtractionToggle(e.target.checked)
90
94
  })), /*#__PURE__*/React.createElement("div", {
@@ -93,7 +97,7 @@ const CascadePolicy = ({
93
97
  className: "cascade-policy-link",
94
98
  href: AI_LINK,
95
99
  target: "_blank"
96
- }, /*#__PURE__*/React.createElement(FormattedMessage, messages.aiAutofillLearnMore))), /*#__PURE__*/React.createElement("div", {
100
+ }, /*#__PURE__*/React.createElement(FormattedMessage, messages.aiAutofillLearnMore))), canUseAIFolderExtractionAgentSelector && /*#__PURE__*/React.createElement("div", {
97
101
  className: "metadata-cascade-ai-agent-selector"
98
102
  }, /*#__PURE__*/React.createElement(TooltipProvider, null, /*#__PURE__*/React.createElement(BoxAiAgentSelector, {
99
103
  agents: agents,
@@ -34,10 +34,12 @@ const agents = [
34
34
  type Props = {
35
35
  canEdit: boolean,
36
36
  canUseAIFolderExtraction: boolean,
37
+ canUseAIFolderExtractionAgentSelector: boolean,
37
38
  isAIFolderExtractionEnabled: boolean,
38
39
  isCascadingEnabled: boolean,
39
40
  isCascadingOverwritten: boolean,
40
41
  isCustomMetadata: boolean,
42
+ isExistingAIExtractionCascadePolicy: boolean,
41
43
  onAIFolderExtractionToggle: (value: boolean) => void,
42
44
  onCascadeModeChange: (value: boolean) => void,
43
45
  onCascadeToggle: (value: boolean) => void,
@@ -47,10 +49,12 @@ type Props = {
47
49
  const CascadePolicy = ({
48
50
  canEdit,
49
51
  canUseAIFolderExtraction,
52
+ canUseAIFolderExtractionAgentSelector,
50
53
  isCascadingEnabled,
51
54
  isCascadingOverwritten,
52
55
  isCustomMetadata,
53
56
  isAIFolderExtractionEnabled,
57
+ isExistingAIExtractionCascadePolicy,
54
58
  onAIFolderExtractionToggle,
55
59
  onCascadeToggle,
56
60
  onCascadeModeChange,
@@ -65,7 +69,7 @@ const CascadePolicy = ({
65
69
  return canEdit ? (
66
70
  <>
67
71
  <div className="metadata-cascade-editor">
68
- <div className="metadata-cascade-enable">
72
+ <div className="metadata-cascade-enable" data-testid="metadata-cascade-enable">
69
73
  <div>
70
74
  <FormattedMessage tagName="strong" {...messages.enableCascadePolicy} />
71
75
  {!isCustomMetadata && (
@@ -131,6 +135,7 @@ const CascadePolicy = ({
131
135
  <Toggle
132
136
  className="metadata-cascade-toggle"
133
137
  isOn={isAIFolderExtractionEnabled}
138
+ isDisabled={isExistingAIExtractionCascadePolicy}
134
139
  label=""
135
140
  onChange={e => onAIFolderExtractionToggle(e.target.checked)}
136
141
  />
@@ -142,17 +147,19 @@ const CascadePolicy = ({
142
147
  <FormattedMessage {...messages.aiAutofillLearnMore} />
143
148
  </Link>
144
149
  </div>
145
- <div className="metadata-cascade-ai-agent-selector">
146
- <TooltipProvider>
147
- <BoxAiAgentSelector
148
- agents={agents}
149
- onErrorAction={() => {}}
150
- requestState="success"
151
- selectedAgent={agents[0]}
152
- variant="sidebar"
153
- />
154
- </TooltipProvider>
155
- </div>
150
+ {canUseAIFolderExtractionAgentSelector && (
151
+ <div className="metadata-cascade-ai-agent-selector">
152
+ <TooltipProvider>
153
+ <BoxAiAgentSelector
154
+ agents={agents}
155
+ onErrorAction={() => {}}
156
+ requestState="success"
157
+ selectedAgent={agents[0]}
158
+ variant="sidebar"
159
+ />
160
+ </TooltipProvider>
161
+ </div>
162
+ )}
156
163
  <InlineNotice className="metadata-cascade-ai-notice" variant="info">
157
164
  <FormattedMessage
158
165
  {...messages.aiAutofillNotice}
@@ -1 +1 @@
1
- {"version":3,"file":"CascadePolicy.js","names":["React","FormattedMessage","BoxAiAgentSelector","InlineNotice","TooltipProvider","BoxAiLogo","Toggle","RadioButton","RadioGroup","Link","IconAlertDefault","messages","COMMUNITY_LINK","AI_LINK","PRICING_LINK","agents","id","name","isEnterpriseDefault","CascadePolicy","canEdit","canUseAIFolderExtraction","isCascadingEnabled","isCascadingOverwritten","isCustomMetadata","isAIFolderExtractionEnabled","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","aiAutofillDescription","aiAutofillLearnMore","onErrorAction","requestState","selectedAgent","variant","aiAutofillNotice","values","pricingLink","aiAutofillPricingDetails"],"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';\nimport { InlineNotice, TooltipProvider } from '@box/blueprint-web';\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';\nconst PRICING_LINK = 'https://www.box.com/pricing';\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 isAIFolderExtractionEnabled: boolean,\n isCascadingEnabled: boolean,\n isCascadingOverwritten: boolean,\n isCustomMetadata: 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 isCascadingEnabled,\n isCascadingOverwritten,\n isCustomMetadata,\n isAIFolderExtractionEnabled,\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\">\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 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 <div className=\"metadata-cascade-ai-agent-selector\">\n <TooltipProvider>\n <BoxAiAgentSelector\n agents={agents}\n onErrorAction={() => {}}\n requestState=\"success\"\n selectedAgent={agents[0]}\n variant=\"sidebar\"\n />\n </TooltipProvider>\n </div>\n <InlineNotice className=\"metadata-cascade-ai-notice\" variant=\"info\">\n <FormattedMessage\n {...messages.aiAutofillNotice}\n values={{\n pricingLink: (\n <Link className=\"cascade-policy-link\" href={PRICING_LINK} target=\"_blank\">\n <FormattedMessage {...messages.aiAutofillPricingDetails} />\n </Link>\n ),\n }}\n />\n </InlineNotice>\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,SAASC,YAAY,EAAEC,eAAe,QAAQ,oBAAoB;AAClE;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;AACxC,MAAMC,YAAY,GAAG,6BAA6B;AAElD,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;AAeD,MAAMC,aAAa,GAAGA,CAAC;EACnBC,OAAO;EACPC,wBAAwB;EACxBC,kBAAkB;EAClBC,sBAAsB;EACtBC,gBAAgB;EAChBC,2BAA2B;EAC3BC,0BAA0B;EAC1BC,eAAe;EACfC,mBAAmB;EACnBC;AACG,CAAC,KAAK;EACT,MAAMC,aAAa,GAAGR,kBAAkB,gBACpCtB,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpChC,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACsB,gCAAmC,CACjE,CAAC,GACN,IAAI;EAER,OAAOb,OAAO,gBACVpB,KAAA,CAAA+B,aAAA,CAAA/B,KAAA,CAAAkC,QAAA,qBACIlC,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpChC,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpChC,KAAA,CAAA+B,aAAA,2BACI/B,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAAkC,QAAA;IAACC,OAAO,EAAC;EAAQ,GAAKzB,QAAQ,CAAC0B,mBAAmB,CAAG,CAAC,EACtE,CAACb,gBAAgB,iBACdxB,KAAA,CAAA+B,aAAA,CAACzB,MAAM;IACH0B,SAAS,EAAE,2BACPV,kBAAkB,GAAG,YAAY,GAAG,aAAa,EAClD;IACHgB,IAAI,EAAEhB,kBAAmB;IACzBiB,KAAK,EAAC,EAAE;IACRC,QAAQ,EAAEC,CAAC,IAAId,eAAe,CAACc,CAAC,CAACC,MAAM,CAACC,OAAO;EAAE,CACpD,CAEJ,CAAC,EACL,CAACnB,gBAAgB,gBACdxB,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAqB,gBAChChC,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACiC,sBAAyB,CAAC,QAEzD,eAAA5C,KAAA,CAAA+B,aAAA,CAACtB,IAAI;IAACuB,SAAS,EAAC,qBAAqB;IAACa,IAAI,EAAEjC,cAAe;IAAC8B,MAAM,EAAC;EAAQ,gBACvE1C,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACmC,sBAAyB,CACtD,CACL,CAAC,gBAEN9C,KAAA,CAAA+B,aAAA,2BACI/B,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACoC,4BAA+B,CAC7D,CAER,CACJ,CAAC,EACLlB,wBAAwB,iBACrB7B,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpChC,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpChC,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACqC,yBAA4B,CAAC,eAE5DhD,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAkC,gBAC7ChC,KAAA,CAAA+B,aAAA,CAACrB,gBAAgB,MAAE,CAAC,eACpBV,KAAA,CAAA+B,aAAA,4BACI/B,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACsC,qBAAwB,CACrD,CACL,CAAC,eACNjD,KAAA,CAAA+B,aAAA,CAACvB,UAAU;IACPwB,SAAS,EAAC,4BAA4B;IACtCQ,QAAQ,EAAEC,CAAC,IAAIb,mBAAmB,CAACa,CAAC,CAACC,MAAM,CAACQ,KAAK,KAAK,WAAW,CAAE;IACnEA,KAAK,EAAE3B,sBAAsB,GAAG,WAAW,GAAG;EAAO,gBAErDvB,KAAA,CAAA+B,aAAA,CAACxB,WAAW;IACRgC,KAAK,eAAEvC,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACwC,qBAAwB,CAAE;IAChED,KAAK,EAAC;EAAM,CACf,CAAC,eACFlD,KAAA,CAAA+B,aAAA,CAACxB,WAAW;IACRgC,KAAK,eAAEvC,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACyC,0BAA6B,CAAE;IACrEF,KAAK,EAAC;EAAW,CACpB,CACO,CACX,CACJ,CACR,EACArB,wBAAwB,IAAIR,wBAAwB,iBACjDrB,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC,yBAAyB;IAAC,eAAY;EAAsB,gBACvEhC,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAyB,gBACpChC,KAAA,CAAA+B,aAAA,2BACI/B,KAAA,CAAA+B,aAAA,CAAC1B,SAAS;IAAC2B,SAAS,EAAC,0BAA0B;IAACqB,KAAK,EAAE,EAAG;IAACC,MAAM,EAAE;EAAG,CAAE,CAAC,eACzEtD,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAAkC,QAAA;IAACC,OAAO,EAAC;EAAQ,GAAKzB,QAAQ,CAAC4C,gBAAgB,CAAG,CAAC,eACpEvD,KAAA,CAAA+B,aAAA,CAACzB,MAAM;IACH0B,SAAS,EAAC,yBAAyB;IACnCM,IAAI,EAAEb,2BAA4B;IAClCc,KAAK,EAAC,EAAE;IACRC,QAAQ,EAAEC,CAAC,IAAIf,0BAA0B,CAACe,CAAC,CAACC,MAAM,CAACC,OAAO;EAAE,CAC/D,CACA,CAAC,eACN3C,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAqB,gBAChChC,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAAC6C,qBAAwB,CAAC,QAExD,eAAAxD,KAAA,CAAA+B,aAAA,CAACtB,IAAI;IAACuB,SAAS,EAAC,qBAAqB;IAACa,IAAI,EAAEhC,OAAQ;IAAC6B,MAAM,EAAC;EAAQ,gBAChE1C,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAAC8C,mBAAsB,CACnD,CACL,CAAC,eACNzD,KAAA,CAAA+B,aAAA;IAAKC,SAAS,EAAC;EAAoC,gBAC/ChC,KAAA,CAAA+B,aAAA,CAAC3B,eAAe,qBACZJ,KAAA,CAAA+B,aAAA,CAAC7B,kBAAkB;IACfa,MAAM,EAAEA,MAAO;IACf2C,aAAa,EAAEA,CAAA,KAAM,CAAC,CAAE;IACxBC,YAAY,EAAC,SAAS;IACtBC,aAAa,EAAE7C,MAAM,CAAC,CAAC,CAAE;IACzB8C,OAAO,EAAC;EAAS,CACpB,CACY,CAChB,CAAC,eACN7D,KAAA,CAAA+B,aAAA,CAAC5B,YAAY;IAAC6B,SAAS,EAAC,4BAA4B;IAAC6B,OAAO,EAAC;EAAM,gBAC/D7D,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAAkC,QAAA,KACTxB,QAAQ,CAACmD,gBAAgB;IAC7BC,MAAM,EAAE;MACJC,WAAW,eACPhE,KAAA,CAAA+B,aAAA,CAACtB,IAAI;QAACuB,SAAS,EAAC,qBAAqB;QAACa,IAAI,EAAE/B,YAAa;QAAC4B,MAAM,EAAC;MAAQ,gBACrE1C,KAAA,CAAA+B,aAAA,CAAC9B,gBAAgB,EAAKU,QAAQ,CAACsD,wBAA2B,CACxD;IAEd;EAAE,EACL,CACS,CACb,CACJ,CAEX,CAAC,GAEHnC,aACH;AACL,CAAC;AAED,eAAeX,aAAa","ignoreList":[]}
1
+ {"version":3,"file":"CascadePolicy.js","names":["React","FormattedMessage","BoxAiAgentSelector","InlineNotice","TooltipProvider","BoxAiLogo","Toggle","RadioButton","RadioGroup","Link","IconAlertDefault","messages","COMMUNITY_LINK","AI_LINK","PRICING_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","aiAutofillNotice","values","pricingLink","aiAutofillPricingDetails"],"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';\nimport { InlineNotice, TooltipProvider } from '@box/blueprint-web';\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';\nconst PRICING_LINK = 'https://www.box.com/pricing';\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 <TooltipProvider>\n <BoxAiAgentSelector\n agents={agents}\n onErrorAction={() => {}}\n requestState=\"success\"\n selectedAgent={agents[0]}\n variant=\"sidebar\"\n />\n </TooltipProvider>\n </div>\n )}\n <InlineNotice className=\"metadata-cascade-ai-notice\" variant=\"info\">\n <FormattedMessage\n {...messages.aiAutofillNotice}\n values={{\n pricingLink: (\n <Link className=\"cascade-policy-link\" href={PRICING_LINK} target=\"_blank\">\n <FormattedMessage {...messages.aiAutofillPricingDetails} />\n </Link>\n ),\n }}\n />\n </InlineNotice>\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 TEMPLATE_CUSTOM_PROPERTIES from './constants';
30
+ import { CASCADE_POLICY_TYPE_AI_EXTRACT, TEMPLATE_CUSTOM_PROPERTIES } 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';
@@ -128,6 +128,7 @@ class Instance extends React.PureComponent {
128
128
  const {
129
129
  data: currentData,
130
130
  errors,
131
+ isAIFolderExtractionEnabled,
131
132
  isCascadingEnabled,
132
133
  isCascadingOverwritten
133
134
  } = this.state;
@@ -137,13 +138,15 @@ class Instance extends React.PureComponent {
137
138
  this.setState({
138
139
  isBusy: true,
139
140
  isEditing: false,
140
- shouldShowCascadeOptions: false
141
+ // reset state if cascading policy is removed
142
+ isAIFolderExtractionEnabled: isCascadingEnabled ? isAIFolderExtractionEnabled : false
141
143
  });
142
144
  onSave(id, this.createJSONPatch(currentData, originalData), isCascadingPolicyApplicable ? {
143
145
  canEdit: cascadePolicy ? cascadePolicy.canEdit : false,
144
146
  id: cascadePolicy ? cascadePolicy.id : undefined,
145
147
  isEnabled: isCascadingEnabled,
146
- overwrite: isCascadingOverwritten
148
+ overwrite: isCascadingOverwritten,
149
+ isAIFolderExtractionEnabled
147
150
  } : undefined, cloneDeep(currentData));
148
151
  });
149
152
  /**
@@ -276,13 +279,14 @@ class Instance extends React.PureComponent {
276
279
  const {
277
280
  data,
278
281
  isCascadingEnabled,
279
- isCascadingOverwritten
282
+ isCascadingOverwritten,
283
+ isAIFolderExtractionEnabled
280
284
  } = this.state;
281
285
  const hasDataChanged = !isEqual(data, this.props.data);
282
286
  let hasCascadingChanged = false;
283
287
  if (isCascadingPolicyApplicable) {
284
288
  // isCascadingOverwritten always starts out as false, so true signifies a change
285
- hasCascadingChanged = isCascadingOverwritten || isCascadingEnabled !== this.isCascadingEnabled(this.props);
289
+ hasCascadingChanged = isCascadingOverwritten || isCascadingEnabled !== this.isCascadingEnabledThroughProps(this.props) || isAIFolderExtractionEnabled !== this.isAIFolderExtractionEnabledThroughProps(this.props);
286
290
  }
287
291
 
288
292
  // Callback to parent to tell that something is dirty
@@ -387,11 +391,11 @@ class Instance extends React.PureComponent {
387
391
  * @return {Object} - react state
388
392
  */
389
393
  getState(props) {
390
- const isCascadingEnabled = this.isCascadingEnabled(props);
394
+ const isCascadingEnabled = this.isCascadingEnabledThroughProps(props);
391
395
  return {
392
396
  data: cloneDeep(props.data),
393
397
  errors: {},
394
- isAIFolderExtractionEnabled: false,
398
+ isAIFolderExtractionEnabled: this.isAIFolderExtractionEnabledThroughProps(props),
395
399
  isBusy: false,
396
400
  isCascadingEnabled,
397
401
  isCascadingOverwritten: false,
@@ -439,18 +443,31 @@ class Instance extends React.PureComponent {
439
443
  return this.renderDeleteMessage(isFile, template);
440
444
  }
441
445
  /**
442
- * Determines if cascading policy is enabled based on
446
+ * Determines if cascading policy is enabled through props based on
443
447
  * whether it has an id or not.
444
448
  *
445
449
  * @param {Object} props - component props
446
450
  * @return {boolean} true if cascading policy is enabled
447
451
  */
448
- isCascadingEnabled(props) {
452
+ isCascadingEnabledThroughProps(props) {
449
453
  if (props.cascadePolicy) {
450
454
  return !!props.cascadePolicy.id;
451
455
  }
452
456
  return false;
453
457
  }
458
+
459
+ /**
460
+ * Determines if ai extraction is enabled based on
461
+ * if cascade policy type is ai_extract
462
+ *
463
+ * @param {Object} props - component props
464
+ * @return {boolean} true if ai extraction is enabled
465
+ */
466
+ isAIFolderExtractionEnabledThroughProps({
467
+ cascadePolicy
468
+ }) {
469
+ return cascadePolicy?.cascadePolicyType === CASCADE_POLICY_TYPE_AI_EXTRACT;
470
+ }
454
471
  /**
455
472
  * Creates JSON Patch operations from the passed in
456
473
  * data while comparing it to the original data from props.
@@ -546,6 +563,7 @@ class Instance extends React.PureComponent {
546
563
  render() {
547
564
  const {
548
565
  canUseAIFolderExtraction = false,
566
+ canUseAIFolderExtractionAgentSelector = false,
549
567
  cascadePolicy = {},
550
568
  isDirty,
551
569
  isCascadingPolicyApplicable,
@@ -573,6 +591,7 @@ class Instance extends React.PureComponent {
573
591
 
574
592
  // Animate short and tall cards at consistent speeds.
575
593
  const animationDuration = (fields.length + 1) * 50;
594
+ const isExistingAIExtractionCascadePolicy = this.isCascadingEnabledThroughProps(this.props) && this.isAIFolderExtractionEnabledThroughProps(this.props);
576
595
  return /*#__PURE__*/React.createElement("div", {
577
596
  ref: this.collapsibleRef
578
597
  }, /*#__PURE__*/React.createElement(Collapsible, {
@@ -600,10 +619,12 @@ class Instance extends React.PureComponent {
600
619
  }, isCascadingPolicyApplicable && /*#__PURE__*/React.createElement(CascadePolicy, {
601
620
  canEdit: isEditing && !!cascadePolicy.canEdit,
602
621
  canUseAIFolderExtraction: canUseAIFolderExtraction,
622
+ canUseAIFolderExtractionAgentSelector: canUseAIFolderExtractionAgentSelector,
603
623
  isAIFolderExtractionEnabled: isAIFolderExtractionEnabled,
604
624
  isCascadingEnabled: isCascadingEnabled,
605
625
  isCascadingOverwritten: isCascadingOverwritten,
606
626
  isCustomMetadata: isProperties,
627
+ isExistingAIExtractionCascadePolicy: isExistingAIExtractionCascadePolicy,
607
628
  onAIFolderExtractionToggle: this.onAIFolderExtractionToggle,
608
629
  onCascadeModeChange: this.onCascadeModeChange,
609
630
  onCascadeToggle: this.onCascadeToggle,
@@ -617,6 +638,7 @@ class Instance extends React.PureComponent {
617
638
  canEdit: isEditing,
618
639
  data: data,
619
640
  errors: errors,
641
+ isDisabled: isAIFolderExtractionEnabled,
620
642
  onFieldChange: this.onFieldChange,
621
643
  onFieldRemove: this.onFieldRemove,
622
644
  template: template
@@ -24,7 +24,7 @@ import MetadataInstanceConfirmDialog from './MetadataInstanceConfirmDialog';
24
24
  import Footer from './Footer';
25
25
  import messages from './messages';
26
26
  import { FIELD_TYPE_FLOAT, FIELD_TYPE_INTEGER } from '../metadata-instance-fields/constants';
27
- import TEMPLATE_CUSTOM_PROPERTIES from './constants';
27
+ import { CASCADE_POLICY_TYPE_AI_EXTRACT, TEMPLATE_CUSTOM_PROPERTIES } from './constants';
28
28
  import {
29
29
  JSON_PATCH_OP_REMOVE,
30
30
  JSON_PATCH_OP_ADD,
@@ -48,6 +48,7 @@ import './Instance.scss';
48
48
  type Props = {
49
49
  canEdit: boolean,
50
50
  canUseAIFolderExtraction?: boolean,
51
+ canUseAIFolderExtractionAgentSelector?: boolean,
51
52
  cascadePolicy?: MetadataCascadePolicy, // eslint-disable-line
52
53
  data: MetadataFields,
53
54
  hasError: boolean,
@@ -210,7 +211,13 @@ class Instance extends React.PureComponent<Props, State> {
210
211
  isCascadingPolicyApplicable,
211
212
  onSave,
212
213
  }: Props = this.props;
213
- const { data: currentData, errors, isCascadingEnabled, isCascadingOverwritten }: State = this.state;
214
+ const {
215
+ data: currentData,
216
+ errors,
217
+ isAIFolderExtractionEnabled,
218
+ isCascadingEnabled,
219
+ isCascadingOverwritten,
220
+ }: State = this.state;
214
221
 
215
222
  if (!this.isEditing() || !isDirty || !onSave || Object.keys(errors).length) {
216
223
  return;
@@ -219,7 +226,8 @@ class Instance extends React.PureComponent<Props, State> {
219
226
  this.setState({
220
227
  isBusy: true,
221
228
  isEditing: false,
222
- shouldShowCascadeOptions: false,
229
+ // reset state if cascading policy is removed
230
+ isAIFolderExtractionEnabled: isCascadingEnabled ? isAIFolderExtractionEnabled : false,
223
231
  });
224
232
  onSave(
225
233
  id,
@@ -230,6 +238,7 @@ class Instance extends React.PureComponent<Props, State> {
230
238
  id: cascadePolicy ? cascadePolicy.id : undefined,
231
239
  isEnabled: isCascadingEnabled,
232
240
  overwrite: isCascadingOverwritten,
241
+ isAIFolderExtractionEnabled,
233
242
  }
234
243
  : undefined,
235
244
  cloneDeep(currentData),
@@ -339,12 +348,12 @@ class Instance extends React.PureComponent<Props, State> {
339
348
  * @return {Object} - react state
340
349
  */
341
350
  getState(props: Props): State {
342
- const isCascadingEnabled = this.isCascadingEnabled(props);
351
+ const isCascadingEnabled = this.isCascadingEnabledThroughProps(props);
343
352
 
344
353
  return {
345
354
  data: cloneDeep(props.data),
346
355
  errors: {},
347
- isAIFolderExtractionEnabled: false,
356
+ isAIFolderExtractionEnabled: this.isAIFolderExtractionEnabledThroughProps(props),
348
357
  isBusy: false,
349
358
  isCascadingEnabled,
350
359
  isCascadingOverwritten: false,
@@ -420,13 +429,16 @@ class Instance extends React.PureComponent<Props, State> {
420
429
  */
421
430
  setDirty = (type?: string): void => {
422
431
  const { id, isCascadingPolicyApplicable, onModification }: Props = this.props;
423
- const { data, isCascadingEnabled, isCascadingOverwritten } = this.state;
432
+ const { data, isCascadingEnabled, isCascadingOverwritten, isAIFolderExtractionEnabled } = this.state;
424
433
  const hasDataChanged = !isEqual(data, this.props.data);
425
434
  let hasCascadingChanged = false;
426
435
 
427
436
  if (isCascadingPolicyApplicable) {
428
437
  // isCascadingOverwritten always starts out as false, so true signifies a change
429
- hasCascadingChanged = isCascadingOverwritten || isCascadingEnabled !== this.isCascadingEnabled(this.props);
438
+ hasCascadingChanged =
439
+ isCascadingOverwritten ||
440
+ isCascadingEnabled !== this.isCascadingEnabledThroughProps(this.props) ||
441
+ isAIFolderExtractionEnabled !== this.isAIFolderExtractionEnabledThroughProps(this.props);
430
442
  }
431
443
 
432
444
  // Callback to parent to tell that something is dirty
@@ -442,19 +454,30 @@ class Instance extends React.PureComponent<Props, State> {
442
454
  fieldKeyToTypeMap: Object;
443
455
 
444
456
  /**
445
- * Determines if cascading policy is enabled based on
457
+ * Determines if cascading policy is enabled through props based on
446
458
  * whether it has an id or not.
447
459
  *
448
460
  * @param {Object} props - component props
449
461
  * @return {boolean} true if cascading policy is enabled
450
462
  */
451
- isCascadingEnabled(props: Props) {
463
+ isCascadingEnabledThroughProps(props: Props) {
452
464
  if (props.cascadePolicy) {
453
465
  return !!props.cascadePolicy.id;
454
466
  }
455
467
  return false;
456
468
  }
457
469
 
470
+ /**
471
+ * Determines if ai extraction is enabled based on
472
+ * if cascade policy type is ai_extract
473
+ *
474
+ * @param {Object} props - component props
475
+ * @return {boolean} true if ai extraction is enabled
476
+ */
477
+ isAIFolderExtractionEnabledThroughProps({ cascadePolicy }: Props) {
478
+ return cascadePolicy?.cascadePolicyType === CASCADE_POLICY_TYPE_AI_EXTRACT;
479
+ }
480
+
458
481
  /**
459
482
  * Toggles the edit mode
460
483
  *
@@ -590,6 +613,7 @@ class Instance extends React.PureComponent<Props, State> {
590
613
  render() {
591
614
  const {
592
615
  canUseAIFolderExtraction = false,
616
+ canUseAIFolderExtractionAgentSelector = false,
593
617
  cascadePolicy = {},
594
618
  isDirty,
595
619
  isCascadingPolicyApplicable,
@@ -617,6 +641,9 @@ class Instance extends React.PureComponent<Props, State> {
617
641
  // Animate short and tall cards at consistent speeds.
618
642
  const animationDuration = (fields.length + 1) * 50;
619
643
 
644
+ const isExistingAIExtractionCascadePolicy =
645
+ this.isCascadingEnabledThroughProps(this.props) && this.isAIFolderExtractionEnabledThroughProps(this.props);
646
+
620
647
  return (
621
648
  <div ref={this.collapsibleRef}>
622
649
  <Collapsible
@@ -647,10 +674,14 @@ class Instance extends React.PureComponent<Props, State> {
647
674
  <CascadePolicy
648
675
  canEdit={isEditing && !!cascadePolicy.canEdit}
649
676
  canUseAIFolderExtraction={canUseAIFolderExtraction}
677
+ canUseAIFolderExtractionAgentSelector={
678
+ canUseAIFolderExtractionAgentSelector
679
+ }
650
680
  isAIFolderExtractionEnabled={isAIFolderExtractionEnabled}
651
681
  isCascadingEnabled={isCascadingEnabled}
652
682
  isCascadingOverwritten={isCascadingOverwritten}
653
683
  isCustomMetadata={isProperties}
684
+ isExistingAIExtractionCascadePolicy={isExistingAIExtractionCascadePolicy}
654
685
  onAIFolderExtractionToggle={this.onAIFolderExtractionToggle}
655
686
  onCascadeModeChange={this.onCascadeModeChange}
656
687
  onCascadeToggle={this.onCascadeToggle}
@@ -669,6 +700,7 @@ class Instance extends React.PureComponent<Props, State> {
669
700
  canEdit={isEditing}
670
701
  data={data}
671
702
  errors={errors}
703
+ isDisabled={isAIFolderExtractionEnabled}
672
704
  onFieldChange={this.onFieldChange}
673
705
  onFieldRemove={this.onFieldRemove}
674
706
  template={template}