box-ui-elements 24.0.0-beta.5 → 24.0.0-beta.7

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 (94) hide show
  1. package/dist/explorer.css +1 -1
  2. package/dist/explorer.js +1 -1
  3. package/dist/picker.js +1 -1
  4. package/es/elements/content-explorer/Content.js +3 -1
  5. package/es/elements/content-explorer/Content.js.map +1 -1
  6. package/es/elements/content-explorer/ContentExplorer.js +17 -6
  7. package/es/elements/content-explorer/ContentExplorer.js.map +1 -1
  8. package/es/elements/content-explorer/MetadataQueryAPIHelper.js +104 -7
  9. package/es/elements/content-explorer/MetadataQueryAPIHelper.js.map +1 -1
  10. package/es/elements/content-explorer/MetadataQueryBuilder.js +154 -0
  11. package/es/elements/content-explorer/MetadataQueryBuilder.js.map +1 -0
  12. package/es/elements/content-explorer/MetadataViewContainer.js +92 -46
  13. package/es/elements/content-explorer/MetadataViewContainer.js.map +1 -1
  14. package/es/elements/content-explorer/constants.js +4 -2
  15. package/es/elements/content-explorer/constants.js.map +1 -1
  16. package/es/elements/content-explorer/stories/MetadataView.stories.js +3 -25
  17. package/es/elements/content-explorer/stories/MetadataView.stories.js.map +1 -1
  18. package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js +4 -16
  19. package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
  20. package/es/elements/content-explorer/utils.js +12 -0
  21. package/es/elements/content-explorer/utils.js.map +1 -1
  22. package/es/src/elements/common/__mocks__/mockMetadata.d.ts +8 -24
  23. package/es/src/elements/content-explorer/Content.d.ts +4 -3
  24. package/es/src/elements/content-explorer/ContentExplorer.d.ts +8 -3
  25. package/es/src/elements/content-explorer/MetadataQueryAPIHelper.d.ts +11 -2
  26. package/es/src/elements/content-explorer/MetadataQueryBuilder.d.ts +27 -0
  27. package/es/src/elements/content-explorer/MetadataViewContainer.d.ts +8 -4
  28. package/es/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.d.ts +1 -0
  29. package/es/src/elements/content-explorer/constants.d.ts +4 -2
  30. package/es/src/elements/content-explorer/utils.d.ts +2 -0
  31. package/i18n/bn-IN.js +1 -1
  32. package/i18n/bn-IN.properties +8 -0
  33. package/i18n/da-DK.js +1 -1
  34. package/i18n/da-DK.properties +8 -0
  35. package/i18n/de-DE.js +1 -1
  36. package/i18n/de-DE.properties +8 -0
  37. package/i18n/en-AU.js +1 -1
  38. package/i18n/en-AU.properties +8 -0
  39. package/i18n/en-CA.js +1 -1
  40. package/i18n/en-CA.properties +8 -0
  41. package/i18n/en-GB.js +1 -1
  42. package/i18n/en-GB.properties +8 -0
  43. package/i18n/es-419.js +1 -1
  44. package/i18n/es-419.properties +8 -0
  45. package/i18n/es-ES.js +1 -1
  46. package/i18n/es-ES.properties +8 -0
  47. package/i18n/fi-FI.js +1 -1
  48. package/i18n/fi-FI.properties +8 -0
  49. package/i18n/fr-CA.js +1 -1
  50. package/i18n/fr-CA.properties +8 -0
  51. package/i18n/fr-FR.js +1 -1
  52. package/i18n/fr-FR.properties +8 -0
  53. package/i18n/hi-IN.js +1 -1
  54. package/i18n/hi-IN.properties +8 -0
  55. package/i18n/it-IT.js +1 -1
  56. package/i18n/it-IT.properties +8 -0
  57. package/i18n/ja-JP.js +1 -1
  58. package/i18n/ja-JP.properties +8 -0
  59. package/i18n/ko-KR.js +1 -1
  60. package/i18n/ko-KR.properties +8 -0
  61. package/i18n/nb-NO.js +1 -1
  62. package/i18n/nb-NO.properties +8 -0
  63. package/i18n/nl-NL.js +1 -1
  64. package/i18n/nl-NL.properties +8 -0
  65. package/i18n/pl-PL.js +1 -1
  66. package/i18n/pl-PL.properties +8 -0
  67. package/i18n/pt-BR.js +1 -1
  68. package/i18n/pt-BR.properties +8 -0
  69. package/i18n/ru-RU.js +1 -1
  70. package/i18n/ru-RU.properties +8 -0
  71. package/i18n/sv-SE.js +1 -1
  72. package/i18n/sv-SE.properties +8 -0
  73. package/i18n/tr-TR.js +1 -1
  74. package/i18n/tr-TR.properties +8 -0
  75. package/i18n/zh-CN.js +1 -1
  76. package/i18n/zh-CN.properties +8 -0
  77. package/i18n/zh-TW.js +1 -1
  78. package/i18n/zh-TW.properties +8 -0
  79. package/package.json +3 -3
  80. package/src/elements/common/__mocks__/mockMetadata.ts +7 -11
  81. package/src/elements/content-explorer/Content.tsx +8 -2
  82. package/src/elements/content-explorer/ContentExplorer.tsx +209 -194
  83. package/src/elements/content-explorer/MetadataQueryAPIHelper.ts +111 -5
  84. package/src/elements/content-explorer/MetadataQueryBuilder.ts +194 -0
  85. package/src/elements/content-explorer/MetadataViewContainer.tsx +112 -37
  86. package/src/elements/content-explorer/__tests__/Content.test.tsx +1 -0
  87. package/src/elements/content-explorer/__tests__/ContentExplorer.test.tsx +2 -5
  88. package/src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts +427 -8
  89. package/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts +535 -0
  90. package/src/elements/content-explorer/__tests__/MetadataViewContainer.test.tsx +413 -9
  91. package/src/elements/content-explorer/constants.ts +39 -2
  92. package/src/elements/content-explorer/stories/MetadataView.stories.tsx +3 -21
  93. package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +2 -13
  94. package/src/elements/content-explorer/utils.ts +17 -0
@@ -1,5 +1,4 @@
1
- const _excluded = ["actionBarProps", "columns", "currentCollection", "metadataTemplate", "onSortChange"],
2
- _excluded2 = ["tableProps"];
1
+ const _excluded = ["actionBarProps", "columns", "currentCollection", "metadataTemplate", "onMetadataFilter", "onSortChange", "tableProps"];
3
2
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
4
3
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
4
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -9,11 +8,17 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
9
8
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
10
9
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
11
10
  import * as React from 'react';
11
+ import { useIntl } from 'react-intl';
12
12
  import { MetadataView } from '@box/metadata-view';
13
+ import cloneDeep from 'lodash/cloneDeep';
14
+ import { FIELD_ITEM_NAME } from '../../constants';
15
+ import messages from '../common/messages';
13
16
 
14
17
  // Public-friendly version of MetadataFormFieldValue from @box/metadata-filter
15
18
  // (string[] for enum type, range/float objects stay the same)
16
19
 
20
+ const ITEM_FILTER_NAME = 'item_name';
21
+
17
22
  /**
18
23
  * Helper function to trim metadataFieldNamePrefix from column names
19
24
  * For example: 'metadata.enterprise_1515946.mdViewTemplate1.industry' -> 'industry'
@@ -43,72 +48,113 @@ function transformInitialFilterValuesToInternal(publicValues) {
43
48
  return acc;
44
49
  }, {});
45
50
  }
46
- function transformInternalFieldsToPublic(fields) {
47
- return Object.entries(fields).reduce((acc, [key, {
48
- value
49
- }]) => {
50
- acc[key] = 'enum' in value && Array.isArray(value.enum) ? {
51
- value: value.enum
52
- } : {
53
- value: value
51
+ export function convertFilterValuesToExternal(fields) {
52
+ return Object.entries(fields).reduce((acc, [key, field]) => {
53
+ const {
54
+ value,
55
+ options,
56
+ fieldType
57
+ } = field;
58
+
59
+ // Transform the value based on its type
60
+ const transformedValue = 'enum' in value && Array.isArray(value.enum) ? value.enum // Convert enum type to string array
61
+ : value; // Keep range/float objects as-is
62
+
63
+ acc[key === ITEM_FILTER_NAME ? FIELD_ITEM_NAME : key] = {
64
+ options,
65
+ fieldType,
66
+ value: transformedValue
54
67
  };
55
68
  return acc;
56
69
  }, {});
57
70
  }
71
+
72
+ // Internal helper function for component use
73
+ function transformInternalFieldsToPublic(fields) {
74
+ return convertFilterValuesToExternal(fields);
75
+ }
58
76
  const MetadataViewContainer = _ref => {
59
77
  let {
60
78
  actionBarProps,
61
79
  columns,
62
80
  currentCollection,
63
81
  metadataTemplate,
64
- onSortChange: onSortChangeInternal
82
+ onMetadataFilter,
83
+ onSortChange: onSortChangeInternal,
84
+ tableProps
65
85
  } = _ref,
66
86
  rest = _objectWithoutProperties(_ref, _excluded);
87
+ const {
88
+ formatMessage
89
+ } = useIntl();
67
90
  const {
68
91
  items = []
69
92
  } = currentCollection;
70
93
  const {
71
94
  initialFilterValues: initialFilterValuesProp,
72
- onFilterSubmit: onFilterSubmitProp
95
+ onFilterSubmit
73
96
  } = actionBarProps ?? {};
74
- const filterGroups = React.useMemo(() => [{
75
- toggleable: true,
76
- filters: metadataTemplate?.fields?.map(field => {
77
- return {
78
- id: `${field.key}-filter`,
79
- name: field.displayName,
80
- fieldType: field.type,
81
- options: field.options?.map(({
82
- key
83
- }) => key) || [],
84
- shouldRenderChip: true
85
- };
86
- }) || []
87
- }], [metadataTemplate]);
97
+ const newColumns = React.useMemo(() => {
98
+ let clonedColumns = cloneDeep(columns);
99
+ const hasItemNameField = clonedColumns.some(col => col.id === FIELD_ITEM_NAME);
100
+ if (!hasItemNameField) {
101
+ clonedColumns = [{
102
+ allowsSorting: true,
103
+ id: FIELD_ITEM_NAME,
104
+ isItemMetadata: true,
105
+ isRowHeader: true,
106
+ minWidth: 250,
107
+ maxWidth: 250,
108
+ textValue: formatMessage(messages.name),
109
+ type: 'string'
110
+ }, ...clonedColumns];
111
+ }
112
+ return clonedColumns;
113
+ }, [columns, formatMessage]);
114
+ const filterGroups = React.useMemo(() => {
115
+ const clonedTemplate = cloneDeep(metadataTemplate);
116
+ let fields = clonedTemplate?.fields || [];
88
117
 
89
- // Transform initial filter values to internal field format
118
+ // Check if item_name field already exists to avoid duplicates
119
+ const hasItemNameField = fields.some(field => field.key === ITEM_FILTER_NAME);
120
+ if (!hasItemNameField) {
121
+ fields = [{
122
+ key: ITEM_FILTER_NAME,
123
+ displayName: formatMessage(messages.name),
124
+ type: 'string',
125
+ shouldRenderChip: true
126
+ }, ...fields];
127
+ }
128
+ return [{
129
+ toggleable: true,
130
+ filters: fields?.map(field => {
131
+ return {
132
+ id: field.key,
133
+ name: field.displayName,
134
+ fieldType: field.type,
135
+ options: field.options?.map(({
136
+ key
137
+ }) => key) || [],
138
+ shouldRenderChip: true
139
+ };
140
+ }) || []
141
+ }];
142
+ }, [formatMessage, metadataTemplate]);
90
143
  const initialFilterValues = React.useMemo(() => transformInitialFilterValuesToInternal(initialFilterValuesProp), [initialFilterValuesProp]);
91
-
92
- // Transform field values to public-friendly format
93
- const onFilterSubmit = React.useCallback(fields => {
94
- if (!onFilterSubmitProp) return;
144
+ const handleFilterSubmit = React.useCallback(fields => {
95
145
  const transformed = transformInternalFieldsToPublic(fields);
96
- onFilterSubmitProp(transformed);
97
- }, [onFilterSubmitProp]);
146
+ onMetadataFilter(transformed);
147
+ if (onFilterSubmit) {
148
+ onFilterSubmit(transformed);
149
+ }
150
+ }, [onFilterSubmit, onMetadataFilter]);
98
151
  const transformedActionBarProps = React.useMemo(() => {
99
152
  return _objectSpread(_objectSpread({}, actionBarProps), {}, {
100
153
  initialFilterValues,
101
- onFilterSubmit,
154
+ onFilterSubmit: handleFilterSubmit,
102
155
  filterGroups
103
156
  });
104
- }, [actionBarProps, initialFilterValues, onFilterSubmit, filterGroups]);
105
-
106
- // Extract the original tableProps.onSortChange from rest
107
- const {
108
- tableProps
109
- } = rest,
110
- otherRest = _objectWithoutProperties(rest, _excluded2);
111
- const onSortChangeExternal = tableProps?.onSortChange;
157
+ }, [actionBarProps, initialFilterValues, handleFilterSubmit, filterGroups]);
112
158
 
113
159
  // Create a wrapper function that calls both. The wrapper function should follow the signature of onSortChange from RAC
114
160
  const handleSortChange = React.useCallback(({
@@ -121,7 +167,7 @@ const MetadataViewContainer = _ref => {
121
167
  const trimmedColumn = trimMetadataFieldPrefix(String(column));
122
168
  onSortChangeInternal(trimmedColumn, direction === 'ascending' ? 'ASC' : 'DESC');
123
169
  }
124
-
170
+ const onSortChangeExternal = tableProps?.onSortChange;
125
171
  // Then call the original customer-provided onSortChange if it exists
126
172
  // Accepts "ascending" / "descending" (https://react-spectrum.adobe.com/react-aria/Table.html)
127
173
  if (onSortChangeExternal) {
@@ -130,7 +176,7 @@ const MetadataViewContainer = _ref => {
130
176
  direction
131
177
  });
132
178
  }
133
- }, [onSortChangeInternal, onSortChangeExternal]);
179
+ }, [onSortChangeInternal, tableProps]);
134
180
 
135
181
  // Create new tableProps with our wrapper function
136
182
  const newTableProps = _objectSpread(_objectSpread({}, tableProps), {}, {
@@ -138,10 +184,10 @@ const MetadataViewContainer = _ref => {
138
184
  });
139
185
  return /*#__PURE__*/React.createElement(MetadataView, _extends({
140
186
  actionBarProps: transformedActionBarProps,
141
- columns: columns,
187
+ columns: newColumns,
142
188
  items: items,
143
189
  tableProps: newTableProps
144
- }, otherRest));
190
+ }, rest));
145
191
  };
146
192
  export default MetadataViewContainer;
147
193
  //# sourceMappingURL=MetadataViewContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataViewContainer.js","names":["React","MetadataView","trimMetadataFieldPrefix","column","startsWith","split","length","parts","slice","join","transformInitialFilterValuesToInternal","publicValues","undefined","Object","entries","reduce","acc","key","value","Array","isArray","enum","transformInternalFieldsToPublic","fields","MetadataViewContainer","_ref","actionBarProps","columns","currentCollection","metadataTemplate","onSortChange","onSortChangeInternal","rest","_objectWithoutProperties","_excluded","items","initialFilterValues","initialFilterValuesProp","onFilterSubmit","onFilterSubmitProp","filterGroups","useMemo","toggleable","filters","map","field","id","name","displayName","fieldType","type","options","shouldRenderChip","useCallback","transformed","transformedActionBarProps","_objectSpread","tableProps","otherRest","_excluded2","onSortChangeExternal","handleSortChange","direction","trimmedColumn","String","newTableProps","createElement","_extends"],"sources":["../../../src/elements/content-explorer/MetadataViewContainer.tsx"],"sourcesContent":["import * as React from 'react';\nimport type { EnumType, FloatType, MetadataFormFieldValue, RangeType } from '@box/metadata-filter';\nimport { MetadataView, type MetadataViewProps } from '@box/metadata-view';\nimport { type Key } from '@react-types/shared';\n\nimport { SortDescriptor } from 'react-aria-components';\nimport type { Collection } from '../../common/types/core';\nimport type { MetadataTemplate } from '../../common/types/metadata';\n\n// Public-friendly version of MetadataFormFieldValue from @box/metadata-filter\n// (string[] for enum type, range/float objects stay the same)\ntype EnumToStringArray<T> = T extends EnumType ? string[] : T;\ntype ExternalMetadataFormFieldValue = EnumToStringArray<MetadataFormFieldValue>;\n\ntype ExternalFilterValues = Record<\n string,\n {\n value: ExternalMetadataFormFieldValue;\n }\n>;\n\ntype ActionBarProps = Omit<\n MetadataViewProps['actionBarProps'],\n 'initialFilterValues' | 'onFilterSubmit' | 'filterGroups'\n> & {\n initialFilterValues?: ExternalFilterValues;\n onFilterSubmit?: (filterValues: ExternalFilterValues) => void;\n};\n\n/**\n * Helper function to trim metadataFieldNamePrefix from column names\n * For example: 'metadata.enterprise_1515946.mdViewTemplate1.industry' -> 'industry'\n */\nfunction trimMetadataFieldPrefix(column: string): string {\n // Check if the column starts with 'metadata.' and contains at least 2 dots\n if (column.startsWith('metadata.') && column.split('.').length >= 3) {\n // Split by dots and take everything after the first 3 parts\n // metadata.enterprise_1515946.mdViewTemplate1.industry -> industry\n const parts = column.split('.');\n return parts.slice(3).join('.');\n }\n return column;\n}\n\nfunction transformInitialFilterValuesToInternal(\n publicValues?: ExternalFilterValues,\n): Record<string, { value: MetadataFormFieldValue }> | undefined {\n if (!publicValues) return undefined;\n\n return Object.entries(publicValues).reduce<Record<string, { value: MetadataFormFieldValue }>>(\n (acc, [key, { value }]) => {\n acc[key] = Array.isArray(value) ? { value: { enum: value } } : { value };\n return acc;\n },\n {},\n );\n}\n\nfunction transformInternalFieldsToPublic(\n fields: Record<string, { value: MetadataFormFieldValue }>,\n): ExternalFilterValues {\n return Object.entries(fields).reduce<ExternalFilterValues>((acc, [key, { value }]) => {\n acc[key] =\n 'enum' in value && Array.isArray(value.enum)\n ? { value: value.enum }\n : { value: value as RangeType | FloatType };\n return acc;\n }, {});\n}\n\nexport interface MetadataViewContainerProps extends Omit<MetadataViewProps, 'items' | 'actionBarProps'> {\n actionBarProps?: ActionBarProps;\n currentCollection: Collection;\n metadataTemplate: MetadataTemplate;\n /* Internally controlled onSortChange prop for the MetadataView component. */\n onSortChange?: (sortBy: Key, sortDirection: string) => void;\n}\n\nconst MetadataViewContainer = ({\n actionBarProps,\n columns,\n currentCollection,\n metadataTemplate,\n onSortChange: onSortChangeInternal,\n ...rest\n}: MetadataViewContainerProps) => {\n const { items = [] } = currentCollection;\n const { initialFilterValues: initialFilterValuesProp, onFilterSubmit: onFilterSubmitProp } = actionBarProps ?? {};\n\n const filterGroups = React.useMemo(\n () => [\n {\n toggleable: true,\n filters:\n metadataTemplate?.fields?.map(field => {\n return {\n id: `${field.key}-filter`,\n name: field.displayName,\n fieldType: field.type,\n options: field.options?.map(({ key }) => key) || [],\n shouldRenderChip: true,\n };\n }) || [],\n },\n ],\n [metadataTemplate],\n );\n\n // Transform initial filter values to internal field format\n const initialFilterValues = React.useMemo(\n () => transformInitialFilterValuesToInternal(initialFilterValuesProp),\n [initialFilterValuesProp],\n );\n\n // Transform field values to public-friendly format\n const onFilterSubmit = React.useCallback(\n (fields: Record<string, { value: MetadataFormFieldValue }>) => {\n if (!onFilterSubmitProp) return;\n const transformed = transformInternalFieldsToPublic(fields);\n onFilterSubmitProp(transformed);\n },\n [onFilterSubmitProp],\n );\n\n const transformedActionBarProps = React.useMemo(() => {\n return {\n ...actionBarProps,\n initialFilterValues,\n onFilterSubmit,\n filterGroups,\n };\n }, [actionBarProps, initialFilterValues, onFilterSubmit, filterGroups]);\n\n // Extract the original tableProps.onSortChange from rest\n const { tableProps, ...otherRest } = rest;\n const onSortChangeExternal = tableProps?.onSortChange;\n\n // Create a wrapper function that calls both. The wrapper function should follow the signature of onSortChange from RAC\n const handleSortChange = React.useCallback(\n ({ column, direction }: SortDescriptor) => {\n // Call the internal onSortChange first\n // API accepts asc/desc \"https://developer.box.com/reference/post-metadata-queries-execute-read/\"\n if (onSortChangeInternal) {\n const trimmedColumn = trimMetadataFieldPrefix(String(column));\n onSortChangeInternal(trimmedColumn, direction === 'ascending' ? 'ASC' : 'DESC');\n }\n\n // Then call the original customer-provided onSortChange if it exists\n // Accepts \"ascending\" / \"descending\" (https://react-spectrum.adobe.com/react-aria/Table.html)\n if (onSortChangeExternal) {\n onSortChangeExternal({\n column,\n direction,\n });\n }\n },\n [onSortChangeInternal, onSortChangeExternal],\n );\n\n // Create new tableProps with our wrapper function\n const newTableProps = {\n ...tableProps,\n onSortChange: handleSortChange,\n };\n\n return (\n <MetadataView\n actionBarProps={transformedActionBarProps}\n columns={columns}\n items={items}\n tableProps={newTableProps}\n {...otherRest}\n />\n );\n};\n\nexport default MetadataViewContainer;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MetadataViewContainer.js","names":["React","useIntl","MetadataView","cloneDeep","FIELD_ITEM_NAME","messages","ITEM_FILTER_NAME","trimMetadataFieldPrefix","column","startsWith","split","length","parts","slice","join","transformInitialFilterValuesToInternal","publicValues","undefined","Object","entries","reduce","acc","key","value","Array","isArray","enum","convertFilterValuesToExternal","fields","field","options","fieldType","transformedValue","transformInternalFieldsToPublic","MetadataViewContainer","_ref","actionBarProps","columns","currentCollection","metadataTemplate","onMetadataFilter","onSortChange","onSortChangeInternal","tableProps","rest","_objectWithoutProperties","_excluded","formatMessage","items","initialFilterValues","initialFilterValuesProp","onFilterSubmit","newColumns","useMemo","clonedColumns","hasItemNameField","some","col","id","allowsSorting","isItemMetadata","isRowHeader","minWidth","maxWidth","textValue","name","type","filterGroups","clonedTemplate","displayName","shouldRenderChip","toggleable","filters","map","handleFilterSubmit","useCallback","transformed","transformedActionBarProps","_objectSpread","handleSortChange","direction","trimmedColumn","String","onSortChangeExternal","newTableProps","createElement","_extends"],"sources":["../../../src/elements/content-explorer/MetadataViewContainer.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n EnumType,\n FloatType,\n MetadataFormFieldValue,\n MetadataTemplateFieldOption,\n RangeType,\n} from '@box/metadata-filter';\nimport {\n MetadataView,\n type FilterValues,\n type MetadataViewProps,\n type MetadataFieldType,\n type Column,\n} from '@box/metadata-view';\nimport { type Key } from '@react-types/shared';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { SortDescriptor } from 'react-aria-components';\nimport { FIELD_ITEM_NAME } from '../../constants';\nimport type { Collection } from '../../common/types/core';\nimport type { MetadataTemplate, MetadataTemplateField } from '../../common/types/metadata';\n\nimport messages from '../common/messages';\n\n// Public-friendly version of MetadataFormFieldValue from @box/metadata-filter\n// (string[] for enum type, range/float objects stay the same)\ntype EnumToStringArray<T> = T extends EnumType ? string[] : T;\ntype ExternalMetadataFormFieldValue = EnumToStringArray<MetadataFormFieldValue>;\n\nexport type ExternalFilterValues = Record<\n string,\n {\n options?: FilterValues[string]['options'] | MetadataTemplateFieldOption[];\n fieldType: FilterValues[string]['fieldType'] | MetadataFieldType;\n value: ExternalMetadataFormFieldValue;\n }\n>;\n\ntype ActionBarProps = Omit<\n MetadataViewProps['actionBarProps'],\n 'initialFilterValues' | 'onFilterSubmit' | 'filterGroups'\n> & {\n initialFilterValues?: ExternalFilterValues;\n onFilterSubmit?: (filterValues: ExternalFilterValues) => void;\n};\n\nconst ITEM_FILTER_NAME = 'item_name';\n\n/**\n * Helper function to trim metadataFieldNamePrefix from column names\n * For example: 'metadata.enterprise_1515946.mdViewTemplate1.industry' -> 'industry'\n */\nfunction trimMetadataFieldPrefix(column: string): string {\n // Check if the column starts with 'metadata.' and contains at least 2 dots\n if (column.startsWith('metadata.') && column.split('.').length >= 3) {\n // Split by dots and take everything after the first 3 parts\n // metadata.enterprise_1515946.mdViewTemplate1.industry -> industry\n const parts = column.split('.');\n return parts.slice(3).join('.');\n }\n return column;\n}\n\nfunction transformInitialFilterValuesToInternal(\n publicValues?: ExternalFilterValues,\n): Record<string, { value: MetadataFormFieldValue }> | undefined {\n if (!publicValues) return undefined;\n\n return Object.entries(publicValues).reduce<Record<string, { value: MetadataFormFieldValue }>>(\n (acc, [key, { value }]) => {\n acc[key] = Array.isArray(value) ? { value: { enum: value } } : { value };\n return acc;\n },\n {},\n );\n}\n\nexport function convertFilterValuesToExternal(fields: FilterValues): ExternalFilterValues {\n return Object.entries(fields).reduce<ExternalFilterValues>((acc, [key, field]) => {\n const { value, options, fieldType } = field;\n\n // Transform the value based on its type\n const transformedValue: ExternalMetadataFormFieldValue =\n 'enum' in value && Array.isArray(value.enum)\n ? value.enum // Convert enum type to string array\n : (value as RangeType | FloatType); // Keep range/float objects as-is\n\n acc[key === ITEM_FILTER_NAME ? FIELD_ITEM_NAME : key] = {\n options,\n fieldType,\n value: transformedValue,\n };\n\n return acc;\n }, {});\n}\n\n// Internal helper function for component use\nfunction transformInternalFieldsToPublic(fields: FilterValues): ExternalFilterValues {\n return convertFilterValuesToExternal(fields);\n}\n\nexport interface MetadataViewContainerProps extends Omit<MetadataViewProps, 'items' | 'actionBarProps'> {\n actionBarProps?: ActionBarProps;\n currentCollection: Collection;\n metadataTemplate: MetadataTemplate;\n onMetadataFilter: (fields: ExternalFilterValues) => void;\n /* Internally controlled onSortChange prop for the MetadataView component. */\n onSortChange?: (sortBy: Key, sortDirection: string) => void;\n}\n\nconst MetadataViewContainer = ({\n actionBarProps,\n columns,\n currentCollection,\n metadataTemplate,\n onMetadataFilter,\n onSortChange: onSortChangeInternal,\n tableProps,\n ...rest\n}: MetadataViewContainerProps) => {\n const { formatMessage } = useIntl();\n const { items = [] } = currentCollection;\n const { initialFilterValues: initialFilterValuesProp, onFilterSubmit } = actionBarProps ?? {};\n\n const newColumns = React.useMemo(() => {\n let clonedColumns = cloneDeep(columns);\n\n const hasItemNameField = clonedColumns.some((col: Column) => col.id === FIELD_ITEM_NAME);\n\n if (!hasItemNameField) {\n clonedColumns = [\n {\n allowsSorting: true,\n id: FIELD_ITEM_NAME,\n isItemMetadata: true,\n isRowHeader: true,\n minWidth: 250,\n maxWidth: 250,\n textValue: formatMessage(messages.name),\n type: 'string',\n },\n ...clonedColumns,\n ];\n }\n\n return clonedColumns;\n }, [columns, formatMessage]);\n\n const filterGroups = React.useMemo(() => {\n const clonedTemplate = cloneDeep(metadataTemplate);\n let fields = clonedTemplate?.fields || [];\n\n // Check if item_name field already exists to avoid duplicates\n const hasItemNameField = fields.some((field: MetadataTemplateField) => field.key === ITEM_FILTER_NAME);\n\n if (!hasItemNameField) {\n fields = [\n {\n key: ITEM_FILTER_NAME,\n displayName: formatMessage(messages.name),\n type: 'string',\n shouldRenderChip: true,\n },\n ...fields,\n ];\n }\n\n return [\n {\n toggleable: true,\n filters:\n fields?.map(field => {\n return {\n id: field.key,\n name: field.displayName,\n fieldType: field.type,\n options: field.options?.map(({ key }) => key) || [],\n shouldRenderChip: true,\n };\n }) || [],\n },\n ];\n }, [formatMessage, metadataTemplate]);\n\n const initialFilterValues = React.useMemo(\n () => transformInitialFilterValuesToInternal(initialFilterValuesProp),\n [initialFilterValuesProp],\n );\n\n const handleFilterSubmit = React.useCallback(\n (fields: FilterValues) => {\n const transformed = transformInternalFieldsToPublic(fields);\n onMetadataFilter(transformed);\n if (onFilterSubmit) {\n onFilterSubmit(transformed);\n }\n },\n [onFilterSubmit, onMetadataFilter],\n );\n\n const transformedActionBarProps = React.useMemo(() => {\n return {\n ...actionBarProps,\n initialFilterValues,\n onFilterSubmit: handleFilterSubmit,\n filterGroups,\n };\n }, [actionBarProps, initialFilterValues, handleFilterSubmit, filterGroups]);\n\n // Create a wrapper function that calls both. The wrapper function should follow the signature of onSortChange from RAC\n const handleSortChange = React.useCallback(\n ({ column, direction }: SortDescriptor) => {\n // Call the internal onSortChange first\n // API accepts asc/desc \"https://developer.box.com/reference/post-metadata-queries-execute-read/\"\n if (onSortChangeInternal) {\n const trimmedColumn = trimMetadataFieldPrefix(String(column));\n onSortChangeInternal(trimmedColumn, direction === 'ascending' ? 'ASC' : 'DESC');\n }\n const onSortChangeExternal = tableProps?.onSortChange;\n // Then call the original customer-provided onSortChange if it exists\n // Accepts \"ascending\" / \"descending\" (https://react-spectrum.adobe.com/react-aria/Table.html)\n if (onSortChangeExternal) {\n onSortChangeExternal({\n column,\n direction,\n });\n }\n },\n [onSortChangeInternal, tableProps],\n );\n\n // Create new tableProps with our wrapper function\n const newTableProps = {\n ...tableProps,\n onSortChange: handleSortChange,\n };\n\n return (\n <MetadataView\n actionBarProps={transformedActionBarProps}\n columns={newColumns}\n items={items}\n tableProps={newTableProps}\n {...rest}\n />\n );\n};\n\nexport default MetadataViewContainer;\n"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,8 @@ import { FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO
2
2
  import { FOLDER_FIELDS_TO_FETCH } from '../../utils/fields';
3
3
 
4
4
  // Fields needed for Content Explorer folder requests
5
- const CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH = [...FOLDER_FIELDS_TO_FETCH, FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO];
6
- export default CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH;
5
+ export const CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH = [...FOLDER_FIELDS_TO_FETCH, FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO];
6
+ export const NON_FOLDER_FILE_TYPES_MAP = new Map([['boxnoteType', ['boxnote']], ['boxcanvasType', ['boxcanvas']], ['pdfType', ['pdf']], ['documentType', ['doc', 'docx', 'gdoc', 'rtf', 'txt']], ['spreadsheetType', ['xls', 'xlsx', 'xlsm', 'csv', 'gsheet']], ['presentationType', ['ppt', 'pptx', 'odp']], ['imageType', ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff']], ['audioType', ['mp3', 'm4a', 'm4p', 'wav', 'mid', 'wma']], ['videoType', ['mp4', 'mpeg', 'mpg', 'wmv', '3g2', '3gp', 'avi', 'm2v', 'm4v', 'mkv', 'mov', 'ogg', 'mts', 'qt', 'ts', 'flv', 'rm']], ['drawingType', ['dwg', 'dxf']], ['threedType', ['obj', 'fbx', 'stl', 'amf', 'iges']]]);
7
+ export const FILE_FOLDER_TYPES_MAP = new Map(NON_FOLDER_FILE_TYPES_MAP).set('folderType', ['folder']);
8
+ export const NON_FOLDER_FILE_TYPES = Array.from(NON_FOLDER_FILE_TYPES_MAP.keys());
7
9
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":["FIELD_FILE_VERSION","FIELD_SHA1","FIELD_SHARED_LINK","FIELD_WATERMARK_INFO","FOLDER_FIELDS_TO_FETCH","CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH"],"sources":["../../../src/elements/content-explorer/constants.ts"],"sourcesContent":["import { FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO } from '../../constants';\nimport { FOLDER_FIELDS_TO_FETCH } from '../../utils/fields';\n\n// Fields needed for Content Explorer folder requests\nconst CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH = [\n ...FOLDER_FIELDS_TO_FETCH,\n FIELD_FILE_VERSION,\n FIELD_SHA1,\n FIELD_SHARED_LINK,\n FIELD_WATERMARK_INFO,\n];\n\nexport default CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH;\n"],"mappings":"AAAA,SAASA,kBAAkB,EAAEC,UAAU,EAAEC,iBAAiB,EAAEC,oBAAoB,QAAQ,iBAAiB;AACzG,SAASC,sBAAsB,QAAQ,oBAAoB;;AAE3D;AACA,MAAMC,uCAAuC,GAAG,CAC5C,GAAGD,sBAAsB,EACzBJ,kBAAkB,EAClBC,UAAU,EACVC,iBAAiB,EACjBC,oBAAoB,CACvB;AAED,eAAeE,uCAAuC","ignoreList":[]}
1
+ {"version":3,"file":"constants.js","names":["FIELD_FILE_VERSION","FIELD_SHA1","FIELD_SHARED_LINK","FIELD_WATERMARK_INFO","FOLDER_FIELDS_TO_FETCH","CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH","NON_FOLDER_FILE_TYPES_MAP","Map","FILE_FOLDER_TYPES_MAP","set","NON_FOLDER_FILE_TYPES","Array","from","keys"],"sources":["../../../src/elements/content-explorer/constants.ts"],"sourcesContent":["import { FIELD_FILE_VERSION, FIELD_SHA1, FIELD_SHARED_LINK, FIELD_WATERMARK_INFO } from '../../constants';\nimport { FOLDER_FIELDS_TO_FETCH } from '../../utils/fields';\n\n// Fields needed for Content Explorer folder requests\nexport const CONTENT_EXPLORER_FOLDER_FIELDS_TO_FETCH = [\n ...FOLDER_FIELDS_TO_FETCH,\n FIELD_FILE_VERSION,\n FIELD_SHA1,\n FIELD_SHARED_LINK,\n FIELD_WATERMARK_INFO,\n];\n\nexport const NON_FOLDER_FILE_TYPES_MAP = new Map([\n ['boxnoteType', ['boxnote']],\n ['boxcanvasType', ['boxcanvas']],\n ['pdfType', ['pdf']],\n ['documentType', ['doc', 'docx', 'gdoc', 'rtf', 'txt']],\n ['spreadsheetType', ['xls', 'xlsx', 'xlsm', 'csv', 'gsheet']],\n ['presentationType', ['ppt', 'pptx', 'odp']],\n ['imageType', ['png', 'jpg', 'jpeg', 'gif', 'bmp', 'tif', 'tiff']],\n ['audioType', ['mp3', 'm4a', 'm4p', 'wav', 'mid', 'wma']],\n [\n 'videoType',\n [\n 'mp4',\n 'mpeg',\n 'mpg',\n 'wmv',\n '3g2',\n '3gp',\n 'avi',\n 'm2v',\n 'm4v',\n 'mkv',\n 'mov',\n 'ogg',\n 'mts',\n 'qt',\n 'ts',\n 'flv',\n 'rm',\n ],\n ],\n ['drawingType', ['dwg', 'dxf']],\n ['threedType', ['obj', 'fbx', 'stl', 'amf', 'iges']],\n]);\n\nexport const FILE_FOLDER_TYPES_MAP = new Map(NON_FOLDER_FILE_TYPES_MAP).set('folderType', ['folder']);\n\nexport const NON_FOLDER_FILE_TYPES = Array.from(NON_FOLDER_FILE_TYPES_MAP.keys());\n"],"mappings":"AAAA,SAASA,kBAAkB,EAAEC,UAAU,EAAEC,iBAAiB,EAAEC,oBAAoB,QAAQ,iBAAiB;AACzG,SAASC,sBAAsB,QAAQ,oBAAoB;;AAE3D;AACA,OAAO,MAAMC,uCAAuC,GAAG,CACnD,GAAGD,sBAAsB,EACzBJ,kBAAkB,EAClBC,UAAU,EACVC,iBAAiB,EACjBC,oBAAoB,CACvB;AAED,OAAO,MAAMG,yBAAyB,GAAG,IAAIC,GAAG,CAAC,CAC7C,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,EAC5B,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,CAAC,EAChC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC,EACpB,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EACvD,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,EAC7D,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,EAC5C,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAClE,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EACzD,CACI,WAAW,EACX,CACI,KAAK,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,IAAI,CACP,CACJ,EACD,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAC/B,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CACvD,CAAC;AAEF,OAAO,MAAMC,qBAAqB,GAAG,IAAID,GAAG,CAACD,yBAAyB,CAAC,CAACG,GAAG,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;AAErG,OAAO,MAAMC,qBAAqB,GAAGC,KAAK,CAACC,IAAI,CAACN,yBAAyB,CAACO,IAAI,CAAC,CAAC,CAAC","ignoreList":[]}
@@ -18,36 +18,14 @@ const metadataQuery = {
18
18
  // query_params: { arg1: 'value' },
19
19
 
20
20
  ancestor_folder_id: '0',
21
- fields: [`name`, `${metadataSourceFieldName}.industry`, `${metadataSourceFieldName}.last_contacted_at`, `${metadataSourceFieldName}.role`]
21
+ fields: [`${metadataSourceFieldName}.industry`, `${metadataSourceFieldName}.last_contacted_at`, `${metadataSourceFieldName}.role`, `${metadataSourceFieldName}.number`]
22
22
  };
23
- const fieldsToShow = [{
24
- key: `name`
25
- }, {
26
- key: `${metadataSourceFieldName}.industry`,
27
- canEdit: true
28
- }, {
29
- key: `${metadataSourceFieldName}.last_contacted_at`,
30
- canEdit: true
31
- }, {
32
- key: `${metadataSourceFieldName}.role`,
33
- canEdit: true
34
- }];
35
23
  const columns = mockSchema.fields.map(field => {
36
- if (field.key === 'name') {
37
- return {
38
- textValue: field.displayName,
39
- id: 'name',
40
- type: 'string',
41
- allowsSorting: true,
42
- minWidth: 250,
43
- maxWidth: 250,
44
- isRowHeader: true
45
- };
46
- }
47
24
  if (field.type === 'date') {
48
25
  return {
49
26
  textValue: field.displayName,
50
27
  id: `${metadataSourceFieldName}.${field.key}`,
28
+ key: `${metadataSourceFieldName}.${field.key}`,
51
29
  type: field.type,
52
30
  allowsSorting: true,
53
31
  minWidth: 200,
@@ -61,6 +39,7 @@ const columns = mockSchema.fields.map(field => {
61
39
  return {
62
40
  textValue: field.displayName,
63
41
  id: `${metadataSourceFieldName}.${field.key}`,
42
+ key: `${metadataSourceFieldName}.${field.key}`,
64
43
  type: field.type,
65
44
  allowsSorting: true,
66
45
  minWidth: 200,
@@ -78,7 +57,6 @@ export const metadataView = {
78
57
  }
79
58
  },
80
59
  metadataQuery,
81
- fieldsToShow,
82
60
  defaultView,
83
61
  features: {
84
62
  contentExplorer: {
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataView.stories.js","names":["React","get","http","HttpResponse","ContentExplorer","DEFAULT_HOSTNAME_API","mockMetadata","mockSchema","mockRootFolder","EID","templateName","metadataSource","metadataSourceFieldName","metadataQuery","from","ancestor_folder_id","fields","fieldsToShow","key","canEdit","columns","map","field","textValue","displayName","id","type","allowsSorting","minWidth","maxWidth","isRowHeader","cellRenderer","item","column","dateValue","Date","toLocaleDateString","defaultView","metadataView","args","metadataViewProps","tableProps","isSelectAllEnabled","features","contentExplorer","metadataViewV2","render","createElement","style","padding","border","height","meta","title","component","global","FEATURE_FLAGS","rootFolderId","FOLDER_ID","token","TOKEN","parameters","msw","handlers","post","json"],"sources":["../../../../src/elements/content-explorer/stories/MetadataView.stories.tsx"],"sourcesContent":["import React from 'react';\nimport get from 'lodash/get';\nimport { http, HttpResponse } from 'msw';\nimport type { Meta, StoryObj } from '@storybook/react';\nimport ContentExplorer from '../ContentExplorer';\nimport { DEFAULT_HOSTNAME_API } from '../../../constants';\nimport { mockMetadata, mockSchema } from '../../common/__mocks__/mockMetadata';\nimport { mockRootFolder } from '../../common/__mocks__/mockRootFolder';\n\nconst EID = '0';\nconst templateName = 'templateName';\nconst metadataSource = `enterprise_${EID}.${templateName}`;\nconst metadataSourceFieldName = `metadata.${metadataSource}`;\n\nconst metadataQuery = {\n from: metadataSource,\n\n // // Filter items in the folder by existing metadata key\n // query: 'key = :arg1',\n //\n // // Display items with value\n // query_params: { arg1: 'value' },\n\n ancestor_folder_id: '0',\n fields: [\n `name`,\n `${metadataSourceFieldName}.industry`,\n `${metadataSourceFieldName}.last_contacted_at`,\n `${metadataSourceFieldName}.role`,\n ],\n};\n\nconst fieldsToShow = [\n { key: `name` },\n { key: `${metadataSourceFieldName}.industry`, canEdit: true },\n { key: `${metadataSourceFieldName}.last_contacted_at`, canEdit: true },\n { key: `${metadataSourceFieldName}.role`, canEdit: true },\n];\n\nconst columns = mockSchema.fields.map(field => {\n if (field.key === 'name') {\n return {\n textValue: field.displayName,\n id: 'name',\n type: 'string',\n allowsSorting: true,\n minWidth: 250,\n maxWidth: 250,\n isRowHeader: true,\n };\n }\n\n if (field.type === 'date') {\n return {\n textValue: field.displayName,\n id: `${metadataSourceFieldName}.${field.key}`,\n type: field.type,\n allowsSorting: true,\n minWidth: 200,\n maxWidth: 200,\n cellRenderer: (item, column) => {\n const dateValue = get(item, column.id);\n return dateValue ? new Date(dateValue).toLocaleDateString() : '';\n },\n };\n }\n\n return {\n textValue: field.displayName,\n id: `${metadataSourceFieldName}.${field.key}`,\n type: field.type,\n allowsSorting: true,\n minWidth: 200,\n maxWidth: 200,\n };\n});\nconst defaultView = 'metadata'; // Required prop to paint the metadata view. If not provided, you'll get regular folder view.\n\ntype Story = StoryObj<typeof ContentExplorer>;\n\nexport const metadataView: Story = {\n args: {\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n },\n metadataQuery,\n fieldsToShow,\n defaultView,\n features: {\n contentExplorer: {\n metadataViewV2: true,\n },\n },\n },\n render: args => {\n return (\n <div style={{ padding: '50px', border: '1px solid #ccc', height: '500px' }}>\n <ContentExplorer {...args} />\n </div>\n );\n },\n};\n\nconst meta: Meta<typeof ContentExplorer> = {\n title: 'Elements/ContentExplorer/MetadataView',\n component: ContentExplorer,\n args: {\n features: global.FEATURE_FLAGS,\n rootFolderId: global.FOLDER_ID,\n token: global.TOKEN,\n },\n parameters: {\n msw: {\n handlers: [\n http.post(`${DEFAULT_HOSTNAME_API}/2.0/metadata_queries/execute_read`, () => {\n return HttpResponse.json(mockMetadata);\n }),\n http.get(`${DEFAULT_HOSTNAME_API}/2.0/metadata_templates/enterprise/templateName/schema`, () => {\n return HttpResponse.json(mockSchema);\n }),\n http.get(`${DEFAULT_HOSTNAME_API}/2.0/folders/:id`, () => {\n return HttpResponse.json(mockRootFolder);\n }),\n ],\n },\n },\n};\n\nexport default meta;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,GAAG,MAAM,YAAY;AAC5B,SAASC,IAAI,EAAEC,YAAY,QAAQ,KAAK;AAExC,OAAOC,eAAe,MAAM,oBAAoB;AAChD,SAASC,oBAAoB,QAAQ,oBAAoB;AACzD,SAASC,YAAY,EAAEC,UAAU,QAAQ,qCAAqC;AAC9E,SAASC,cAAc,QAAQ,uCAAuC;AAEtE,MAAMC,GAAG,GAAG,GAAG;AACf,MAAMC,YAAY,GAAG,cAAc;AACnC,MAAMC,cAAc,GAAG,cAAcF,GAAG,IAAIC,YAAY,EAAE;AAC1D,MAAME,uBAAuB,GAAG,YAAYD,cAAc,EAAE;AAE5D,MAAME,aAAa,GAAG;EAClBC,IAAI,EAAEH,cAAc;EAEpB;EACA;EACA;EACA;EACA;;EAEAI,kBAAkB,EAAE,GAAG;EACvBC,MAAM,EAAE,CACJ,MAAM,EACN,GAAGJ,uBAAuB,WAAW,EACrC,GAAGA,uBAAuB,oBAAoB,EAC9C,GAAGA,uBAAuB,OAAO;AAEzC,CAAC;AAED,MAAMK,YAAY,GAAG,CACjB;EAAEC,GAAG,EAAE;AAAO,CAAC,EACf;EAAEA,GAAG,EAAE,GAAGN,uBAAuB,WAAW;EAAEO,OAAO,EAAE;AAAK,CAAC,EAC7D;EAAED,GAAG,EAAE,GAAGN,uBAAuB,oBAAoB;EAAEO,OAAO,EAAE;AAAK,CAAC,EACtE;EAAED,GAAG,EAAE,GAAGN,uBAAuB,OAAO;EAAEO,OAAO,EAAE;AAAK,CAAC,CAC5D;AAED,MAAMC,OAAO,GAAGb,UAAU,CAACS,MAAM,CAACK,GAAG,CAACC,KAAK,IAAI;EAC3C,IAAIA,KAAK,CAACJ,GAAG,KAAK,MAAM,EAAE;IACtB,OAAO;MACHK,SAAS,EAAED,KAAK,CAACE,WAAW;MAC5BC,EAAE,EAAE,MAAM;MACVC,IAAI,EAAE,QAAQ;MACdC,aAAa,EAAE,IAAI;MACnBC,QAAQ,EAAE,GAAG;MACbC,QAAQ,EAAE,GAAG;MACbC,WAAW,EAAE;IACjB,CAAC;EACL;EAEA,IAAIR,KAAK,CAACI,IAAI,KAAK,MAAM,EAAE;IACvB,OAAO;MACHH,SAAS,EAAED,KAAK,CAACE,WAAW;MAC5BC,EAAE,EAAE,GAAGb,uBAAuB,IAAIU,KAAK,CAACJ,GAAG,EAAE;MAC7CQ,IAAI,EAAEJ,KAAK,CAACI,IAAI;MAChBC,aAAa,EAAE,IAAI;MACnBC,QAAQ,EAAE,GAAG;MACbC,QAAQ,EAAE,GAAG;MACbE,YAAY,EAAEA,CAACC,IAAI,EAAEC,MAAM,KAAK;QAC5B,MAAMC,SAAS,GAAGjC,GAAG,CAAC+B,IAAI,EAAEC,MAAM,CAACR,EAAE,CAAC;QACtC,OAAOS,SAAS,GAAG,IAAIC,IAAI,CAACD,SAAS,CAAC,CAACE,kBAAkB,CAAC,CAAC,GAAG,EAAE;MACpE;IACJ,CAAC;EACL;EAEA,OAAO;IACHb,SAAS,EAAED,KAAK,CAACE,WAAW;IAC5BC,EAAE,EAAE,GAAGb,uBAAuB,IAAIU,KAAK,CAACJ,GAAG,EAAE;IAC7CQ,IAAI,EAAEJ,KAAK,CAACI,IAAI;IAChBC,aAAa,EAAE,IAAI;IACnBC,QAAQ,EAAE,GAAG;IACbC,QAAQ,EAAE;EACd,CAAC;AACL,CAAC,CAAC;AACF,MAAMQ,WAAW,GAAG,UAAU,CAAC,CAAC;;AAIhC,OAAO,MAAMC,YAAmB,GAAG;EAC/BC,IAAI,EAAE;IACFC,iBAAiB,EAAE;MACfpB,OAAO;MACPqB,UAAU,EAAE;QACRC,kBAAkB,EAAE;MACxB;IACJ,CAAC;IACD7B,aAAa;IACbI,YAAY;IACZoB,WAAW;IACXM,QAAQ,EAAE;MACNC,eAAe,EAAE;QACbC,cAAc,EAAE;MACpB;IACJ;EACJ,CAAC;EACDC,MAAM,EAAEP,IAAI,IAAI;IACZ,oBACIvC,KAAA,CAAA+C,aAAA;MAAKC,KAAK,EAAE;QAAEC,OAAO,EAAE,MAAM;QAAEC,MAAM,EAAE,gBAAgB;QAAEC,MAAM,EAAE;MAAQ;IAAE,gBACvEnD,KAAA,CAAA+C,aAAA,CAAC3C,eAAe,EAAKmC,IAAO,CAC3B,CAAC;EAEd;AACJ,CAAC;AAED,MAAMa,IAAkC,GAAG;EACvCC,KAAK,EAAE,uCAAuC;EAC9CC,SAAS,EAAElD,eAAe;EAC1BmC,IAAI,EAAE;IACFI,QAAQ,EAAEY,MAAM,CAACC,aAAa;IAC9BC,YAAY,EAAEF,MAAM,CAACG,SAAS;IAC9BC,KAAK,EAAEJ,MAAM,CAACK;EAClB,CAAC;EACDC,UAAU,EAAE;IACRC,GAAG,EAAE;MACDC,QAAQ,EAAE,CACN7D,IAAI,CAAC8D,IAAI,CAAC,GAAG3D,oBAAoB,oCAAoC,EAAE,MAAM;QACzE,OAAOF,YAAY,CAAC8D,IAAI,CAAC3D,YAAY,CAAC;MAC1C,CAAC,CAAC,EACFJ,IAAI,CAACD,GAAG,CAAC,GAAGI,oBAAoB,wDAAwD,EAAE,MAAM;QAC5F,OAAOF,YAAY,CAAC8D,IAAI,CAAC1D,UAAU,CAAC;MACxC,CAAC,CAAC,EACFL,IAAI,CAACD,GAAG,CAAC,GAAGI,oBAAoB,kBAAkB,EAAE,MAAM;QACtD,OAAOF,YAAY,CAAC8D,IAAI,CAACzD,cAAc,CAAC;MAC5C,CAAC,CAAC;IAEV;EACJ;AACJ,CAAC;AAED,eAAe4C,IAAI","ignoreList":[]}
1
+ {"version":3,"file":"MetadataView.stories.js","names":["React","get","http","HttpResponse","ContentExplorer","DEFAULT_HOSTNAME_API","mockMetadata","mockSchema","mockRootFolder","EID","templateName","metadataSource","metadataSourceFieldName","metadataQuery","from","ancestor_folder_id","fields","columns","map","field","type","textValue","displayName","id","key","allowsSorting","minWidth","maxWidth","cellRenderer","item","column","dateValue","Date","toLocaleDateString","defaultView","metadataView","args","metadataViewProps","tableProps","isSelectAllEnabled","features","contentExplorer","metadataViewV2","render","createElement","style","padding","border","height","meta","title","component","global","FEATURE_FLAGS","rootFolderId","FOLDER_ID","token","TOKEN","parameters","msw","handlers","post","json"],"sources":["../../../../src/elements/content-explorer/stories/MetadataView.stories.tsx"],"sourcesContent":["import React from 'react';\nimport get from 'lodash/get';\nimport { http, HttpResponse } from 'msw';\nimport type { Meta, StoryObj } from '@storybook/react';\nimport ContentExplorer from '../ContentExplorer';\nimport { DEFAULT_HOSTNAME_API } from '../../../constants';\nimport { mockMetadata, mockSchema } from '../../common/__mocks__/mockMetadata';\nimport { mockRootFolder } from '../../common/__mocks__/mockRootFolder';\n\nconst EID = '0';\nconst templateName = 'templateName';\nconst metadataSource = `enterprise_${EID}.${templateName}`;\nconst metadataSourceFieldName = `metadata.${metadataSource}`;\n\nconst metadataQuery = {\n from: metadataSource,\n\n // // Filter items in the folder by existing metadata key\n // query: 'key = :arg1',\n //\n // // Display items with value\n // query_params: { arg1: 'value' },\n\n ancestor_folder_id: '0',\n fields: [\n `${metadataSourceFieldName}.industry`,\n `${metadataSourceFieldName}.last_contacted_at`,\n `${metadataSourceFieldName}.role`,\n `${metadataSourceFieldName}.number`,\n ],\n};\n\nconst columns = mockSchema.fields.map(field => {\n if (field.type === 'date') {\n return {\n textValue: field.displayName,\n id: `${metadataSourceFieldName}.${field.key}`,\n key: `${metadataSourceFieldName}.${field.key}`,\n type: field.type,\n allowsSorting: true,\n minWidth: 200,\n maxWidth: 200,\n cellRenderer: (item, column) => {\n const dateValue = get(item, column.id);\n return dateValue ? new Date(dateValue).toLocaleDateString() : '';\n },\n };\n }\n\n return {\n textValue: field.displayName,\n id: `${metadataSourceFieldName}.${field.key}`,\n key: `${metadataSourceFieldName}.${field.key}`,\n type: field.type,\n allowsSorting: true,\n minWidth: 200,\n maxWidth: 200,\n };\n});\nconst defaultView = 'metadata'; // Required prop to paint the metadata view. If not provided, you'll get regular folder view.\n\ntype Story = StoryObj<typeof ContentExplorer>;\n\nexport const metadataView: Story = {\n args: {\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n },\n metadataQuery,\n defaultView,\n features: {\n contentExplorer: {\n metadataViewV2: true,\n },\n },\n },\n render: args => {\n return (\n <div style={{ padding: '50px', border: '1px solid #ccc', height: '500px' }}>\n <ContentExplorer {...args} />\n </div>\n );\n },\n};\n\nconst meta: Meta<typeof ContentExplorer> = {\n title: 'Elements/ContentExplorer/MetadataView',\n component: ContentExplorer,\n args: {\n features: global.FEATURE_FLAGS,\n rootFolderId: global.FOLDER_ID,\n token: global.TOKEN,\n },\n parameters: {\n msw: {\n handlers: [\n http.post(`${DEFAULT_HOSTNAME_API}/2.0/metadata_queries/execute_read`, () => {\n return HttpResponse.json(mockMetadata);\n }),\n http.get(`${DEFAULT_HOSTNAME_API}/2.0/metadata_templates/enterprise/templateName/schema`, () => {\n return HttpResponse.json(mockSchema);\n }),\n http.get(`${DEFAULT_HOSTNAME_API}/2.0/folders/:id`, () => {\n return HttpResponse.json(mockRootFolder);\n }),\n ],\n },\n },\n};\n\nexport default meta;\n"],"mappings":"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","ignoreList":[]}
@@ -34,15 +34,11 @@ const metadataQuery = {
34
34
  }],
35
35
  fields: [
36
36
  // Default to returning all fields in the metadata template schema, and name as a standalone (non-metadata) field
37
- ...mockSchema.fields.map(field => `${metadataFieldNamePrefix}.${field.key}`), 'name']
37
+ ...mockSchema.fields.map(field => `${metadataFieldNamePrefix}.${field.key}`)]
38
38
  };
39
39
 
40
40
  // Used for metadata view v1
41
41
  const fieldsToShow = [{
42
- key: `${metadataFieldNamePrefix}.name`,
43
- canEdit: false,
44
- displayName: 'Alias'
45
- }, {
46
42
  key: `${metadataFieldNamePrefix}.industry`,
47
43
  canEdit: true
48
44
  }, {
@@ -54,15 +50,7 @@ const fieldsToShow = [{
54
50
  }];
55
51
 
56
52
  // Used for metadata view v2
57
- const columns = [{
58
- // Always include the name column
59
- textValue: 'Name',
60
- id: 'name',
61
- type: 'string',
62
- allowsSorting: true,
63
- minWidth: 150,
64
- maxWidth: 150
65
- }, ...mockSchema.fields.map(field => ({
53
+ const columns = [...mockSchema.fields.map(field => ({
66
54
  textValue: field.displayName,
67
55
  id: `${metadataFieldNamePrefix}.${field.key}`,
68
56
  type: field.type,
@@ -169,13 +157,13 @@ export const metadataViewV2WithCustomActions = {
169
157
  };
170
158
  const initialFilterActionBarProps = {
171
159
  initialFilterValues: {
172
- 'industry-filter': {
160
+ industry: {
173
161
  value: ['Legal']
174
162
  },
175
163
  'mimetype-filter': {
176
164
  value: ['boxnoteType', 'documentType', 'threedType']
177
165
  },
178
- 'role-filter': {
166
+ role: {
179
167
  value: ['Developer', 'Business Owner', 'Marketing']
180
168
  }
181
169
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataView-visual.stories.js","names":["http","HttpResponse","Download","SignMeOthers","Sign","expect","fn","userEvent","waitFor","within","screen","noop","orderBy","ContentExplorer","DEFAULT_HOSTNAME_API","mockMetadata","mockSchema","mockRootFolder","scope","templateScope","templateKey","metadataScopeAndKey","metadataFieldNamePrefix","metadataQuery","from","ancestor_folder_id","order_by","field_key","fields","key","direction","map","field","fieldsToShow","canEdit","displayName","columns","textValue","id","type","allowsSorting","minWidth","maxWidth","defaultView","metadataView","args","metadataViewV2ElementProps","metadataViewProps","features","contentExplorer","metadataViewV2","metadataViewV2WithInlineCustomActionsElementProps","_objectSpread","tableProps","isSelectAllEnabled","itemActionMenuProps","actions","label","onClick","icon","subMenuTrigger","subMenuActions","metadataViewV2WithBulkItemActions","bulkItemActions","metadataViewV2SortsFromHeader","play","canvas","industryHeader","findByRole","name","toBeInTheDocument","firstRow","click","metadataViewV2WithCustomActions","getByRole","ellipsesButton","initialFilterActionBarProps","initialFilterValues","value","metadataViewV2WithInitialFilterValues","actionBarProps","toHaveTextContent","contactRoleChip","fileTypeChip","sidePanelOpenWithSingleItemSelected","checkbox","metadataButton","metadataViewV2WithBulkItemActionMenuShowsItemActionMenu","ellipsisButton","downloadAction","sidePanelOpenWithMultipleItemsSelected","firstItem","secondItem","getAllByRole","secondCheckbox","meta","title","component","global","FEATURE_FLAGS","rootFolderId","FOLDER_ID","token","TOKEN","parameters","msw","handlers","post","request","body","clone","json","orderByDirection","orderByFieldKey","sortedMetadata","entries","get"],"sources":["../../../../../src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from '@storybook/react';\nimport { http, HttpResponse } from 'msw';\nimport { Download, SignMeOthers } from '@box/blueprint-web-assets/icons/Fill/index';\nimport { Sign } from '@box/blueprint-web-assets/icons/Line';\nimport { expect, fn, userEvent, waitFor, within, screen } from 'storybook/test';\n\nimport noop from 'lodash/noop';\nimport orderBy from 'lodash/orderBy';\n\nimport ContentExplorer from '../../ContentExplorer';\nimport { DEFAULT_HOSTNAME_API } from '../../../../constants';\nimport { mockMetadata, mockSchema } from '../../../common/__mocks__/mockMetadata';\nimport { mockRootFolder } from '../../../common/__mocks__/mockRootFolder';\n\n// 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.\nconst { scope: templateScope, templateKey } = mockSchema;\n\nconst metadataScopeAndKey = `${templateScope}.${templateKey}`;\nconst metadataFieldNamePrefix = `metadata.${metadataScopeAndKey}`;\n\n// This is the body of the metadata query API call.\n// https://developer.box.com/guides/metadata/queries/syntax/\nconst metadataQuery = {\n from: metadataScopeAndKey,\n ancestor_folder_id: '0',\n order_by: [\n {\n field_key: `${metadataFieldNamePrefix}.${mockSchema.fields[0].key}`, // Default to sorting by the first field in the schema\n direction: 'asc',\n },\n ],\n fields: [\n // Default to returning all fields in the metadata template schema, and name as a standalone (non-metadata) field\n ...mockSchema.fields.map(field => `${metadataFieldNamePrefix}.${field.key}`),\n 'name',\n ],\n};\n\n// Used for metadata view v1\nconst fieldsToShow = [\n { key: `${metadataFieldNamePrefix}.name`, canEdit: false, displayName: 'Alias' },\n { key: `${metadataFieldNamePrefix}.industry`, canEdit: true },\n { key: `${metadataFieldNamePrefix}.last_contacted_at`, canEdit: true },\n { key: `${metadataFieldNamePrefix}.role`, canEdit: true },\n];\n\n// Used for metadata view v2\nconst columns = [\n {\n // Always include the name column\n textValue: 'Name',\n id: 'name',\n type: 'string',\n allowsSorting: true,\n minWidth: 150,\n maxWidth: 150,\n },\n ...mockSchema.fields.map(field => ({\n textValue: field.displayName,\n id: `${metadataFieldNamePrefix}.${field.key}`,\n type: field.type,\n allowsSorting: true,\n minWidth: 150,\n maxWidth: 150,\n })),\n];\n\n// Switches ContentExplorer to use Metadata View over standard, folder-based view.\nconst defaultView = 'metadata';\n\nexport const metadataView: Story = {\n args: {\n metadataQuery,\n fieldsToShow,\n defaultView,\n },\n};\n\nconst metadataViewV2ElementProps = {\n metadataViewProps: {\n columns,\n },\n metadataQuery,\n fieldsToShow,\n defaultView,\n features: {\n contentExplorer: {\n metadataViewV2: true,\n },\n },\n};\n\nconst metadataViewV2WithInlineCustomActionsElementProps = {\n ...metadataViewV2ElementProps,\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n itemActionMenuProps: {\n actions: [\n {\n label: 'Download',\n onClick: noop,\n icon: Download,\n },\n ],\n subMenuTrigger: {\n label: 'Sign',\n icon: Sign,\n },\n subMenuActions: [\n {\n label: 'Request Signature',\n onClick: noop,\n icon: SignMeOthers,\n },\n ],\n },\n },\n};\n\nconst metadataViewV2WithBulkItemActions = {\n ...metadataViewV2ElementProps,\n bulkItemActions: [\n {\n label: 'Download',\n onClick: fn(),\n },\n ],\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n },\n};\n\nexport const metadataViewV2: Story = {\n args: metadataViewV2ElementProps,\n};\n\nexport const metadataViewV2SortsFromHeader: Story = {\n args: metadataViewV2ElementProps,\n play: async ({ canvas }) => {\n const industryHeader = await canvas.findByRole('columnheader', { name: 'Industry' });\n expect(industryHeader).toBeInTheDocument();\n\n const firstRow = await canvas.findByRole('row', { name: /Child 2/i });\n expect(firstRow).toBeInTheDocument();\n\n await userEvent.click(industryHeader);\n },\n};\n\nexport const metadataViewV2WithCustomActions: Story = {\n args: metadataViewV2WithInlineCustomActionsElementProps,\n play: async ({ canvas }) => {\n await waitFor(() => {\n expect(canvas.getByRole('row', { name: /Child 2/i })).toBeInTheDocument();\n });\n const firstRow = canvas.getByRole('row', { name: /Child 2/i });\n const ellipsesButton = within(firstRow).getByRole('button', { name: 'Action menu' });\n userEvent.click(ellipsesButton);\n },\n};\n\nconst initialFilterActionBarProps = {\n initialFilterValues: {\n 'industry-filter': { value: ['Legal'] },\n 'mimetype-filter': { value: ['boxnoteType', 'documentType', 'threedType'] },\n 'role-filter': { value: ['Developer', 'Business Owner', 'Marketing'] },\n },\n};\n\nexport const metadataViewV2WithInitialFilterValues: Story = {\n args: {\n ...metadataViewV2ElementProps,\n metadataViewProps: {\n columns,\n actionBarProps: initialFilterActionBarProps,\n },\n },\n play: async ({ canvas }) => {\n // Wait for chips to update with initial values\n await waitFor(() => {\n expect(canvas.getByRole('button', { name: /Industry/i })).toHaveTextContent(/\\(1\\)/);\n });\n // Other chips should reflect initialized values\n const contactRoleChip = canvas.getByRole('button', { name: /Contact Role/i });\n expect(contactRoleChip).toHaveTextContent(/\\(3\\)/);\n\n const fileTypeChip = canvas.getByRole('button', { name: /Box Note/i });\n expect(fileTypeChip).toHaveTextContent(/\\+2/);\n },\n};\n\nexport const sidePanelOpenWithSingleItemSelected: Story = {\n args: {\n ...metadataViewV2ElementProps,\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n },\n },\n play: async ({ canvas }) => {\n await waitFor(() => {\n expect(canvas.getByRole('row', { name: /Child 2/i })).toBeInTheDocument();\n });\n\n // Select the first row by clicking its checkbox\n const firstRow = canvas.getByRole('row', { name: /Child 2/i });\n const checkbox = within(firstRow).getByRole('checkbox');\n await userEvent.click(checkbox);\n\n const metadataButton = canvas.getByRole('button', { name: 'Metadata' });\n await userEvent.click(metadataButton);\n },\n};\n\nexport const metadataViewV2WithBulkItemActionMenuShowsItemActionMenu: Story = {\n args: metadataViewV2WithBulkItemActions,\n play: async ({ canvas }) => {\n const firstRow = await canvas.findByRole('row', { name: /Child 2/i });\n expect(firstRow).toBeInTheDocument();\n\n const checkbox = within(firstRow).getByRole('checkbox');\n await userEvent.click(checkbox);\n\n const ellipsisButton = canvas.getByRole('button', { name: 'Bulk actions' });\n expect(ellipsisButton).toBeInTheDocument();\n await userEvent.click(ellipsisButton);\n\n const downloadAction = screen.getByRole('menuitem', { name: 'Download' });\n expect(downloadAction).toBeInTheDocument();\n },\n};\n\nexport const sidePanelOpenWithMultipleItemsSelected: Story = {\n args: {\n ...metadataViewV2ElementProps,\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n },\n },\n\n play: async ({ canvas }) => {\n await waitFor(() => {\n expect(canvas.getByRole('row', { name: /Child 2/i })).toBeInTheDocument();\n });\n\n // Select the first row by clicking its checkbox\n const firstItem = canvas.getByRole('row', { name: /Child 2/i });\n const checkbox = within(firstItem).getByRole('checkbox');\n await userEvent.click(checkbox);\n\n // Select the second row by clicking its checkbox\n const secondItem = canvas.getAllByRole('row', { name: /Child 1/i })[0];\n const secondCheckbox = within(secondItem).getByRole('checkbox');\n await userEvent.click(secondCheckbox);\n\n const metadataButton = canvas.getByRole('button', { name: 'Metadata' });\n await userEvent.click(metadataButton);\n },\n};\n\nconst meta: Meta<typeof ContentExplorer> = {\n title: 'Elements/ContentExplorer/tests/MetadataView/visual',\n component: ContentExplorer,\n args: {\n features: global.FEATURE_FLAGS,\n rootFolderId: global.FOLDER_ID,\n token: global.TOKEN,\n },\n parameters: {\n msw: {\n handlers: [\n // Note that the Metadata API backend normally handles the sorting. The mocks below simulate the sorting for specific cases, but may not 100% accurately reflect the backend behavior.\n http.post(`${DEFAULT_HOSTNAME_API}/2.0/metadata_queries/execute_read`, async ({ request }) => {\n const body = await request.clone().json();\n const orderByDirection = body.order_by[0].direction;\n const orderByFieldKey = body.order_by[0].field_key;\n\n // Hardcoded case for sorting by industry\n if (orderByFieldKey === `industry` && orderByDirection === 'ASC') {\n const sortedMetadata = orderBy(\n mockMetadata.entries,\n 'metadata.enterprise_0.templateName.industry',\n 'asc',\n );\n return HttpResponse.json({ ...mockMetadata, entries: sortedMetadata });\n }\n return HttpResponse.json(mockMetadata);\n }),\n http.get(`${DEFAULT_HOSTNAME_API}/2.0/metadata_templates/enterprise/templateName/schema`, () => {\n return HttpResponse.json(mockSchema);\n }),\n http.get(`${DEFAULT_HOSTNAME_API}/2.0/folders/:id`, () => {\n return HttpResponse.json(mockRootFolder);\n }),\n ],\n },\n },\n};\n\ntype Story = StoryObj<typeof meta>;\n\nexport default meta;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MetadataView-visual.stories.js","names":["http","HttpResponse","Download","SignMeOthers","Sign","expect","fn","userEvent","waitFor","within","screen","noop","orderBy","ContentExplorer","DEFAULT_HOSTNAME_API","mockMetadata","mockSchema","mockRootFolder","scope","templateScope","templateKey","metadataScopeAndKey","metadataFieldNamePrefix","metadataQuery","from","ancestor_folder_id","order_by","field_key","fields","key","direction","map","field","fieldsToShow","canEdit","columns","textValue","displayName","id","type","allowsSorting","minWidth","maxWidth","defaultView","metadataView","args","metadataViewV2ElementProps","metadataViewProps","features","contentExplorer","metadataViewV2","metadataViewV2WithInlineCustomActionsElementProps","_objectSpread","tableProps","isSelectAllEnabled","itemActionMenuProps","actions","label","onClick","icon","subMenuTrigger","subMenuActions","metadataViewV2WithBulkItemActions","bulkItemActions","metadataViewV2SortsFromHeader","play","canvas","industryHeader","findByRole","name","toBeInTheDocument","firstRow","click","metadataViewV2WithCustomActions","getByRole","ellipsesButton","initialFilterActionBarProps","initialFilterValues","industry","value","role","metadataViewV2WithInitialFilterValues","actionBarProps","toHaveTextContent","contactRoleChip","fileTypeChip","sidePanelOpenWithSingleItemSelected","checkbox","metadataButton","metadataViewV2WithBulkItemActionMenuShowsItemActionMenu","ellipsisButton","downloadAction","sidePanelOpenWithMultipleItemsSelected","firstItem","secondItem","getAllByRole","secondCheckbox","meta","title","component","global","FEATURE_FLAGS","rootFolderId","FOLDER_ID","token","TOKEN","parameters","msw","handlers","post","request","body","clone","json","orderByDirection","orderByFieldKey","sortedMetadata","entries","get"],"sources":["../../../../../src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx"],"sourcesContent":["import type { Meta, StoryObj } from '@storybook/react';\nimport { http, HttpResponse } from 'msw';\nimport { Download, SignMeOthers } from '@box/blueprint-web-assets/icons/Fill/index';\nimport { Sign } from '@box/blueprint-web-assets/icons/Line';\nimport { expect, fn, userEvent, waitFor, within, screen } from 'storybook/test';\n\nimport noop from 'lodash/noop';\nimport orderBy from 'lodash/orderBy';\n\nimport ContentExplorer from '../../ContentExplorer';\nimport { DEFAULT_HOSTNAME_API } from '../../../../constants';\nimport { mockMetadata, mockSchema } from '../../../common/__mocks__/mockMetadata';\nimport { mockRootFolder } from '../../../common/__mocks__/mockRootFolder';\n\n// 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.\nconst { scope: templateScope, templateKey } = mockSchema;\n\nconst metadataScopeAndKey = `${templateScope}.${templateKey}`;\nconst metadataFieldNamePrefix = `metadata.${metadataScopeAndKey}`;\n\n// This is the body of the metadata query API call.\n// https://developer.box.com/guides/metadata/queries/syntax/\nconst metadataQuery = {\n from: metadataScopeAndKey,\n ancestor_folder_id: '0',\n order_by: [\n {\n field_key: `${metadataFieldNamePrefix}.${mockSchema.fields[0].key}`, // Default to sorting by the first field in the schema\n direction: 'asc',\n },\n ],\n fields: [\n // Default to returning all fields in the metadata template schema, and name as a standalone (non-metadata) field\n ...mockSchema.fields.map(field => `${metadataFieldNamePrefix}.${field.key}`),\n ],\n};\n\n// Used for metadata view v1\nconst fieldsToShow = [\n { key: `${metadataFieldNamePrefix}.industry`, canEdit: true },\n { key: `${metadataFieldNamePrefix}.last_contacted_at`, canEdit: true },\n { key: `${metadataFieldNamePrefix}.role`, canEdit: true },\n];\n\n// Used for metadata view v2\nconst columns = [\n ...mockSchema.fields.map(field => ({\n textValue: field.displayName,\n id: `${metadataFieldNamePrefix}.${field.key}`,\n type: field.type,\n allowsSorting: true,\n minWidth: 150,\n maxWidth: 150,\n })),\n];\n\n// Switches ContentExplorer to use Metadata View over standard, folder-based view.\nconst defaultView = 'metadata';\n\nexport const metadataView: Story = {\n args: {\n metadataQuery,\n fieldsToShow,\n defaultView,\n },\n};\n\nconst metadataViewV2ElementProps = {\n metadataViewProps: {\n columns,\n },\n metadataQuery,\n fieldsToShow,\n defaultView,\n features: {\n contentExplorer: {\n metadataViewV2: true,\n },\n },\n};\n\nconst metadataViewV2WithInlineCustomActionsElementProps = {\n ...metadataViewV2ElementProps,\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n itemActionMenuProps: {\n actions: [\n {\n label: 'Download',\n onClick: noop,\n icon: Download,\n },\n ],\n subMenuTrigger: {\n label: 'Sign',\n icon: Sign,\n },\n subMenuActions: [\n {\n label: 'Request Signature',\n onClick: noop,\n icon: SignMeOthers,\n },\n ],\n },\n },\n};\n\nconst metadataViewV2WithBulkItemActions = {\n ...metadataViewV2ElementProps,\n bulkItemActions: [\n {\n label: 'Download',\n onClick: fn(),\n },\n ],\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n },\n};\n\nexport const metadataViewV2: Story = {\n args: metadataViewV2ElementProps,\n};\n\nexport const metadataViewV2SortsFromHeader: Story = {\n args: metadataViewV2ElementProps,\n play: async ({ canvas }) => {\n const industryHeader = await canvas.findByRole('columnheader', { name: 'Industry' });\n expect(industryHeader).toBeInTheDocument();\n\n const firstRow = await canvas.findByRole('row', { name: /Child 2/i });\n expect(firstRow).toBeInTheDocument();\n\n await userEvent.click(industryHeader);\n },\n};\n\nexport const metadataViewV2WithCustomActions: Story = {\n args: metadataViewV2WithInlineCustomActionsElementProps,\n play: async ({ canvas }) => {\n await waitFor(() => {\n expect(canvas.getByRole('row', { name: /Child 2/i })).toBeInTheDocument();\n });\n const firstRow = canvas.getByRole('row', { name: /Child 2/i });\n const ellipsesButton = within(firstRow).getByRole('button', { name: 'Action menu' });\n userEvent.click(ellipsesButton);\n },\n};\n\nconst initialFilterActionBarProps = {\n initialFilterValues: {\n industry: { value: ['Legal'] },\n 'mimetype-filter': { value: ['boxnoteType', 'documentType', 'threedType'] },\n role: { value: ['Developer', 'Business Owner', 'Marketing'] },\n },\n};\n\nexport const metadataViewV2WithInitialFilterValues: Story = {\n args: {\n ...metadataViewV2ElementProps,\n metadataViewProps: {\n columns,\n actionBarProps: initialFilterActionBarProps,\n },\n },\n play: async ({ canvas }) => {\n // Wait for chips to update with initial values\n await waitFor(() => {\n expect(canvas.getByRole('button', { name: /Industry/i })).toHaveTextContent(/\\(1\\)/);\n });\n // Other chips should reflect initialized values\n const contactRoleChip = canvas.getByRole('button', { name: /Contact Role/i });\n expect(contactRoleChip).toHaveTextContent(/\\(3\\)/);\n\n const fileTypeChip = canvas.getByRole('button', { name: /Box Note/i });\n expect(fileTypeChip).toHaveTextContent(/\\+2/);\n },\n};\n\nexport const sidePanelOpenWithSingleItemSelected: Story = {\n args: {\n ...metadataViewV2ElementProps,\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n },\n },\n play: async ({ canvas }) => {\n await waitFor(() => {\n expect(canvas.getByRole('row', { name: /Child 2/i })).toBeInTheDocument();\n });\n\n // Select the first row by clicking its checkbox\n const firstRow = canvas.getByRole('row', { name: /Child 2/i });\n const checkbox = within(firstRow).getByRole('checkbox');\n await userEvent.click(checkbox);\n\n const metadataButton = canvas.getByRole('button', { name: 'Metadata' });\n await userEvent.click(metadataButton);\n },\n};\n\nexport const metadataViewV2WithBulkItemActionMenuShowsItemActionMenu: Story = {\n args: metadataViewV2WithBulkItemActions,\n play: async ({ canvas }) => {\n const firstRow = await canvas.findByRole('row', { name: /Child 2/i });\n expect(firstRow).toBeInTheDocument();\n\n const checkbox = within(firstRow).getByRole('checkbox');\n await userEvent.click(checkbox);\n\n const ellipsisButton = canvas.getByRole('button', { name: 'Bulk actions' });\n expect(ellipsisButton).toBeInTheDocument();\n await userEvent.click(ellipsisButton);\n\n const downloadAction = screen.getByRole('menuitem', { name: 'Download' });\n expect(downloadAction).toBeInTheDocument();\n },\n};\n\nexport const sidePanelOpenWithMultipleItemsSelected: Story = {\n args: {\n ...metadataViewV2ElementProps,\n metadataViewProps: {\n columns,\n tableProps: {\n isSelectAllEnabled: true,\n },\n },\n },\n\n play: async ({ canvas }) => {\n await waitFor(() => {\n expect(canvas.getByRole('row', { name: /Child 2/i })).toBeInTheDocument();\n });\n\n // Select the first row by clicking its checkbox\n const firstItem = canvas.getByRole('row', { name: /Child 2/i });\n const checkbox = within(firstItem).getByRole('checkbox');\n await userEvent.click(checkbox);\n\n // Select the second row by clicking its checkbox\n const secondItem = canvas.getAllByRole('row', { name: /Child 1/i })[0];\n const secondCheckbox = within(secondItem).getByRole('checkbox');\n await userEvent.click(secondCheckbox);\n\n const metadataButton = canvas.getByRole('button', { name: 'Metadata' });\n await userEvent.click(metadataButton);\n },\n};\n\nconst meta: Meta<typeof ContentExplorer> = {\n title: 'Elements/ContentExplorer/tests/MetadataView/visual',\n component: ContentExplorer,\n args: {\n features: global.FEATURE_FLAGS,\n rootFolderId: global.FOLDER_ID,\n token: global.TOKEN,\n },\n parameters: {\n msw: {\n handlers: [\n // Note that the Metadata API backend normally handles the sorting. The mocks below simulate the sorting for specific cases, but may not 100% accurately reflect the backend behavior.\n http.post(`${DEFAULT_HOSTNAME_API}/2.0/metadata_queries/execute_read`, async ({ request }) => {\n const body = await request.clone().json();\n const orderByDirection = body.order_by[0].direction;\n const orderByFieldKey = body.order_by[0].field_key;\n\n // Hardcoded case for sorting by industry\n if (orderByFieldKey === `industry` && orderByDirection === 'ASC') {\n const sortedMetadata = orderBy(\n mockMetadata.entries,\n 'metadata.enterprise_0.templateName.industry',\n 'asc',\n );\n return HttpResponse.json({ ...mockMetadata, entries: sortedMetadata });\n }\n return HttpResponse.json(mockMetadata);\n }),\n http.get(`${DEFAULT_HOSTNAME_API}/2.0/metadata_templates/enterprise/templateName/schema`, () => {\n return HttpResponse.json(mockSchema);\n }),\n http.get(`${DEFAULT_HOSTNAME_API}/2.0/folders/:id`, () => {\n return HttpResponse.json(mockRootFolder);\n }),\n ],\n },\n },\n};\n\ntype Story = StoryObj<typeof meta>;\n\nexport default meta;\n"],"mappings":"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","ignoreList":[]}
@@ -9,6 +9,7 @@ import isNil from 'lodash/isNil';
9
9
  import xor from 'lodash/xor';
10
10
  import { MULTI_VALUE_DEFAULT_OPTION, MULTI_VALUE_DEFAULT_VALUE } from '@box/metadata-editor';
11
11
  import messages from '../common/messages';
12
+ import { FILE_FOLDER_TYPES_MAP, NON_FOLDER_FILE_TYPES } from './constants';
12
13
 
13
14
  // Specific type for metadata field value in the item
14
15
  // Note: Item doesn't have field value in metadata object if that field is not set, so the value will be undefined in this case
@@ -192,4 +193,15 @@ export function useTemplateInstance(metadataTemplate, selectedItems, isEditing)
192
193
  type
193
194
  };
194
195
  }
196
+ export const mapFileTypes = selectedFileTypes => {
197
+ const selectedFileTypesSet = new Set(selectedFileTypes);
198
+ const areAllNonFolderFileTypesSelected = NON_FOLDER_FILE_TYPES.every(key => selectedFileTypesSet.has(key));
199
+ if (areAllNonFolderFileTypesSelected) {
200
+ if (selectedFileTypes.includes('folderType')) {
201
+ return [];
202
+ }
203
+ return ['file'];
204
+ }
205
+ return selectedFileTypes.map(fileType => FILE_FOLDER_TYPES_MAP.get(fileType) || []).flat();
206
+ };
195
207
  //# sourceMappingURL=utils.js.map