box-ui-elements 23.3.1-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 (92) hide show
  1. package/dist/explorer.js +1 -1
  2. package/dist/preview.js +1 -1
  3. package/dist/sharing.js +1 -1
  4. package/dist/sharing.js.LICENSE.txt +10 -0
  5. package/dist/sidebar.js +1 -1
  6. package/es/common/types/metadata.js.flow +1 -0
  7. package/es/common/types/metadata.js.map +1 -1
  8. package/es/components/notification/Notification.js +17 -8
  9. package/es/components/notification/Notification.js.flow +15 -8
  10. package/es/components/notification/Notification.js.map +1 -1
  11. package/es/features/metadata-instance-editor/CascadePolicy.js +6 -2
  12. package/es/features/metadata-instance-editor/CascadePolicy.js.flow +19 -12
  13. package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
  14. package/es/features/metadata-instance-editor/Instance.js +31 -9
  15. package/es/features/metadata-instance-editor/Instance.js.flow +41 -9
  16. package/es/features/metadata-instance-editor/Instance.js.map +1 -1
  17. package/es/features/metadata-instance-editor/Instances.js +2 -0
  18. package/es/features/metadata-instance-editor/Instances.js.flow +3 -0
  19. package/es/features/metadata-instance-editor/Instances.js.map +1 -1
  20. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js +2 -0
  21. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.flow +3 -0
  22. package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.map +1 -1
  23. package/es/features/metadata-instance-editor/TemplateDropdown.js +1 -1
  24. package/es/features/metadata-instance-editor/TemplateDropdown.js.flow +1 -1
  25. package/es/features/metadata-instance-editor/TemplateDropdown.js.map +1 -1
  26. package/es/features/metadata-instance-editor/TemplatedInstance.js +2 -0
  27. package/es/features/metadata-instance-editor/TemplatedInstance.js.flow +11 -1
  28. package/es/features/metadata-instance-editor/TemplatedInstance.js.map +1 -1
  29. package/es/features/metadata-instance-editor/constants.js +2 -1
  30. package/es/features/metadata-instance-editor/constants.js.flow +3 -1
  31. package/es/features/metadata-instance-editor/constants.js.map +1 -1
  32. package/es/features/metadata-instance-fields/DateMetadataField.js +30 -25
  33. package/es/features/metadata-instance-fields/DateMetadataField.js.flow +31 -27
  34. package/es/features/metadata-instance-fields/DateMetadataField.js.map +1 -1
  35. package/es/features/metadata-instance-fields/EnumMetadataField.js +8 -5
  36. package/es/features/metadata-instance-fields/EnumMetadataField.js.flow +8 -6
  37. package/es/features/metadata-instance-fields/EnumMetadataField.js.map +1 -1
  38. package/es/features/metadata-instance-fields/FloatMetadataField.js +2 -0
  39. package/es/features/metadata-instance-fields/FloatMetadataField.js.flow +3 -0
  40. package/es/features/metadata-instance-fields/FloatMetadataField.js.map +1 -1
  41. package/es/features/metadata-instance-fields/IntegerMetadataField.js +2 -0
  42. package/es/features/metadata-instance-fields/IntegerMetadataField.js.flow +3 -0
  43. package/es/features/metadata-instance-fields/IntegerMetadataField.js.map +1 -1
  44. package/es/features/metadata-instance-fields/MetadataField.js +7 -0
  45. package/es/features/metadata-instance-fields/MetadataField.js.flow +8 -0
  46. package/es/features/metadata-instance-fields/MetadataField.js.map +1 -1
  47. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js +2 -0
  48. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js.flow +3 -0
  49. package/es/features/metadata-instance-fields/MultiSelectMetadataField.js.map +1 -1
  50. package/es/features/metadata-instance-fields/TextMetadataField.js +8 -5
  51. package/es/features/metadata-instance-fields/TextMetadataField.js.flow +8 -6
  52. package/es/features/metadata-instance-fields/TextMetadataField.js.map +1 -1
  53. package/package.json +1 -1
  54. package/src/common/types/metadata.js +1 -0
  55. package/src/components/notification/Notification.js +15 -8
  56. package/src/components/notification/__tests__/Notification.test.js +21 -1
  57. package/src/features/metadata-instance-editor/CascadePolicy.js +19 -12
  58. package/src/features/metadata-instance-editor/Instance.js +41 -9
  59. package/src/features/metadata-instance-editor/Instances.js +3 -0
  60. package/src/features/metadata-instance-editor/MetadataInstanceEditor.js +3 -0
  61. package/src/features/metadata-instance-editor/TemplateDropdown.js +1 -1
  62. package/src/features/metadata-instance-editor/TemplatedInstance.js +11 -1
  63. package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +92 -1
  64. package/src/features/metadata-instance-editor/__tests__/Instance.test.js +207 -2
  65. package/src/features/metadata-instance-editor/__tests__/Instances.test.js +92 -3
  66. package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +105 -0
  67. package/src/features/metadata-instance-editor/__tests__/TemplatedInstance.test.js +83 -1
  68. package/src/features/metadata-instance-editor/__tests__/__snapshots__/CascadePolicy.test.js.snap +1 -0
  69. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +16 -5
  70. package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instances.test.js.snap +4 -2
  71. package/src/features/metadata-instance-editor/__tests__/__snapshots__/MetadataInstanceEditor.test.js.snap +1 -0
  72. package/src/features/metadata-instance-editor/__tests__/__snapshots__/TemplatedInstance.test.js.snap +2 -2
  73. package/src/features/metadata-instance-editor/constants.js +3 -1
  74. package/src/features/metadata-instance-fields/DateMetadataField.js +31 -27
  75. package/src/features/metadata-instance-fields/EnumMetadataField.js +8 -6
  76. package/src/features/metadata-instance-fields/FloatMetadataField.js +3 -0
  77. package/src/features/metadata-instance-fields/IntegerMetadataField.js +3 -0
  78. package/src/features/metadata-instance-fields/MetadataField.js +8 -0
  79. package/src/features/metadata-instance-fields/MultiSelectMetadataField.js +3 -0
  80. package/src/features/metadata-instance-fields/TextMetadataField.js +8 -6
  81. package/src/features/metadata-instance-fields/__tests__/DateMetadataField.test.js +59 -8
  82. package/src/features/metadata-instance-fields/__tests__/EnumMetadataField.test.js +63 -18
  83. package/src/features/metadata-instance-fields/__tests__/FloatMetadataField.test.js +68 -4
  84. package/src/features/metadata-instance-fields/__tests__/IntegerMetadataField.test.js +90 -4
  85. package/src/features/metadata-instance-fields/__tests__/MultiSelectMetadataField.test.js +95 -7
  86. package/src/features/metadata-instance-fields/__tests__/TextMetadataField.test.js +107 -14
  87. package/src/features/metadata-instance-fields/__tests__/__snapshots__/DateMetadataField.test.js.snap +0 -18
  88. package/src/features/metadata-instance-fields/__tests__/__snapshots__/EnumMetadataField.test.js.snap +0 -84
  89. package/src/features/metadata-instance-fields/__tests__/__snapshots__/FloatMetadataField.test.js.snap +0 -8
  90. package/src/features/metadata-instance-fields/__tests__/__snapshots__/IntegerMetadataField.test.js.snap +0 -8
  91. package/src/features/metadata-instance-fields/__tests__/__snapshots__/MultiSelectMetadataField.test.js.snap +0 -58
  92. 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":[]}
@@ -4,6 +4,9 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
4
4
  import * as React from 'react';
5
5
  import { defineMessages, injectIntl } from 'react-intl';
6
6
  import classNames from 'classnames';
7
+
8
+ // $FlowFixMe
9
+ import { Information, Check, AlertTriangle, AlertBadge, XMark } from '@box/blueprint-web-assets/icons/Medium';
7
10
  import InfoBadge16 from '../../icon/line/InfoBadge16';
8
11
  import CircleCheck16 from '../../icon/line/CircleCheck16';
9
12
  import TriangleAlert16 from '../../icon/line/TriangleAlert16';
@@ -26,10 +29,10 @@ const DURATION_TIMES = {
26
29
  [DURATION_LONG]: 10000
27
30
  };
28
31
  const ICON_RENDERER = {
29
- [TYPE_DEFAULT]: () => /*#__PURE__*/React.createElement(InfoBadge16, null),
30
- [TYPE_ERROR]: () => /*#__PURE__*/React.createElement(XBadge16, null),
31
- [TYPE_INFO]: () => /*#__PURE__*/React.createElement(CircleCheck16, null),
32
- [TYPE_WARN]: () => /*#__PURE__*/React.createElement(TriangleAlert16, null)
32
+ [TYPE_DEFAULT]: useV2Icons => useV2Icons ? /*#__PURE__*/React.createElement(Information, null) : /*#__PURE__*/React.createElement(InfoBadge16, null),
33
+ [TYPE_ERROR]: useV2Icons => useV2Icons ? /*#__PURE__*/React.createElement(AlertBadge, null) : /*#__PURE__*/React.createElement(XBadge16, null),
34
+ [TYPE_INFO]: useV2Icons => useV2Icons ? /*#__PURE__*/React.createElement(Check, null) : /*#__PURE__*/React.createElement(CircleCheck16, null),
35
+ [TYPE_WARN]: useV2Icons => useV2Icons ? /*#__PURE__*/React.createElement(AlertTriangle, null) : /*#__PURE__*/React.createElement(TriangleAlert16, null)
33
36
  };
34
37
  const messages = defineMessages({
35
38
  clearNotificationButtonText: {
@@ -71,16 +74,19 @@ class Notification extends React.Component {
71
74
  intl,
72
75
  type,
73
76
  overflow,
74
- className
77
+ className,
78
+ useV2Icons
75
79
  } = this.props;
76
80
  const {
77
81
  formatMessage
78
82
  } = intl;
79
83
  const classes = classNames('notification', type, overflow, className);
84
+ const iconRenderer = ICON_RENDERER[type](useV2Icons);
85
+ const iconColor = useV2Icons ? '#222' : '#fff';
80
86
  return /*#__PURE__*/React.createElement("div", {
81
87
  className: classes
82
- }, /*#__PURE__*/React.cloneElement(ICON_RENDERER[type](), {
83
- color: '#fff',
88
+ }, /*#__PURE__*/React.cloneElement(iconRenderer, {
89
+ color: iconColor,
84
90
  height: 20,
85
91
  width: 20
86
92
  }), contents, /*#__PURE__*/React.createElement("button", {
@@ -88,7 +94,10 @@ class Notification extends React.Component {
88
94
  className: "close-btn",
89
95
  onClick: this.onClose,
90
96
  type: "button"
91
- }, /*#__PURE__*/React.createElement(X16, null)));
97
+ }, useV2Icons ? /*#__PURE__*/React.createElement(XMark, {
98
+ height: 32,
99
+ width: 32
100
+ }) : /*#__PURE__*/React.createElement(X16, null)));
92
101
  }
93
102
  }
94
103
  _defineProperty(Notification, "defaultProps", {
@@ -3,9 +3,13 @@ import * as React from 'react';
3
3
  import { defineMessages, injectIntl } from 'react-intl';
4
4
  import classNames from 'classnames';
5
5
 
6
+ // $FlowFixMe
7
+ import { Information, Check, AlertTriangle, AlertBadge, XMark } from '@box/blueprint-web-assets/icons/Medium';
8
+
6
9
  import InfoBadge16 from '../../icon/line/InfoBadge16';
7
10
  import CircleCheck16 from '../../icon/line/CircleCheck16';
8
11
  import TriangleAlert16 from '../../icon/line/TriangleAlert16';
12
+
9
13
  import XBadge16 from '../../icon/line/XBadge16';
10
14
  import X16 from '../../icon/fill/X16';
11
15
 
@@ -30,10 +34,10 @@ const DURATION_TIMES = {
30
34
  };
31
35
 
32
36
  const ICON_RENDERER: { [string]: Function } = {
33
- [TYPE_DEFAULT]: () => <InfoBadge16 />,
34
- [TYPE_ERROR]: () => <XBadge16 />,
35
- [TYPE_INFO]: () => <CircleCheck16 />,
36
- [TYPE_WARN]: () => <TriangleAlert16 />,
37
+ [TYPE_DEFAULT]: useV2Icons => (useV2Icons ? <Information /> : <InfoBadge16 />),
38
+ [TYPE_ERROR]: useV2Icons => (useV2Icons ? <AlertBadge /> : <XBadge16 />),
39
+ [TYPE_INFO]: useV2Icons => (useV2Icons ? <Check /> : <CircleCheck16 />),
40
+ [TYPE_WARN]: useV2Icons => (useV2Icons ? <AlertTriangle /> : <TriangleAlert16 />),
37
41
  };
38
42
 
39
43
  const messages = defineMessages({
@@ -69,6 +73,7 @@ type Props = {
69
73
  */
70
74
  type: NotificationType,
71
75
  overflow?: 'wrap' | 'ellipsis',
76
+ useV2Icons?: boolean,
72
77
  };
73
78
 
74
79
  class Notification extends React.Component<Props> {
@@ -101,14 +106,16 @@ class Notification extends React.Component<Props> {
101
106
 
102
107
  render() {
103
108
  const contents = this.getChildren();
104
- const { intl, type, overflow, className } = this.props;
109
+ const { intl, type, overflow, className, useV2Icons } = this.props;
105
110
  const { formatMessage } = intl;
106
111
  const classes = classNames('notification', type, overflow, className);
112
+ const iconRenderer = ICON_RENDERER[type](useV2Icons);
113
+ const iconColor = useV2Icons ? '#222' : '#fff';
107
114
 
108
115
  return (
109
116
  <div className={classes}>
110
- {React.cloneElement(ICON_RENDERER[type](), {
111
- color: '#fff',
117
+ {React.cloneElement(iconRenderer, {
118
+ color: iconColor,
112
119
  height: 20,
113
120
  width: 20,
114
121
  })}
@@ -119,7 +126,7 @@ class Notification extends React.Component<Props> {
119
126
  onClick={this.onClose}
120
127
  type="button"
121
128
  >
122
- <X16 />
129
+ {useV2Icons ? <XMark height={32} width={32} /> : <X16 />}
123
130
  </button>
124
131
  </div>
125
132
  );
@@ -1 +1 @@
1
- {"version":3,"file":"Notification.js","names":["React","defineMessages","injectIntl","classNames","InfoBadge16","CircleCheck16","TriangleAlert16","XBadge16","X16","DURATION_SHORT","DURATION_LONG","OVERFLOW_WRAP","TYPE_DEFAULT","TYPE_INFO","TYPE_WARN","TYPE_ERROR","DURATION_TIMES","ICON_RENDERER","createElement","messages","clearNotificationButtonText","Notification","Component","constructor","args","_defineProperty","event","onClose","props","timeout","clearTimeout","componentDidMount","duration","setTimeout","getChildren","children","render","contents","intl","type","overflow","className","formatMessage","classes","cloneElement","color","height","width","onClick"],"sources":["../../../src/components/notification/Notification.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport classNames from 'classnames';\n\nimport InfoBadge16 from '../../icon/line/InfoBadge16';\nimport CircleCheck16 from '../../icon/line/CircleCheck16';\nimport TriangleAlert16 from '../../icon/line/TriangleAlert16';\nimport XBadge16 from '../../icon/line/XBadge16';\nimport X16 from '../../icon/fill/X16';\n\nimport type { NotificationType } from '../../common/types/core';\n\nimport './Notification.scss';\n\n// @NOTE: We can't import these constants from ./constant.js because `react-docgen`\n// can't handle imported variables appear in propTypes\n// see https://github.com/reactjs/react-docgen/issues/33\nconst DURATION_SHORT = 'short';\nconst DURATION_LONG = 'long';\nconst OVERFLOW_WRAP = 'wrap';\nconst TYPE_DEFAULT = 'default';\nconst TYPE_INFO = 'info';\nconst TYPE_WARN = 'warn';\nconst TYPE_ERROR = 'error';\n\nconst DURATION_TIMES = {\n [DURATION_SHORT]: 5000,\n [DURATION_LONG]: 10000,\n};\n\nconst ICON_RENDERER: { [string]: Function } = {\n [TYPE_DEFAULT]: () => <InfoBadge16 />,\n [TYPE_ERROR]: () => <XBadge16 />,\n [TYPE_INFO]: () => <CircleCheck16 />,\n [TYPE_WARN]: () => <TriangleAlert16 />,\n};\n\nconst messages = defineMessages({\n clearNotificationButtonText: {\n defaultMessage: 'Clear Notification',\n description: 'Button to clear notification',\n id: 'boxui.notification.clearNotification',\n },\n});\n\ntype Props = {\n /**\n * The contents of the `Notification`.\n * - Notification text must be wrapped in a `<span />` tag.\n * - Notification buttons must be the `<Button />` component.\n */\n children: React.Node,\n className?: string,\n duration?: 'short' | 'long',\n /** `duration`: When set, dictates how long the notification will exist before calling `onClose`.\n * If unset, the notification will not automatically call `onClose`.\n * - `short`: 5s\n * - `long`: 10s */\n intl: Object,\n /** Function that gets executed when close button is clicked or when duration expires. */\n onClose?: Function,\n /**\n * Determines notification colors\n * - `default`: black\n * - `info`: green\n * - `warn`: yellow\n * - `error`: red\n */\n type: NotificationType,\n overflow?: 'wrap' | 'ellipsis',\n};\n\nclass Notification extends React.Component<Props> {\n static defaultProps = {\n overflow: OVERFLOW_WRAP,\n type: TYPE_DEFAULT,\n };\n\n componentDidMount() {\n const { duration, onClose } = this.props;\n this.timeout = duration && onClose ? setTimeout(onClose, DURATION_TIMES[duration]) : null;\n }\n\n onClose = event => {\n const { onClose } = this.props;\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n if (onClose) {\n onClose(event);\n }\n };\n\n getChildren() {\n const { children } = this.props;\n return typeof children === 'string' ? <span>{children}</span> : children;\n }\n\n timeout: TimeoutID | null;\n\n render() {\n const contents = this.getChildren();\n const { intl, type, overflow, className } = this.props;\n const { formatMessage } = intl;\n const classes = classNames('notification', type, overflow, className);\n\n return (\n <div className={classes}>\n {React.cloneElement(ICON_RENDERER[type](), {\n color: '#fff',\n height: 20,\n width: 20,\n })}\n {contents}\n <button\n aria-label={formatMessage(messages.clearNotificationButtonText)}\n className=\"close-btn\"\n onClick={this.onClose}\n type=\"button\"\n >\n <X16 />\n </button>\n </div>\n );\n }\n}\n\nexport default injectIntl(Notification);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Notification.js","names":["React","defineMessages","injectIntl","classNames","Information","Check","AlertTriangle","AlertBadge","XMark","InfoBadge16","CircleCheck16","TriangleAlert16","XBadge16","X16","DURATION_SHORT","DURATION_LONG","OVERFLOW_WRAP","TYPE_DEFAULT","TYPE_INFO","TYPE_WARN","TYPE_ERROR","DURATION_TIMES","ICON_RENDERER","useV2Icons","createElement","messages","clearNotificationButtonText","Notification","Component","constructor","args","_defineProperty","event","onClose","props","timeout","clearTimeout","componentDidMount","duration","setTimeout","getChildren","children","render","contents","intl","type","overflow","className","formatMessage","classes","iconRenderer","iconColor","cloneElement","color","height","width","onClick"],"sources":["../../../src/components/notification/Notification.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport classNames from 'classnames';\n\n// $FlowFixMe\nimport { Information, Check, AlertTriangle, AlertBadge, XMark } from '@box/blueprint-web-assets/icons/Medium';\n\nimport InfoBadge16 from '../../icon/line/InfoBadge16';\nimport CircleCheck16 from '../../icon/line/CircleCheck16';\nimport TriangleAlert16 from '../../icon/line/TriangleAlert16';\n\nimport XBadge16 from '../../icon/line/XBadge16';\nimport X16 from '../../icon/fill/X16';\n\nimport type { NotificationType } from '../../common/types/core';\n\nimport './Notification.scss';\n\n// @NOTE: We can't import these constants from ./constant.js because `react-docgen`\n// can't handle imported variables appear in propTypes\n// see https://github.com/reactjs/react-docgen/issues/33\nconst DURATION_SHORT = 'short';\nconst DURATION_LONG = 'long';\nconst OVERFLOW_WRAP = 'wrap';\nconst TYPE_DEFAULT = 'default';\nconst TYPE_INFO = 'info';\nconst TYPE_WARN = 'warn';\nconst TYPE_ERROR = 'error';\n\nconst DURATION_TIMES = {\n [DURATION_SHORT]: 5000,\n [DURATION_LONG]: 10000,\n};\n\nconst ICON_RENDERER: { [string]: Function } = {\n [TYPE_DEFAULT]: useV2Icons => (useV2Icons ? <Information /> : <InfoBadge16 />),\n [TYPE_ERROR]: useV2Icons => (useV2Icons ? <AlertBadge /> : <XBadge16 />),\n [TYPE_INFO]: useV2Icons => (useV2Icons ? <Check /> : <CircleCheck16 />),\n [TYPE_WARN]: useV2Icons => (useV2Icons ? <AlertTriangle /> : <TriangleAlert16 />),\n};\n\nconst messages = defineMessages({\n clearNotificationButtonText: {\n defaultMessage: 'Clear Notification',\n description: 'Button to clear notification',\n id: 'boxui.notification.clearNotification',\n },\n});\n\ntype Props = {\n /**\n * The contents of the `Notification`.\n * - Notification text must be wrapped in a `<span />` tag.\n * - Notification buttons must be the `<Button />` component.\n */\n children: React.Node,\n className?: string,\n duration?: 'short' | 'long',\n /** `duration`: When set, dictates how long the notification will exist before calling `onClose`.\n * If unset, the notification will not automatically call `onClose`.\n * - `short`: 5s\n * - `long`: 10s */\n intl: Object,\n /** Function that gets executed when close button is clicked or when duration expires. */\n onClose?: Function,\n /**\n * Determines notification colors\n * - `default`: black\n * - `info`: green\n * - `warn`: yellow\n * - `error`: red\n */\n type: NotificationType,\n overflow?: 'wrap' | 'ellipsis',\n useV2Icons?: boolean,\n};\n\nclass Notification extends React.Component<Props> {\n static defaultProps = {\n overflow: OVERFLOW_WRAP,\n type: TYPE_DEFAULT,\n };\n\n componentDidMount() {\n const { duration, onClose } = this.props;\n this.timeout = duration && onClose ? setTimeout(onClose, DURATION_TIMES[duration]) : null;\n }\n\n onClose = event => {\n const { onClose } = this.props;\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n if (onClose) {\n onClose(event);\n }\n };\n\n getChildren() {\n const { children } = this.props;\n return typeof children === 'string' ? <span>{children}</span> : children;\n }\n\n timeout: TimeoutID | null;\n\n render() {\n const contents = this.getChildren();\n const { intl, type, overflow, className, useV2Icons } = this.props;\n const { formatMessage } = intl;\n const classes = classNames('notification', type, overflow, className);\n const iconRenderer = ICON_RENDERER[type](useV2Icons);\n const iconColor = useV2Icons ? '#222' : '#fff';\n\n return (\n <div className={classes}>\n {React.cloneElement(iconRenderer, {\n color: iconColor,\n height: 20,\n width: 20,\n })}\n {contents}\n <button\n aria-label={formatMessage(messages.clearNotificationButtonText)}\n className=\"close-btn\"\n onClick={this.onClose}\n type=\"button\"\n >\n {useV2Icons ? <XMark height={32} width={32} /> : <X16 />}\n </button>\n </div>\n );\n }\n}\n\nexport default injectIntl(Notification);\n"],"mappings":"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","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