box-ui-elements 23.4.0-beta.36 → 23.4.0-beta.38
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/common/types/metadata.js.flow +5 -4
- package/es/common/types/metadata.js.map +1 -1
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js +43 -22
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
- package/es/elements/content-preview/PreviewNavigation.js +0 -2
- package/es/elements/content-preview/PreviewNavigation.js.flow +0 -2
- package/es/elements/content-preview/PreviewNavigation.js.map +1 -1
- package/es/elements/content-sidebar/versions/VersionsSidebarContainer.js +29 -7
- package/es/elements/content-sidebar/versions/VersionsSidebarContainer.js.flow +44 -5
- package/es/elements/content-sidebar/versions/VersionsSidebarContainer.js.map +1 -1
- package/es/elements/content-sidebar/withSidebarAnnotations.js +141 -35
- package/es/elements/content-sidebar/withSidebarAnnotations.js.flow +199 -37
- package/es/elements/content-sidebar/withSidebarAnnotations.js.map +1 -1
- package/es/features/metadata-instance-editor/CascadePolicy.js +6 -3
- package/es/features/metadata-instance-editor/CascadePolicy.js.flow +8 -2
- package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
- package/es/features/metadata-instance-editor/Instance.js +1 -0
- package/es/features/metadata-instance-editor/Instance.js.flow +1 -0
- package/es/features/metadata-instance-editor/Instance.js.map +1 -1
- package/es/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.d.ts +1 -1
- package/i18n/bn-IN.js +1 -1
- package/i18n/bn-IN.properties +4 -0
- package/i18n/da-DK.js +1 -1
- package/i18n/da-DK.properties +4 -0
- package/i18n/de-DE.js +1 -1
- package/i18n/de-DE.properties +4 -0
- package/i18n/en-AU.js +1 -1
- package/i18n/en-AU.properties +4 -0
- package/i18n/en-CA.js +1 -1
- package/i18n/en-CA.properties +4 -0
- package/i18n/en-GB.js +1 -1
- package/i18n/en-GB.properties +4 -0
- package/i18n/es-419.js +1 -1
- package/i18n/es-419.properties +4 -0
- package/i18n/es-ES.js +1 -1
- package/i18n/es-ES.properties +4 -0
- package/i18n/fi-FI.js +1 -1
- package/i18n/fi-FI.properties +4 -0
- package/i18n/fr-CA.js +1 -1
- package/i18n/fr-CA.properties +4 -0
- package/i18n/fr-FR.js +1 -1
- package/i18n/fr-FR.properties +4 -0
- package/i18n/hi-IN.js +1 -1
- package/i18n/hi-IN.properties +4 -0
- package/i18n/it-IT.js +1 -1
- package/i18n/it-IT.properties +4 -0
- package/i18n/ja-JP.js +1 -1
- package/i18n/ja-JP.properties +4 -0
- package/i18n/ko-KR.js +1 -1
- package/i18n/ko-KR.properties +4 -0
- package/i18n/nb-NO.js +1 -1
- package/i18n/nb-NO.properties +4 -0
- package/i18n/nl-NL.js +1 -1
- package/i18n/nl-NL.properties +4 -0
- package/i18n/pl-PL.js +1 -1
- package/i18n/pl-PL.properties +4 -0
- package/i18n/pt-BR.js +1 -1
- package/i18n/pt-BR.properties +4 -0
- package/i18n/ru-RU.js +1 -1
- package/i18n/ru-RU.properties +4 -0
- package/i18n/sv-SE.js +1 -1
- package/i18n/sv-SE.properties +4 -0
- package/i18n/tr-TR.js +1 -1
- package/i18n/tr-TR.properties +4 -0
- package/i18n/zh-CN.js +1 -1
- package/i18n/zh-CN.properties +4 -0
- package/i18n/zh-TW.js +1 -1
- package/i18n/zh-TW.properties +4 -0
- package/package.json +3 -3
- package/src/common/types/metadata.js +5 -4
- package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +47 -31
- package/src/elements/content-preview/PreviewNavigation.js +0 -2
- package/src/elements/content-preview/__tests__/PreviewNavigation.test.js +12 -12
- package/src/elements/content-sidebar/__tests__/withSidebarAnnotations.rtl.test.js +1152 -0
- package/src/elements/content-sidebar/versions/VersionsSidebarContainer.js +44 -5
- package/src/elements/content-sidebar/versions/__tests__/VersionsSidebarContainer.test.js +200 -43
- package/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsSidebarContainer.test.js.snap +2 -2
- package/src/elements/content-sidebar/withSidebarAnnotations.js +199 -37
- package/src/features/metadata-instance-editor/CascadePolicy.js +8 -2
- package/src/features/metadata-instance-editor/Instance.js +1 -0
- package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +45 -0
- package/src/elements/content-sidebar/__tests__/withSidebarAnnotations.test.js +0 -626
package/i18n/zh-CN.properties
CHANGED
|
@@ -92,6 +92,8 @@ be.breadcrumb.breadcrumbLabel = 阶层连结
|
|
|
92
92
|
be.cancel = 取消
|
|
93
93
|
# Label for choose action.
|
|
94
94
|
be.choose = 选择
|
|
95
|
+
# Aria label for the clear selection button.
|
|
96
|
+
be.clearSelection = Clear selection
|
|
95
97
|
# Label for close action.
|
|
96
98
|
be.close = 关闭
|
|
97
99
|
# Icon title for a Box item of type folder that has collaborators
|
|
@@ -602,6 +604,8 @@ be.noActivity = 没有要显示的活动
|
|
|
602
604
|
be.noActivityAnnotationPrompt = 将鼠标指针悬停在预览上,然后使用底部的控件为文件添加批注。
|
|
603
605
|
# Message shown in
|
|
604
606
|
be.noActivityCommentPrompt = 评论并用 @ 通知相关人员。
|
|
607
|
+
# Text shown to indicate the number of files selected
|
|
608
|
+
be.numFilesSelected = {numSelected, plural, =0 {0 files selected} one {1 file selected} other {# files selected} }
|
|
605
609
|
# Label for open action.
|
|
606
610
|
be.open = 打开
|
|
607
611
|
# Next page button tooltip
|
package/i18n/zh-TW.js
CHANGED
|
@@ -302,7 +302,7 @@ export default {
|
|
|
302
302
|
"be.noActivity": "沒有可顯示的活動",
|
|
303
303
|
"be.noActivityAnnotationPrompt": "將游標停留在預覽上方,並使用底部的控制項為檔案新增註解。",
|
|
304
304
|
"be.noActivityCommentPrompt": "留言並「@提及」人員來通知人員。",
|
|
305
|
-
"be.numFilesSelected": "
|
|
305
|
+
"be.numFilesSelected": "{numSelected, plural, =0 {0 files selected} one {1 file selected} other {# files selected} } ",
|
|
306
306
|
"be.open": "開啟",
|
|
307
307
|
"be.pagination.nextPage": "下一頁",
|
|
308
308
|
"be.pagination.nextPageButton": "下一步",
|
package/i18n/zh-TW.properties
CHANGED
|
@@ -92,6 +92,8 @@ be.breadcrumb.breadcrumbLabel = 階層連結
|
|
|
92
92
|
be.cancel = 取消
|
|
93
93
|
# Label for choose action.
|
|
94
94
|
be.choose = 選擇
|
|
95
|
+
# Aria label for the clear selection button.
|
|
96
|
+
be.clearSelection = Clear selection
|
|
95
97
|
# Label for close action.
|
|
96
98
|
be.close = 關閉
|
|
97
99
|
# Icon title for a Box item of type folder that has collaborators
|
|
@@ -602,6 +604,8 @@ be.noActivity = 沒有可顯示的活動
|
|
|
602
604
|
be.noActivityAnnotationPrompt = 將游標停留在預覽上方,並使用底部的控制項為檔案新增註解。
|
|
603
605
|
# Message shown in
|
|
604
606
|
be.noActivityCommentPrompt = 留言並「@提及」人員來通知人員。
|
|
607
|
+
# Text shown to indicate the number of files selected
|
|
608
|
+
be.numFilesSelected = {numSelected, plural, =0 {0 files selected} one {1 file selected} other {# files selected} }
|
|
605
609
|
# Label for open action.
|
|
606
610
|
be.open = 開啟
|
|
607
611
|
# Next page button tooltip
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "box-ui-elements",
|
|
3
|
-
"version": "23.4.0-beta.
|
|
3
|
+
"version": "23.4.0-beta.38",
|
|
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.52.0",
|
|
134
134
|
"@box/box-ai-content-answers": "^0.124.1",
|
|
135
135
|
"@box/box-item-type-selector": "^0.61.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.52.0",
|
|
303
303
|
"@box/box-ai-content-answers": "^0.124.1",
|
|
304
304
|
"@box/box-item-type-selector": "^0.61.12",
|
|
305
305
|
"@box/cldr-data": ">=34.2.0",
|
|
@@ -87,14 +87,15 @@ type MetadataType = {
|
|
|
87
87
|
global?: MetadataSkillsTemplate,
|
|
88
88
|
};
|
|
89
89
|
|
|
90
|
+
type MetadataCascadePolicyConfiguration = {
|
|
91
|
+
agent: string,
|
|
92
|
+
};
|
|
93
|
+
|
|
90
94
|
type MetadataCascadePolicy = {
|
|
91
95
|
canEdit?: boolean,
|
|
92
96
|
id?: string,
|
|
93
97
|
cascadePolicyType?: string,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
type MetadataCascadePolicyConfiguration = {
|
|
97
|
-
agent: string,
|
|
98
|
+
cascadePolicyConfiguration?: MetadataCascadePolicyConfiguration,
|
|
98
99
|
};
|
|
99
100
|
|
|
100
101
|
type MetadataCascadingPolicyData = {
|
|
@@ -5,45 +5,61 @@ import ContentExplorer from '../../ContentExplorer';
|
|
|
5
5
|
import { DEFAULT_HOSTNAME_API } from '../../../../constants';
|
|
6
6
|
import { mockMetadata, mockSchema } from '../../../common/__mocks__/mockMetadata';
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const metadataSource = `enterprise_${EID}.${templateName}`;
|
|
11
|
-
const metadataSourceFieldName = `metadata.${metadataSource}`;
|
|
8
|
+
// 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.
|
|
9
|
+
const { scope: templateScope, templateKey } = mockSchema;
|
|
12
10
|
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
// // Filter items in the folder by existing metadata key
|
|
17
|
-
// query: 'key = :arg1',
|
|
18
|
-
//
|
|
19
|
-
// // Display items with value
|
|
20
|
-
// query_params: { arg1: 'value' },
|
|
11
|
+
const metadataScopeAndKey = `${templateScope}.${templateKey}`;
|
|
12
|
+
const metadataFieldNamePrefix = `metadata.${metadataScopeAndKey}`;
|
|
21
13
|
|
|
22
|
-
|
|
14
|
+
// This is the body of the metadata query API call.
|
|
15
|
+
// https://developer.box.com/guides/metadata/queries/syntax/
|
|
16
|
+
const metadataQuery = {
|
|
17
|
+
from: metadataScopeAndKey,
|
|
18
|
+
ancestor_folder_id: '0',
|
|
19
|
+
sort_by: [
|
|
20
|
+
{
|
|
21
|
+
field_key: `${metadataFieldNamePrefix}.${mockSchema.fields[0].key}`, // Default to sorting by the first field in the schema
|
|
22
|
+
direction: 'asc',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
23
25
|
fields: [
|
|
24
|
-
|
|
25
|
-
`${
|
|
26
|
-
|
|
27
|
-
`${metadataSourceFieldName}.role`,
|
|
26
|
+
// Default to returning all fields in the metadata template schema, and name as a standalone (non-metadata) field
|
|
27
|
+
...mockSchema.fields.map(field => `${metadataFieldNamePrefix}.${field.key}`),
|
|
28
|
+
'name',
|
|
28
29
|
],
|
|
29
30
|
};
|
|
30
31
|
|
|
32
|
+
// Used for metadata view v1
|
|
31
33
|
const fieldsToShow = [
|
|
32
|
-
{ key: `${
|
|
33
|
-
{ key: `${
|
|
34
|
-
{ key: `${
|
|
35
|
-
{ key: `${
|
|
34
|
+
{ key: `${metadataFieldNamePrefix}.name`, canEdit: false, displayName: 'Alias' },
|
|
35
|
+
{ key: `${metadataFieldNamePrefix}.industry`, canEdit: true },
|
|
36
|
+
{ key: `${metadataFieldNamePrefix}.last_contacted_at`, canEdit: true },
|
|
37
|
+
{ key: `${metadataFieldNamePrefix}.role`, canEdit: true },
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
// Used for metadata view v2
|
|
41
|
+
const columns = [
|
|
42
|
+
{
|
|
43
|
+
// Always include the name column
|
|
44
|
+
textValue: 'Name',
|
|
45
|
+
id: 'name',
|
|
46
|
+
type: 'string',
|
|
47
|
+
allowSorting: true,
|
|
48
|
+
minWidth: 150,
|
|
49
|
+
maxWidth: 150,
|
|
50
|
+
},
|
|
51
|
+
...mockSchema.fields.map(field => ({
|
|
52
|
+
textValue: field.displayName,
|
|
53
|
+
id: `${metadataFieldNamePrefix}.${field.key}`,
|
|
54
|
+
type: field.type,
|
|
55
|
+
allowSorting: true,
|
|
56
|
+
minWidth: 150,
|
|
57
|
+
maxWidth: 150,
|
|
58
|
+
})),
|
|
36
59
|
];
|
|
37
60
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
id: `${metadataSourceFieldName}.${field.key}`,
|
|
41
|
-
type: field.type,
|
|
42
|
-
allowSorting: true,
|
|
43
|
-
minWidth: 150,
|
|
44
|
-
maxWidth: 150,
|
|
45
|
-
}));
|
|
46
|
-
const defaultView = 'metadata'; // Required prop to paint the metadata view. If not provided, you'll get regular folder view.
|
|
61
|
+
// Switches ContentExplorer to use Metadata View over standard, folder-based view.
|
|
62
|
+
const defaultView = 'metadata';
|
|
47
63
|
|
|
48
64
|
type Story = StoryObj<typeof ContentExplorer>;
|
|
49
65
|
|
|
@@ -55,7 +71,7 @@ export const metadataView: Story = {
|
|
|
55
71
|
},
|
|
56
72
|
};
|
|
57
73
|
|
|
58
|
-
export const
|
|
74
|
+
export const metadataViewV2: Story = {
|
|
59
75
|
args: {
|
|
60
76
|
metadataViewProps: {
|
|
61
77
|
columns,
|
|
@@ -123,7 +123,6 @@ const PreviewNavigationWithoutRouter = ({
|
|
|
123
123
|
{hasLeftNavigation && (
|
|
124
124
|
<PlainButton
|
|
125
125
|
className="bcpr-navigate-left"
|
|
126
|
-
data-testid="preview-navigation-left"
|
|
127
126
|
onClick={() => {
|
|
128
127
|
handleInternalNavigation();
|
|
129
128
|
onNavigateLeft();
|
|
@@ -137,7 +136,6 @@ const PreviewNavigationWithoutRouter = ({
|
|
|
137
136
|
{hasRightNavigation && (
|
|
138
137
|
<PlainButton
|
|
139
138
|
className="bcpr-navigate-right"
|
|
140
|
-
data-testid="preview-navigation-right"
|
|
141
139
|
onClick={() => {
|
|
142
140
|
handleInternalNavigation();
|
|
143
141
|
onNavigateRight();
|
|
@@ -78,8 +78,8 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
78
78
|
const collection = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
|
|
79
79
|
renderComponentWithRouter({ collection, currentIndex });
|
|
80
80
|
|
|
81
|
-
const leftButton = screen.
|
|
82
|
-
const rightButton = screen.
|
|
81
|
+
const leftButton = screen.queryByRole('button', { name: 'Previous File' });
|
|
82
|
+
const rightButton = screen.queryByRole('button', { name: 'Next File' });
|
|
83
83
|
|
|
84
84
|
if (expectLeft) {
|
|
85
85
|
expect(leftButton).toBeInTheDocument();
|
|
@@ -103,7 +103,7 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
103
103
|
historyMock: historyMockDefault,
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
-
const leftButton = screen.
|
|
106
|
+
const leftButton = screen.getByRole('button', { name: 'Previous File' });
|
|
107
107
|
expect(leftButton).toBeInTheDocument();
|
|
108
108
|
|
|
109
109
|
await user.click(leftButton);
|
|
@@ -121,7 +121,7 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
121
121
|
historyMock: historyMockDefault,
|
|
122
122
|
});
|
|
123
123
|
|
|
124
|
-
const rightButton = screen.
|
|
124
|
+
const rightButton = screen.getByRole('button', { name: 'Next File' });
|
|
125
125
|
expect(rightButton).toBeInTheDocument();
|
|
126
126
|
|
|
127
127
|
await user.click(rightButton);
|
|
@@ -139,7 +139,7 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
139
139
|
historyMock: deeplinkedMetadataHistoryMock,
|
|
140
140
|
});
|
|
141
141
|
|
|
142
|
-
const rightButton = screen.
|
|
142
|
+
const rightButton = screen.getByRole('button', { name: 'Next File' });
|
|
143
143
|
expect(rightButton).toBeInTheDocument();
|
|
144
144
|
|
|
145
145
|
await user.click(rightButton);
|
|
@@ -157,7 +157,7 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
157
157
|
historyMock: deeplinkedMetadataHistoryMock,
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
-
const leftButton = screen.
|
|
160
|
+
const leftButton = screen.getByRole('button', { name: 'Previous File' });
|
|
161
161
|
expect(leftButton).toBeInTheDocument();
|
|
162
162
|
|
|
163
163
|
await user.click(leftButton);
|
|
@@ -172,8 +172,8 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
172
172
|
test('should render correctly without router', () => {
|
|
173
173
|
renderComponentWithoutRouter({ currentIndex: 1 });
|
|
174
174
|
|
|
175
|
-
expect(screen.
|
|
176
|
-
expect(screen.
|
|
175
|
+
expect(screen.getByRole('button', { name: 'Previous File' })).toBeInTheDocument();
|
|
176
|
+
expect(screen.getByRole('button', { name: 'Next File' })).toBeInTheDocument();
|
|
177
177
|
});
|
|
178
178
|
|
|
179
179
|
test('should call internalSidebarNavigationHandler when left navigation button is clicked', async () => {
|
|
@@ -188,7 +188,7 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
188
188
|
internalSidebarNavigation: mockInternalSidebarNavigation,
|
|
189
189
|
});
|
|
190
190
|
|
|
191
|
-
const leftButton = screen.
|
|
191
|
+
const leftButton = screen.getByRole('button', { name: 'Previous File' });
|
|
192
192
|
await user.click(leftButton);
|
|
193
193
|
|
|
194
194
|
expect(mockNavigationHandler).toHaveBeenCalledTimes(1);
|
|
@@ -209,7 +209,7 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
209
209
|
internalSidebarNavigation: mockInternalSidebarNavigation,
|
|
210
210
|
});
|
|
211
211
|
|
|
212
|
-
const rightButton = screen.
|
|
212
|
+
const rightButton = screen.getByRole('button', { name: 'Next File' });
|
|
213
213
|
await user.click(rightButton);
|
|
214
214
|
|
|
215
215
|
expect(mockNavigationHandler).toHaveBeenCalledTimes(1);
|
|
@@ -229,7 +229,7 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
229
229
|
internalSidebarNavigation: mockInternalSidebarNavigation,
|
|
230
230
|
});
|
|
231
231
|
|
|
232
|
-
const leftButton = screen.
|
|
232
|
+
const leftButton = screen.getByRole('button', { name: 'Previous File' });
|
|
233
233
|
await user.click(leftButton);
|
|
234
234
|
|
|
235
235
|
expect(mockNavigationHandler).toHaveBeenCalledTimes(1);
|
|
@@ -252,7 +252,7 @@ describe('elements/content-preview/PreviewNavigation', () => {
|
|
|
252
252
|
internalSidebarNavigation: mockInternalSidebarNavigation,
|
|
253
253
|
});
|
|
254
254
|
|
|
255
|
-
const rightButton = screen.
|
|
255
|
+
const rightButton = screen.getByRole('button', { name: 'Next File' });
|
|
256
256
|
await user.click(rightButton);
|
|
257
257
|
|
|
258
258
|
expect(mockNavigationHandler).toHaveBeenCalledTimes(1);
|