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.
Files changed (88) hide show
  1. package/dist/explorer.css +1 -1
  2. package/dist/explorer.js +1 -1
  3. package/dist/preview.css +1 -1
  4. package/dist/preview.js +1 -1
  5. package/dist/sidebar.css +1 -1
  6. package/dist/sidebar.js +1 -1
  7. package/es/common/types/metadata.js.flow +5 -4
  8. package/es/common/types/metadata.js.map +1 -1
  9. package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js +43 -22
  10. package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
  11. package/es/elements/content-preview/PreviewNavigation.js +0 -2
  12. package/es/elements/content-preview/PreviewNavigation.js.flow +0 -2
  13. package/es/elements/content-preview/PreviewNavigation.js.map +1 -1
  14. package/es/elements/content-sidebar/versions/VersionsSidebarContainer.js +29 -7
  15. package/es/elements/content-sidebar/versions/VersionsSidebarContainer.js.flow +44 -5
  16. package/es/elements/content-sidebar/versions/VersionsSidebarContainer.js.map +1 -1
  17. package/es/elements/content-sidebar/withSidebarAnnotations.js +141 -35
  18. package/es/elements/content-sidebar/withSidebarAnnotations.js.flow +199 -37
  19. package/es/elements/content-sidebar/withSidebarAnnotations.js.map +1 -1
  20. package/es/features/metadata-instance-editor/CascadePolicy.js +6 -3
  21. package/es/features/metadata-instance-editor/CascadePolicy.js.flow +8 -2
  22. package/es/features/metadata-instance-editor/CascadePolicy.js.map +1 -1
  23. package/es/features/metadata-instance-editor/Instance.js +1 -0
  24. package/es/features/metadata-instance-editor/Instance.js.flow +1 -0
  25. package/es/features/metadata-instance-editor/Instance.js.map +1 -1
  26. package/es/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.d.ts +1 -1
  27. package/i18n/bn-IN.js +1 -1
  28. package/i18n/bn-IN.properties +4 -0
  29. package/i18n/da-DK.js +1 -1
  30. package/i18n/da-DK.properties +4 -0
  31. package/i18n/de-DE.js +1 -1
  32. package/i18n/de-DE.properties +4 -0
  33. package/i18n/en-AU.js +1 -1
  34. package/i18n/en-AU.properties +4 -0
  35. package/i18n/en-CA.js +1 -1
  36. package/i18n/en-CA.properties +4 -0
  37. package/i18n/en-GB.js +1 -1
  38. package/i18n/en-GB.properties +4 -0
  39. package/i18n/es-419.js +1 -1
  40. package/i18n/es-419.properties +4 -0
  41. package/i18n/es-ES.js +1 -1
  42. package/i18n/es-ES.properties +4 -0
  43. package/i18n/fi-FI.js +1 -1
  44. package/i18n/fi-FI.properties +4 -0
  45. package/i18n/fr-CA.js +1 -1
  46. package/i18n/fr-CA.properties +4 -0
  47. package/i18n/fr-FR.js +1 -1
  48. package/i18n/fr-FR.properties +4 -0
  49. package/i18n/hi-IN.js +1 -1
  50. package/i18n/hi-IN.properties +4 -0
  51. package/i18n/it-IT.js +1 -1
  52. package/i18n/it-IT.properties +4 -0
  53. package/i18n/ja-JP.js +1 -1
  54. package/i18n/ja-JP.properties +4 -0
  55. package/i18n/ko-KR.js +1 -1
  56. package/i18n/ko-KR.properties +4 -0
  57. package/i18n/nb-NO.js +1 -1
  58. package/i18n/nb-NO.properties +4 -0
  59. package/i18n/nl-NL.js +1 -1
  60. package/i18n/nl-NL.properties +4 -0
  61. package/i18n/pl-PL.js +1 -1
  62. package/i18n/pl-PL.properties +4 -0
  63. package/i18n/pt-BR.js +1 -1
  64. package/i18n/pt-BR.properties +4 -0
  65. package/i18n/ru-RU.js +1 -1
  66. package/i18n/ru-RU.properties +4 -0
  67. package/i18n/sv-SE.js +1 -1
  68. package/i18n/sv-SE.properties +4 -0
  69. package/i18n/tr-TR.js +1 -1
  70. package/i18n/tr-TR.properties +4 -0
  71. package/i18n/zh-CN.js +1 -1
  72. package/i18n/zh-CN.properties +4 -0
  73. package/i18n/zh-TW.js +1 -1
  74. package/i18n/zh-TW.properties +4 -0
  75. package/package.json +3 -3
  76. package/src/common/types/metadata.js +5 -4
  77. package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +47 -31
  78. package/src/elements/content-preview/PreviewNavigation.js +0 -2
  79. package/src/elements/content-preview/__tests__/PreviewNavigation.test.js +12 -12
  80. package/src/elements/content-sidebar/__tests__/withSidebarAnnotations.rtl.test.js +1152 -0
  81. package/src/elements/content-sidebar/versions/VersionsSidebarContainer.js +44 -5
  82. package/src/elements/content-sidebar/versions/__tests__/VersionsSidebarContainer.test.js +200 -43
  83. package/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsSidebarContainer.test.js.snap +2 -2
  84. package/src/elements/content-sidebar/withSidebarAnnotations.js +199 -37
  85. package/src/features/metadata-instance-editor/CascadePolicy.js +8 -2
  86. package/src/features/metadata-instance-editor/Instance.js +1 -0
  87. package/src/features/metadata-instance-editor/__tests__/CascadePolicy.test.js +45 -0
  88. package/src/elements/content-sidebar/__tests__/withSidebarAnnotations.test.js +0 -626
@@ -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": " {numSelected, plural, =0 {0 files selected} one {1 file selected} other {# files selected} } ",
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": "下一步",
@@ -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.36",
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.48.5",
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.48.5",
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
- const EID = '0';
9
- const templateName = 'templateName';
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 metadataQuery = {
14
- from: metadataSource,
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
- ancestor_folder_id: '313259567207',
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
- `${metadataSourceFieldName}.name`,
25
- `${metadataSourceFieldName}.industry`,
26
- `${metadataSourceFieldName}.last_contacted_at`,
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: `${metadataSourceFieldName}.name`, canEdit: false, displayName: 'Alias' },
33
- { key: `${metadataSourceFieldName}.industry`, canEdit: true },
34
- { key: `${metadataSourceFieldName}.last_contacted_at`, canEdit: true },
35
- { key: `${metadataSourceFieldName}.role`, canEdit: true },
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
- const columns = mockSchema.fields.map(field => ({
39
- textValue: field.displayName,
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 withNewMetadataView: Story = {
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.queryByTestId('preview-navigation-left');
82
- const rightButton = screen.queryByTestId('preview-navigation-right');
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.getByTestId('preview-navigation-left');
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.getByTestId('preview-navigation-right');
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.getByTestId('preview-navigation-right');
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.getByTestId('preview-navigation-left');
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.getByTestId('preview-navigation-left')).toBeInTheDocument();
176
- expect(screen.getByTestId('preview-navigation-right')).toBeInTheDocument();
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.getByTestId('preview-navigation-left');
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.getByTestId('preview-navigation-right');
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.getByTestId('preview-navigation-left');
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.getByTestId('preview-navigation-right');
255
+ const rightButton = screen.getByRole('button', { name: 'Next File' });
256
256
  await user.click(rightButton);
257
257
 
258
258
  expect(mockNavigationHandler).toHaveBeenCalledTimes(1);