box-ui-elements 23.5.0-beta.1 → 23.5.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/explorer.css +1 -1
- package/dist/explorer.js +1 -1
- package/dist/preview.css +1 -1
- package/dist/preview.js +1 -1
- package/dist/sidebar.css +1 -1
- package/dist/sidebar.js +1 -1
- package/es/elements/content-explorer/ContentExplorer.js +23 -25
- package/es/elements/content-explorer/ContentExplorer.js.map +1 -1
- package/es/elements/content-explorer/stories/MetadataView.stories.js +3 -0
- package/es/elements/content-explorer/stories/MetadataView.stories.js.map +1 -1
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js +3 -0
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
- package/es/features/metadata-instance-editor/CascadePolicy.js +3 -3
- package/es/features/metadata-instance-editor/CascadePolicy.js.flow +2 -3
- package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
- package/es/features/metadata-instance-editor/Instance.js +0 -2
- package/es/features/metadata-instance-editor/Instance.js.flow +0 -5
- package/es/features/metadata-instance-editor/Instance.js.map +1 -1
- package/es/features/metadata-instance-editor/Instances.js +0 -2
- package/es/features/metadata-instance-editor/Instances.js.flow +0 -3
- package/es/features/metadata-instance-editor/Instances.js.map +1 -1
- package/es/features/metadata-instance-editor/MetadataInstanceEditor.js +0 -2
- package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.flow +0 -3
- package/es/features/metadata-instance-editor/MetadataInstanceEditor.js.map +1 -1
- package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js +0 -1
- package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.flow +0 -1
- package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.map +1 -1
- package/es/src/elements/content-explorer/ContentExplorer.d.ts +0 -7
- package/package.json +3 -3
- package/src/elements/content-explorer/ContentExplorer.tsx +23 -25
- package/src/elements/content-explorer/stories/MetadataView.stories.tsx +4 -0
- package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +4 -0
- package/src/features/metadata-instance-editor/CascadePolicy.js +2 -3
- package/src/features/metadata-instance-editor/Instance.js +0 -5
- package/src/features/metadata-instance-editor/Instances.js +0 -3
- package/src/features/metadata-instance-editor/MetadataInstanceEditor.js +0 -3
- package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +0 -9
- package/src/features/metadata-instance-editor/__tests__/Instance.test.js +0 -28
- package/src/features/metadata-instance-editor/__tests__/Instances.test.js +7 -9
- package/src/features/metadata-instance-editor/__tests__/MetadataInstanceEditor.test.js +1 -48
- package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instance.test.js.snap +0 -1
- package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instances.test.js.snap +0 -2
- package/src/features/metadata-instance-editor/__tests__/__snapshots__/MetadataInstanceEditor.test.js.snap +0 -1
- package/src/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataInstanceEditor.js","names":["React","ScrollWrapper","Header","Instances","EmptyContent","MetadataInstanceEditorContext","MetadataInstanceEditor","blurExceptionClassNames","canAdd","canUseAIFolderExtraction","
|
|
1
|
+
{"version":3,"file":"MetadataInstanceEditor.js","names":["React","ScrollWrapper","Header","Instances","EmptyContent","MetadataInstanceEditorContext","MetadataInstanceEditor","blurExceptionClassNames","canAdd","canUseAIFolderExtraction","isCascadingPolicyApplicable","isDropdownBusy","editors","onModification","onRemove","onAdd","onSave","selectedTemplateKey","templates","title","createElement","Provider","value","className","length"],"sources":["../../../src/features/metadata-instance-editor/MetadataInstanceEditor.js"],"sourcesContent":["// @flow\nimport * as React from 'react';\n\nimport ScrollWrapper from '../../components/scroll-wrapper';\n\nimport Header from './Header';\nimport Instances from './Instances';\nimport EmptyContent from './EmptyContent';\nimport type { MetadataEditor, MetadataTemplate, MetadataCascadingPolicyData } from '../../common/types/metadata';\nimport type { JSONPatchOperations } from '../../common/types/api';\nimport MetadataInstanceEditorContext from './MetadataInstanceEditorContext';\nimport './MetadataInstanceEditor.scss';\n\ntype Props = {\n blurExceptionClassNames?: Array<string>,\n canAdd: boolean,\n canUseAIFolderExtraction?: boolean,\n editors?: Array<MetadataEditor>,\n isCascadingPolicyApplicable?: boolean,\n isDropdownBusy?: boolean,\n onAdd?: (template: MetadataTemplate) => void,\n onModification?: (id: string, isDirty: boolean) => void,\n onRemove?: (id: string) => void,\n onSave?: (\n id: string,\n data: JSONPatchOperations,\n cascadingPolicy?: MetadataCascadingPolicyData,\n rawData: Object,\n ) => void,\n selectedTemplateKey?: string,\n templateFilters?: Array<string> | string,\n templates: Array<MetadataTemplate>,\n title?: React.Node,\n};\n\nconst MetadataInstanceEditor = ({\n blurExceptionClassNames,\n canAdd,\n canUseAIFolderExtraction = false,\n isCascadingPolicyApplicable = false,\n isDropdownBusy,\n editors = [],\n onModification,\n onRemove,\n onAdd,\n onSave,\n selectedTemplateKey,\n templates,\n title,\n}: Props) => (\n <MetadataInstanceEditorContext.Provider value={{ blurExceptionClassNames }}>\n <div className=\"metadata-instance-editor\">\n <Header\n canAdd={canAdd}\n editors={editors}\n isDropdownBusy={isDropdownBusy}\n onAdd={onAdd}\n templates={templates}\n title={title}\n />\n {editors.length === 0 ? (\n <EmptyContent canAdd={canAdd} />\n ) : (\n <ScrollWrapper>\n <Instances\n canUseAIFolderExtraction={canUseAIFolderExtraction}\n editors={editors}\n isCascadingPolicyApplicable={isCascadingPolicyApplicable}\n onModification={onModification}\n onRemove={onRemove}\n onSave={onSave}\n selectedTemplateKey={selectedTemplateKey}\n />\n </ScrollWrapper>\n )}\n </div>\n </MetadataInstanceEditorContext.Provider>\n);\n\nexport default MetadataInstanceEditor;\n"],"mappings":"AACA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,OAAOC,aAAa,MAAM,iCAAiC;AAE3D,OAAOC,MAAM,MAAM,UAAU;AAC7B,OAAOC,SAAS,MAAM,aAAa;AACnC,OAAOC,YAAY,MAAM,gBAAgB;AAGzC,OAAOC,6BAA6B,MAAM,iCAAiC;AAC3E,OAAO,+BAA+B;AAwBtC,MAAMC,sBAAsB,GAAGA,CAAC;EAC5BC,uBAAuB;EACvBC,MAAM;EACNC,wBAAwB,GAAG,KAAK;EAChCC,2BAA2B,GAAG,KAAK;EACnCC,cAAc;EACdC,OAAO,GAAG,EAAE;EACZC,cAAc;EACdC,QAAQ;EACRC,KAAK;EACLC,MAAM;EACNC,mBAAmB;EACnBC,SAAS;EACTC;AACG,CAAC,kBACJnB,KAAA,CAAAoB,aAAA,CAACf,6BAA6B,CAACgB,QAAQ;EAACC,KAAK,EAAE;IAAEf;EAAwB;AAAE,gBACvEP,KAAA,CAAAoB,aAAA;EAAKG,SAAS,EAAC;AAA0B,gBACrCvB,KAAA,CAAAoB,aAAA,CAAClB,MAAM;EACHM,MAAM,EAAEA,MAAO;EACfI,OAAO,EAAEA,OAAQ;EACjBD,cAAc,EAAEA,cAAe;EAC/BI,KAAK,EAAEA,KAAM;EACbG,SAAS,EAAEA,SAAU;EACrBC,KAAK,EAAEA;AAAM,CAChB,CAAC,EACDP,OAAO,CAACY,MAAM,KAAK,CAAC,gBACjBxB,KAAA,CAAAoB,aAAA,CAAChB,YAAY;EAACI,MAAM,EAAEA;AAAO,CAAE,CAAC,gBAEhCR,KAAA,CAAAoB,aAAA,CAACnB,aAAa,qBACVD,KAAA,CAAAoB,aAAA,CAACjB,SAAS;EACNM,wBAAwB,EAAEA,wBAAyB;EACnDG,OAAO,EAAEA,OAAQ;EACjBF,2BAA2B,EAAEA,2BAA4B;EACzDG,cAAc,EAAEA,cAAe;EAC/BC,QAAQ,EAAEA,QAAS;EACnBE,MAAM,EAAEA,MAAO;EACfC,mBAAmB,EAAEA;AAAoB,CAC5C,CACU,CAElB,CAC+B,CAC3C;AAED,eAAeX,sBAAsB","ignoreList":[]}
|
|
@@ -5,7 +5,6 @@ import CascadePolicy from '../../CascadePolicy';
|
|
|
5
5
|
const baseProps = {
|
|
6
6
|
canEdit: true,
|
|
7
7
|
canUseAIFolderExtraction: true,
|
|
8
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
9
8
|
isAIFolderExtractionEnabled: false,
|
|
10
9
|
isCascadingEnabled: true,
|
|
11
10
|
isCascadingOverwritten: false,
|
package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.flow
CHANGED
|
@@ -5,7 +5,6 @@ import CascadePolicy from '../../CascadePolicy';
|
|
|
5
5
|
const baseProps = {
|
|
6
6
|
canEdit: true,
|
|
7
7
|
canUseAIFolderExtraction: true,
|
|
8
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
9
8
|
isAIFolderExtractionEnabled: false,
|
|
10
9
|
isCascadingEnabled: true,
|
|
11
10
|
isCascadingOverwritten: false,
|
package/es/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CascadePolicy-visual.stories.js","names":["React","TooltipProvider","CascadePolicy","baseProps","canEdit","canUseAIFolderExtraction","
|
|
1
|
+
{"version":3,"file":"CascadePolicy-visual.stories.js","names":["React","TooltipProvider","CascadePolicy","baseProps","canEdit","canUseAIFolderExtraction","isAIFolderExtractionEnabled","isCascadingEnabled","isCascadingOverwritten","isCustomMetadata","onAIFolderExtractionToggle","onCascadeModeChange","onCascadeToggle","shouldShowCascadeOptions","Template","props","createElement","_extends","EnabledCascadePolicyOptionsFieldsOnly","isExistingCascadePolicy","storyName","DisabledCascadePolicyOptionsFieldsOnly","title","component"],"sources":["../../../../../src/features/metadata-instance-editor/stories/tests/CascadePolicy-visual.stories.js"],"sourcesContent":["import * as React from 'react';\nimport { TooltipProvider } from '@box/blueprint-web';\nimport CascadePolicy from '../../CascadePolicy';\n\nconst baseProps = {\n canEdit: true,\n canUseAIFolderExtraction: true,\n isAIFolderExtractionEnabled: false,\n isCascadingEnabled: true,\n isCascadingOverwritten: false,\n isCustomMetadata: false,\n onAIFolderExtractionToggle: () => {},\n onCascadeModeChange: () => {},\n onCascadeToggle: () => {},\n shouldShowCascadeOptions: true,\n};\n\nconst Template = props => (\n <TooltipProvider>\n <CascadePolicy {...baseProps} {...props} />\n </TooltipProvider>\n);\n\nconst EnabledCascadePolicyOptionsFieldsOnly = () => <Template isExistingCascadePolicy={false} />;\nEnabledCascadePolicyOptionsFieldsOnly.storyName = 'Enabled Cascade Policy Options';\n\nconst DisabledCascadePolicyOptionsFieldsOnly = () => <Template isExistingCascadePolicy={true} />;\nDisabledCascadePolicyOptionsFieldsOnly.storyName = 'Disabled Cascade Policy Options';\n\nexport { EnabledCascadePolicyOptionsFieldsOnly, DisabledCascadePolicyOptionsFieldsOnly };\n\nexport default {\n title: 'Features/Metadata Instance Editor/CascadePolicy/Visual',\n component: CascadePolicy,\n};\n"],"mappings":";AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,eAAe,QAAQ,oBAAoB;AACpD,OAAOC,aAAa,MAAM,qBAAqB;AAE/C,MAAMC,SAAS,GAAG;EACdC,OAAO,EAAE,IAAI;EACbC,wBAAwB,EAAE,IAAI;EAC9BC,2BAA2B,EAAE,KAAK;EAClCC,kBAAkB,EAAE,IAAI;EACxBC,sBAAsB,EAAE,KAAK;EAC7BC,gBAAgB,EAAE,KAAK;EACvBC,0BAA0B,EAAEA,CAAA,KAAM,CAAC,CAAC;EACpCC,mBAAmB,EAAEA,CAAA,KAAM,CAAC,CAAC;EAC7BC,eAAe,EAAEA,CAAA,KAAM,CAAC,CAAC;EACzBC,wBAAwB,EAAE;AAC9B,CAAC;AAED,MAAMC,QAAQ,GAAGC,KAAK,iBAClBf,KAAA,CAAAgB,aAAA,CAACf,eAAe,qBACZD,KAAA,CAAAgB,aAAA,CAACd,aAAa,EAAAe,QAAA,KAAKd,SAAS,EAAMY,KAAK,CAAG,CAC7B,CACpB;AAED,MAAMG,qCAAqC,GAAGA,CAAA,kBAAMlB,KAAA,CAAAgB,aAAA,CAACF,QAAQ;EAACK,uBAAuB,EAAE;AAAM,CAAE,CAAC;AAChGD,qCAAqC,CAACE,SAAS,GAAG,gCAAgC;AAElF,MAAMC,sCAAsC,GAAGA,CAAA,kBAAMrB,KAAA,CAAAgB,aAAA,CAACF,QAAQ;EAACK,uBAAuB,EAAE;AAAK,CAAE,CAAC;AAChGE,sCAAsC,CAACD,SAAS,GAAG,iCAAiC;AAEpF,SAASF,qCAAqC,EAAEG,sCAAsC;AAEtF,eAAe;EACXC,KAAK,EAAE,wDAAwD;EAC/DC,SAAS,EAAErB;AACf,CAAC","ignoreList":[]}
|
|
@@ -546,13 +546,6 @@ declare class ContentExplorer extends Component<ContentExplorerProps, State> {
|
|
|
546
546
|
updateMetadata: (item: BoxItem, field: string, oldValue?: MetadataFieldValue | null, newValue?: MetadataFieldValue | null) => void;
|
|
547
547
|
updateMetadataSuccessCallback: (item: BoxItem, field: string, newValue?: MetadataFieldValue | null) => void;
|
|
548
548
|
clearSelectedItemIds: () => void;
|
|
549
|
-
/**
|
|
550
|
-
* Fetches the folder name and stores it in state rootName if successful
|
|
551
|
-
*
|
|
552
|
-
* @private
|
|
553
|
-
* @return {void}
|
|
554
|
-
*/
|
|
555
|
-
fetchFolderName: (folderId?: string) => void;
|
|
556
549
|
/**
|
|
557
550
|
* Renders the file picker
|
|
558
551
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "box-ui-elements",
|
|
3
|
-
"version": "23.5.0-beta.
|
|
3
|
+
"version": "23.5.0-beta.3",
|
|
4
4
|
"description": "Box UI Elements",
|
|
5
5
|
"author": "Box (https://www.box.com/)",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
"@babel/types": "^7.24.7",
|
|
131
131
|
"@box/blueprint-web": "12.43.0",
|
|
132
132
|
"@box/blueprint-web-assets": "4.61.5",
|
|
133
|
-
"@box/box-ai-agent-selector": "^0.
|
|
133
|
+
"@box/box-ai-agent-selector": "^0.53.0",
|
|
134
134
|
"@box/box-ai-content-answers": "^0.124.1",
|
|
135
135
|
"@box/box-item-type-selector": "^0.63.12",
|
|
136
136
|
"@box/cldr-data": "^34.2.0",
|
|
@@ -299,7 +299,7 @@
|
|
|
299
299
|
"peerDependencies": {
|
|
300
300
|
"@box/blueprint-web": "12.43.0",
|
|
301
301
|
"@box/blueprint-web-assets": "4.61.5",
|
|
302
|
-
"@box/box-ai-agent-selector": "^0.
|
|
302
|
+
"@box/box-ai-agent-selector": "^0.53.0",
|
|
303
303
|
"@box/box-ai-content-answers": "^0.124.1",
|
|
304
304
|
"@box/box-item-type-selector": "^0.63.12",
|
|
305
305
|
"@box/cldr-data": ">=34.2.0",
|
|
@@ -338,7 +338,7 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
|
|
|
338
338
|
* @return {void}
|
|
339
339
|
*/
|
|
340
340
|
componentDidMount() {
|
|
341
|
-
const { currentFolderId, defaultView
|
|
341
|
+
const { currentFolderId, defaultView }: ContentExplorerProps = this.props;
|
|
342
342
|
this.rootElement = document.getElementById(this.id) as HTMLElement;
|
|
343
343
|
this.appElement = this.rootElement.firstElementChild as HTMLElement;
|
|
344
344
|
|
|
@@ -348,7 +348,6 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
|
|
|
348
348
|
break;
|
|
349
349
|
case DEFAULT_VIEW_METADATA:
|
|
350
350
|
this.showMetadataQueryResults();
|
|
351
|
-
this.fetchFolderName(metadataQuery?.ancestor_folder_id);
|
|
352
351
|
break;
|
|
353
352
|
default:
|
|
354
353
|
this.fetchFolder(currentFolderId);
|
|
@@ -390,12 +389,14 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
|
|
|
390
389
|
metadataTemplate: MetadataTemplate,
|
|
391
390
|
): void => {
|
|
392
391
|
const { nextMarker } = metadataQueryCollection;
|
|
392
|
+
const { metadataQuery, features } = this.props;
|
|
393
393
|
const { currentCollection, currentPageNumber, markers }: State = this.state;
|
|
394
394
|
const cloneMarkers = [...markers];
|
|
395
395
|
if (nextMarker) {
|
|
396
396
|
cloneMarkers[currentPageNumber + 1] = nextMarker;
|
|
397
397
|
}
|
|
398
|
-
|
|
398
|
+
|
|
399
|
+
const nextState = {
|
|
399
400
|
currentCollection: {
|
|
400
401
|
...currentCollection,
|
|
401
402
|
...metadataQueryCollection,
|
|
@@ -403,7 +404,25 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
|
|
|
403
404
|
},
|
|
404
405
|
markers: cloneMarkers,
|
|
405
406
|
metadataTemplate,
|
|
406
|
-
}
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
// if v2, fetch folder name and add to state
|
|
410
|
+
if (metadataQuery?.ancestor_folder_id && isFeatureEnabled(features, 'contentExplorer.metadataViewV2')) {
|
|
411
|
+
this.api.getFolderAPI().getFolderFields(
|
|
412
|
+
metadataQuery.ancestor_folder_id,
|
|
413
|
+
({ name }) => {
|
|
414
|
+
this.setState({
|
|
415
|
+
...nextState,
|
|
416
|
+
rootName: name || '',
|
|
417
|
+
});
|
|
418
|
+
},
|
|
419
|
+
this.errorCallback,
|
|
420
|
+
{ fields: [FIELD_NAME] },
|
|
421
|
+
);
|
|
422
|
+
} else {
|
|
423
|
+
// No folder name to fetch, update state immediately with just metadata
|
|
424
|
+
this.setState(nextState);
|
|
425
|
+
}
|
|
407
426
|
};
|
|
408
427
|
|
|
409
428
|
/**
|
|
@@ -1628,27 +1647,6 @@ class ContentExplorer extends Component<ContentExplorerProps, State> {
|
|
|
1628
1647
|
this.setState({ selectedItemIds: new Set() });
|
|
1629
1648
|
};
|
|
1630
1649
|
|
|
1631
|
-
/**
|
|
1632
|
-
* Fetches the folder name and stores it in state rootName if successful
|
|
1633
|
-
*
|
|
1634
|
-
* @private
|
|
1635
|
-
* @return {void}
|
|
1636
|
-
*/
|
|
1637
|
-
fetchFolderName = (folderId?: string) => {
|
|
1638
|
-
if (!folderId) {
|
|
1639
|
-
return;
|
|
1640
|
-
}
|
|
1641
|
-
|
|
1642
|
-
this.api.getFolderAPI(false).getFolderFields(
|
|
1643
|
-
folderId,
|
|
1644
|
-
({ name }) => {
|
|
1645
|
-
this.setState({ rootName: name });
|
|
1646
|
-
},
|
|
1647
|
-
this.errorCallback,
|
|
1648
|
-
{ fields: [FIELD_NAME] },
|
|
1649
|
-
);
|
|
1650
|
-
};
|
|
1651
|
-
|
|
1652
1650
|
/**
|
|
1653
1651
|
* Renders the file picker
|
|
1654
1652
|
*
|
|
@@ -5,6 +5,7 @@ import type { Meta, StoryObj } from '@storybook/react';
|
|
|
5
5
|
import ContentExplorer from '../ContentExplorer';
|
|
6
6
|
import { DEFAULT_HOSTNAME_API } from '../../../constants';
|
|
7
7
|
import { mockMetadata, mockSchema } from '../../common/__mocks__/mockMetadata';
|
|
8
|
+
import { mockRootFolder } from '../../common/__mocks__/mockRootFolder';
|
|
8
9
|
|
|
9
10
|
const EID = '0';
|
|
10
11
|
const templateName = 'templateName';
|
|
@@ -120,6 +121,9 @@ const meta: Meta<typeof ContentExplorer> = {
|
|
|
120
121
|
http.get(`${DEFAULT_HOSTNAME_API}/2.0/metadata_templates/enterprise/templateName/schema`, () => {
|
|
121
122
|
return HttpResponse.json(mockSchema);
|
|
122
123
|
}),
|
|
124
|
+
http.get(`${DEFAULT_HOSTNAME_API}/2.0/folders/:id`, () => {
|
|
125
|
+
return HttpResponse.json(mockRootFolder);
|
|
126
|
+
}),
|
|
123
127
|
],
|
|
124
128
|
},
|
|
125
129
|
},
|
|
@@ -8,6 +8,7 @@ import noop from 'lodash/noop';
|
|
|
8
8
|
import ContentExplorer from '../../ContentExplorer';
|
|
9
9
|
import { DEFAULT_HOSTNAME_API } from '../../../../constants';
|
|
10
10
|
import { mockMetadata, mockSchema } from '../../../common/__mocks__/mockMetadata';
|
|
11
|
+
import { mockRootFolder } from '../../../common/__mocks__/mockRootFolder';
|
|
11
12
|
|
|
12
13
|
// The intent behind relying on mockMetadata is to allow a developer to paste in their own metadata template schema for use with live API calls.
|
|
13
14
|
const { scope: templateScope, templateKey } = mockSchema;
|
|
@@ -180,6 +181,9 @@ const meta: Meta<typeof ContentExplorer> = {
|
|
|
180
181
|
http.get(`${DEFAULT_HOSTNAME_API}/2.0/metadata_templates/enterprise/templateName/schema`, () => {
|
|
181
182
|
return HttpResponse.json(mockSchema);
|
|
182
183
|
}),
|
|
184
|
+
http.get(`${DEFAULT_HOSTNAME_API}/2.0/folders/:id`, () => {
|
|
185
|
+
return HttpResponse.json(mockRootFolder);
|
|
186
|
+
}),
|
|
183
187
|
],
|
|
184
188
|
},
|
|
185
189
|
},
|
|
@@ -27,7 +27,6 @@ const AI_LINK = 'https://www.box.com/ai';
|
|
|
27
27
|
type Props = {
|
|
28
28
|
canEdit: boolean,
|
|
29
29
|
canUseAIFolderExtraction: boolean,
|
|
30
|
-
canUseAIFolderExtractionAgentSelector: boolean,
|
|
31
30
|
cascadePolicyConfiguration?: MetadataCascadePolicyConfiguration,
|
|
32
31
|
isAIFolderExtractionEnabled: boolean,
|
|
33
32
|
isCascadingEnabled: boolean,
|
|
@@ -44,7 +43,6 @@ type Props = {
|
|
|
44
43
|
const CascadePolicy = ({
|
|
45
44
|
canEdit,
|
|
46
45
|
canUseAIFolderExtraction,
|
|
47
|
-
canUseAIFolderExtractionAgentSelector,
|
|
48
46
|
cascadePolicyConfiguration,
|
|
49
47
|
isCascadingEnabled,
|
|
50
48
|
isCascadingOverwritten,
|
|
@@ -194,13 +192,14 @@ const CascadePolicy = ({
|
|
|
194
192
|
<FormattedMessage {...messages.aiAutofillLearnMore} />
|
|
195
193
|
</Link>
|
|
196
194
|
</div>
|
|
197
|
-
{
|
|
195
|
+
{isAIFolderExtractionEnabled && (
|
|
198
196
|
<div className="metadata-cascade-ai-agent-selector">
|
|
199
197
|
<BoxAiAgentSelectorWithApiContainer
|
|
200
198
|
disabled={isExistingCascadePolicy}
|
|
201
199
|
fetcher={agentFetcher}
|
|
202
200
|
onSelectAgent={handleAgentSelect}
|
|
203
201
|
recordAction={() => {}}
|
|
202
|
+
selectorAlignment="left"
|
|
204
203
|
/>
|
|
205
204
|
</div>
|
|
206
205
|
)}
|
|
@@ -55,7 +55,6 @@ import './Instance.scss';
|
|
|
55
55
|
type Props = {
|
|
56
56
|
canEdit: boolean,
|
|
57
57
|
canUseAIFolderExtraction?: boolean,
|
|
58
|
-
canUseAIFolderExtractionAgentSelector?: boolean,
|
|
59
58
|
cascadePolicy?: MetadataCascadePolicy, // eslint-disable-line
|
|
60
59
|
data: MetadataFields,
|
|
61
60
|
hasError: boolean,
|
|
@@ -642,7 +641,6 @@ class Instance extends React.PureComponent<Props, State> {
|
|
|
642
641
|
render() {
|
|
643
642
|
const {
|
|
644
643
|
canUseAIFolderExtraction = false,
|
|
645
|
-
canUseAIFolderExtractionAgentSelector = false,
|
|
646
644
|
cascadePolicy = {},
|
|
647
645
|
isDirty,
|
|
648
646
|
isCascadingPolicyApplicable,
|
|
@@ -703,9 +701,6 @@ class Instance extends React.PureComponent<Props, State> {
|
|
|
703
701
|
cascadePolicyConfiguration={cascadePolicy?.cascadePolicyConfiguration}
|
|
704
702
|
canEdit={isEditing && !!cascadePolicy.canEdit}
|
|
705
703
|
canUseAIFolderExtraction={canUseAIFolderExtraction}
|
|
706
|
-
canUseAIFolderExtractionAgentSelector={
|
|
707
|
-
canUseAIFolderExtractionAgentSelector
|
|
708
|
-
}
|
|
709
704
|
isAIFolderExtractionEnabled={isAIFolderExtractionEnabled}
|
|
710
705
|
isCascadingEnabled={isCascadingEnabled}
|
|
711
706
|
isCascadingOverwritten={isCascadingOverwritten}
|
|
@@ -7,7 +7,6 @@ import type { JSONPatchOperations } from '../../common/types/api';
|
|
|
7
7
|
|
|
8
8
|
type Props = {
|
|
9
9
|
canUseAIFolderExtraction?: boolean,
|
|
10
|
-
canUseAIFolderExtractionAgentSelector?: boolean,
|
|
11
10
|
editors?: Array<MetadataEditor>,
|
|
12
11
|
isCascadingPolicyApplicable?: boolean,
|
|
13
12
|
onModification?: (id: string, isDirty: boolean) => void,
|
|
@@ -23,7 +22,6 @@ type Props = {
|
|
|
23
22
|
|
|
24
23
|
const Instances = ({
|
|
25
24
|
canUseAIFolderExtraction = false,
|
|
26
|
-
canUseAIFolderExtractionAgentSelector = false,
|
|
27
25
|
isCascadingPolicyApplicable = false,
|
|
28
26
|
editors = [],
|
|
29
27
|
onModification,
|
|
@@ -39,7 +37,6 @@ const Instances = ({
|
|
|
39
37
|
<Instance
|
|
40
38
|
canEdit={instance.canEdit}
|
|
41
39
|
canUseAIFolderExtraction={canUseAIFolderExtraction}
|
|
42
|
-
canUseAIFolderExtractionAgentSelector={canUseAIFolderExtractionAgentSelector}
|
|
43
40
|
cascadePolicy={instance.cascadePolicy}
|
|
44
41
|
data={instance.data}
|
|
45
42
|
hasError={hasError}
|
|
@@ -15,7 +15,6 @@ type Props = {
|
|
|
15
15
|
blurExceptionClassNames?: Array<string>,
|
|
16
16
|
canAdd: boolean,
|
|
17
17
|
canUseAIFolderExtraction?: boolean,
|
|
18
|
-
canUseAIFolderExtractionAgentSelector?: boolean,
|
|
19
18
|
editors?: Array<MetadataEditor>,
|
|
20
19
|
isCascadingPolicyApplicable?: boolean,
|
|
21
20
|
isDropdownBusy?: boolean,
|
|
@@ -38,7 +37,6 @@ const MetadataInstanceEditor = ({
|
|
|
38
37
|
blurExceptionClassNames,
|
|
39
38
|
canAdd,
|
|
40
39
|
canUseAIFolderExtraction = false,
|
|
41
|
-
canUseAIFolderExtractionAgentSelector = false,
|
|
42
40
|
isCascadingPolicyApplicable = false,
|
|
43
41
|
isDropdownBusy,
|
|
44
42
|
editors = [],
|
|
@@ -66,7 +64,6 @@ const MetadataInstanceEditor = ({
|
|
|
66
64
|
<ScrollWrapper>
|
|
67
65
|
<Instances
|
|
68
66
|
canUseAIFolderExtraction={canUseAIFolderExtraction}
|
|
69
|
-
canUseAIFolderExtractionAgentSelector={canUseAIFolderExtractionAgentSelector}
|
|
70
67
|
editors={editors}
|
|
71
68
|
isCascadingPolicyApplicable={isCascadingPolicyApplicable}
|
|
72
69
|
onModification={onModification}
|
|
@@ -118,7 +118,6 @@ describe('features/metadata-instance-editor/CascadePolicy', () => {
|
|
|
118
118
|
<CascadePolicy
|
|
119
119
|
canEdit
|
|
120
120
|
canUseAIFolderExtraction
|
|
121
|
-
canUseAIFolderExtractionAgentSelector
|
|
122
121
|
shouldShowCascadeOptions
|
|
123
122
|
isAIFolderExtractionEnabled
|
|
124
123
|
onAIFolderExtractionToggle={jest.fn()}
|
|
@@ -133,18 +132,12 @@ describe('features/metadata-instance-editor/CascadePolicy', () => {
|
|
|
133
132
|
expect(screen.getByRole('combobox', { name: 'Standard' })).toBeInTheDocument();
|
|
134
133
|
});
|
|
135
134
|
|
|
136
|
-
test('should not render AI agent selector when canUseAIFolderExtractionAgentSelector is false', () => {
|
|
137
|
-
render(<CascadePolicy canEdit canUseAIFolderExtraction shouldShowCascadeOptions />);
|
|
138
|
-
expect(screen.queryByRole('combobox', { name: 'Standard' })).not.toBeInTheDocument();
|
|
139
|
-
});
|
|
140
|
-
|
|
141
135
|
test('should call onAIAgentSelect when an agent is selected', async () => {
|
|
142
136
|
const onAIAgentSelect = jest.fn();
|
|
143
137
|
render(
|
|
144
138
|
<CascadePolicy
|
|
145
139
|
canEdit
|
|
146
140
|
canUseAIFolderExtraction
|
|
147
|
-
canUseAIFolderExtractionAgentSelector
|
|
148
141
|
shouldShowCascadeOptions
|
|
149
142
|
isAIFolderExtractionEnabled
|
|
150
143
|
onAIAgentSelect={onAIAgentSelect}
|
|
@@ -185,7 +178,6 @@ describe('features/metadata-instance-editor/CascadePolicy', () => {
|
|
|
185
178
|
<CascadePolicy
|
|
186
179
|
canEdit
|
|
187
180
|
canUseAIFolderExtraction
|
|
188
|
-
canUseAIFolderExtractionAgentSelector
|
|
189
181
|
shouldShowCascadeOptions
|
|
190
182
|
isAIFolderExtractionEnabled
|
|
191
183
|
cascadePolicyConfiguration={cascadePolicyConfiguration}
|
|
@@ -207,7 +199,6 @@ describe('features/metadata-instance-editor/CascadePolicy', () => {
|
|
|
207
199
|
<CascadePolicy
|
|
208
200
|
canEdit
|
|
209
201
|
canUseAIFolderExtraction
|
|
210
|
-
canUseAIFolderExtractionAgentSelector
|
|
211
202
|
shouldShowCascadeOptions
|
|
212
203
|
isAIFolderExtractionEnabled
|
|
213
204
|
onAIFolderExtractionToggle={jest.fn()}
|
|
@@ -771,7 +771,6 @@ const getBaseProps = (props = {}) => ({
|
|
|
771
771
|
cascadePolicyType: 'regular', // default to non-AI
|
|
772
772
|
},
|
|
773
773
|
canUseAIFolderExtraction: true, // Assume feature flag is on
|
|
774
|
-
canUseAIFolderExtractionAgentSelector: false,
|
|
775
774
|
...props,
|
|
776
775
|
});
|
|
777
776
|
|
|
@@ -862,33 +861,6 @@ describe('Instance Component - React Testing Library', () => {
|
|
|
862
861
|
});
|
|
863
862
|
|
|
864
863
|
describe('Props passed to CascadePolicy', () => {
|
|
865
|
-
test('should pass canUseAIFolderExtractionAgentSelector to CascadePolicy', async () => {
|
|
866
|
-
render(
|
|
867
|
-
<Instance
|
|
868
|
-
{...getBaseProps({
|
|
869
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
870
|
-
cascadePolicy: {
|
|
871
|
-
id: 'policy-1',
|
|
872
|
-
canEdit: true,
|
|
873
|
-
isEnabled: true,
|
|
874
|
-
cascadePolicyType: CASCADE_POLICY_TYPE_AI_EXTRACT,
|
|
875
|
-
},
|
|
876
|
-
})}
|
|
877
|
-
/>,
|
|
878
|
-
);
|
|
879
|
-
|
|
880
|
-
const editButton = screen.queryByRole('button', { name: 'Edit Metadata' });
|
|
881
|
-
if (editButton) await userEvent.click(editButton); // Enter edit mode to ensure CascadePolicy options are visible
|
|
882
|
-
|
|
883
|
-
const cascadeToggle = screen.getByRole('switch', { name: 'Enable Cascade Policy' });
|
|
884
|
-
expect(cascadeToggle).toBeChecked();
|
|
885
|
-
|
|
886
|
-
const aiToggle = screen.getByRole('switch', { name: 'Box AI Autofill' });
|
|
887
|
-
expect(aiToggle).toBeChecked();
|
|
888
|
-
|
|
889
|
-
expect(screen.getByRole('combobox', { name: 'Standard' })).toBeInTheDocument();
|
|
890
|
-
});
|
|
891
|
-
|
|
892
864
|
test('should disable CascadePolicy options when a cascade already exists', async () => {
|
|
893
865
|
render(<Instance {...getBaseProps()} />);
|
|
894
866
|
|
|
@@ -253,11 +253,9 @@ describe('features/metadata-editor-editor/Instances', () => {
|
|
|
253
253
|
});
|
|
254
254
|
});
|
|
255
255
|
|
|
256
|
-
describe('Instances component -
|
|
257
|
-
test('should
|
|
258
|
-
const props = getInstancesBaseProps(
|
|
259
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
260
|
-
});
|
|
256
|
+
describe('Instances component - AI agent selector', () => {
|
|
257
|
+
test('should show AI agent selector when canUseAIFolderExtraction is true', async () => {
|
|
258
|
+
const props = getInstancesBaseProps();
|
|
261
259
|
props.editors[0].instance.cascadePolicy.cascadePolicyType = CASCADE_POLICY_TYPE_AI_EXTRACT;
|
|
262
260
|
render(<Instances {...props} />);
|
|
263
261
|
|
|
@@ -273,11 +271,11 @@ describe('Instances component - canUseAIFolderExtractionAgentSelector prop', ()
|
|
|
273
271
|
expect(screen.getByRole('combobox', { name: 'Standard' })).toBeInTheDocument();
|
|
274
272
|
});
|
|
275
273
|
|
|
276
|
-
test('should not show agent selector in child Instance if
|
|
274
|
+
test('should not show agent selector in child Instance if canUseAIFolderExtraction is false', async () => {
|
|
277
275
|
render(
|
|
278
276
|
<Instances
|
|
279
277
|
{...getInstancesBaseProps({
|
|
280
|
-
|
|
278
|
+
canUseAIFolderExtraction: false,
|
|
281
279
|
})}
|
|
282
280
|
/>,
|
|
283
281
|
);
|
|
@@ -288,9 +286,9 @@ describe('Instances component - canUseAIFolderExtractionAgentSelector prop', ()
|
|
|
288
286
|
expect(screen.queryByRole('combobox', { name: 'Standard' })).not.toBeInTheDocument();
|
|
289
287
|
});
|
|
290
288
|
|
|
291
|
-
test('should not show agent selector in child Instance if
|
|
289
|
+
test('should not show agent selector in child Instance if canUseAIFolderExtraction is undefined', async () => {
|
|
292
290
|
const props = getInstancesBaseProps();
|
|
293
|
-
delete props.
|
|
291
|
+
delete props.canUseAIFolderExtraction;
|
|
294
292
|
render(<Instances {...props} />);
|
|
295
293
|
|
|
296
294
|
const editButton = screen.getByRole('button', { name: 'Edit Metadata' });
|
|
@@ -534,57 +534,10 @@ describe('features/metadata-editor-editor/MetadataInstanceEditor', () => {
|
|
|
534
534
|
});
|
|
535
535
|
});
|
|
536
536
|
|
|
537
|
-
describe('MetadataInstanceEditor
|
|
538
|
-
test('should propagate canUseAIFolderExtractionAgentSelector, showing agent selector', async () => {
|
|
539
|
-
const props = getMetadataEditorBaseProps({
|
|
540
|
-
canUseAIFolderExtraction: true,
|
|
541
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
542
|
-
});
|
|
543
|
-
props.editors[0].instance.cascadePolicy.cascadePolicyType = 'ai_extract';
|
|
544
|
-
render(<MetadataInstanceEditor {...props} />);
|
|
545
|
-
|
|
546
|
-
const editButton = await screen.findByRole('button', { name: 'Edit Metadata' }, { timeout: 3000 });
|
|
547
|
-
await userEvent.click(editButton);
|
|
548
|
-
|
|
549
|
-
const cascadeToggle = screen.getByRole('switch', { name: 'Enable Cascade Policy' });
|
|
550
|
-
expect(cascadeToggle).toBeChecked();
|
|
551
|
-
|
|
552
|
-
const aiToggle = screen.getByRole('switch', { name: 'Box AI Autofill' });
|
|
553
|
-
expect(aiToggle).toBeChecked();
|
|
554
|
-
|
|
555
|
-
expect(screen.getByRole('combobox', { name: 'Standard' })).toBeInTheDocument();
|
|
556
|
-
});
|
|
557
|
-
|
|
558
|
-
test('should not show agent selector if canUseAIFolderExtractionAgentSelector is false', async () => {
|
|
559
|
-
render(
|
|
560
|
-
<MetadataInstanceEditor
|
|
561
|
-
{...getMetadataEditorBaseProps({
|
|
562
|
-
canUseAIFolderExtractionAgentSelector: false,
|
|
563
|
-
})}
|
|
564
|
-
/>,
|
|
565
|
-
);
|
|
566
|
-
|
|
567
|
-
const editButton = await screen.findByRole('button', { name: 'Edit Metadata' });
|
|
568
|
-
await userEvent.click(editButton);
|
|
569
|
-
|
|
570
|
-
expect(screen.queryByRole('combobox', { name: 'Standard' })).not.toBeInTheDocument();
|
|
571
|
-
});
|
|
572
|
-
|
|
573
|
-
test('should not show agent selector if canUseAIFolderExtractionAgentSelector is undefined', async () => {
|
|
574
|
-
const props = getMetadataEditorBaseProps();
|
|
575
|
-
delete props.canUseAIFolderExtractionAgentSelector;
|
|
576
|
-
render(<MetadataInstanceEditor {...props} />);
|
|
577
|
-
|
|
578
|
-
const editButton = await screen.findByRole('button', { name: 'Edit Metadata' });
|
|
579
|
-
await userEvent.click(editButton);
|
|
580
|
-
|
|
581
|
-
expect(screen.queryByRole('combobox', { name: 'Standard' })).not.toBeInTheDocument();
|
|
582
|
-
});
|
|
583
|
-
|
|
537
|
+
describe('MetadataInstanceEditor agent selector', () => {
|
|
584
538
|
test('should show "Enhanced" in the combobox when the second option is selected', async () => {
|
|
585
539
|
const props = getMetadataEditorBaseProps({
|
|
586
540
|
canUseAIFolderExtraction: true,
|
|
587
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
588
541
|
});
|
|
589
542
|
props.editors[0].instance.cascadePolicy.cascadePolicyType = 'ai_extract';
|
|
590
543
|
props.editors[0].instance.cascadePolicy.id = null;
|
|
@@ -416,7 +416,6 @@ exports[`features/metadata-instance-editor/fields/Instance should correctly rend
|
|
|
416
416
|
>
|
|
417
417
|
<CascadePolicy
|
|
418
418
|
canUseAIFolderExtraction={false}
|
|
419
|
-
canUseAIFolderExtractionAgentSelector={false}
|
|
420
419
|
isAIFolderExtractionEnabled={false}
|
|
421
420
|
isCascadingEnabled={true}
|
|
422
421
|
isCascadingOverwritten={false}
|
package/src/features/metadata-instance-editor/__tests__/__snapshots__/Instances.test.js.snap
CHANGED
|
@@ -5,7 +5,6 @@ exports[`features/metadata-editor-editor/Instances should correctly render edito
|
|
|
5
5
|
<injectIntl(Instance)
|
|
6
6
|
canEdit={true}
|
|
7
7
|
canUseAIFolderExtraction={false}
|
|
8
|
-
canUseAIFolderExtractionAgentSelector={false}
|
|
9
8
|
data={
|
|
10
9
|
{
|
|
11
10
|
"datefield": "2018-06-20T00:00:00.000Z",
|
|
@@ -111,7 +110,6 @@ exports[`features/metadata-editor-editor/Instances should correctly render edito
|
|
|
111
110
|
<injectIntl(Instance)
|
|
112
111
|
canEdit={false}
|
|
113
112
|
canUseAIFolderExtraction={false}
|
|
114
|
-
canUseAIFolderExtractionAgentSelector={false}
|
|
115
113
|
data={
|
|
116
114
|
{
|
|
117
115
|
"datefield": "2018-06-20T00:00:00.000Z",
|
|
@@ -5,7 +5,6 @@ import CascadePolicy from '../../CascadePolicy';
|
|
|
5
5
|
const baseProps = {
|
|
6
6
|
canEdit: true,
|
|
7
7
|
canUseAIFolderExtraction: true,
|
|
8
|
-
canUseAIFolderExtractionAgentSelector: true,
|
|
9
8
|
isAIFolderExtractionEnabled: false,
|
|
10
9
|
isCascadingEnabled: true,
|
|
11
10
|
isCascadingOverwritten: false,
|