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.
- package/dist/explorer.css +1 -1
- package/dist/explorer.js +1 -1
- package/dist/picker.js +1 -1
- package/es/elements/content-explorer/Content.js +3 -1
- package/es/elements/content-explorer/Content.js.map +1 -1
- package/es/elements/content-explorer/ContentExplorer.js +17 -6
- package/es/elements/content-explorer/ContentExplorer.js.map +1 -1
- package/es/elements/content-explorer/MetadataQueryAPIHelper.js +104 -7
- package/es/elements/content-explorer/MetadataQueryAPIHelper.js.map +1 -1
- package/es/elements/content-explorer/MetadataQueryBuilder.js +154 -0
- package/es/elements/content-explorer/MetadataQueryBuilder.js.map +1 -0
- package/es/elements/content-explorer/MetadataViewContainer.js +92 -46
- package/es/elements/content-explorer/MetadataViewContainer.js.map +1 -1
- package/es/elements/content-explorer/constants.js +4 -2
- package/es/elements/content-explorer/constants.js.map +1 -1
- package/es/elements/content-explorer/stories/MetadataView.stories.js +3 -25
- package/es/elements/content-explorer/stories/MetadataView.stories.js.map +1 -1
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js +4 -16
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
- package/es/elements/content-explorer/utils.js +12 -0
- package/es/elements/content-explorer/utils.js.map +1 -1
- package/es/src/elements/common/__mocks__/mockMetadata.d.ts +8 -24
- package/es/src/elements/content-explorer/Content.d.ts +4 -3
- package/es/src/elements/content-explorer/ContentExplorer.d.ts +8 -3
- package/es/src/elements/content-explorer/MetadataQueryAPIHelper.d.ts +11 -2
- package/es/src/elements/content-explorer/MetadataQueryBuilder.d.ts +27 -0
- package/es/src/elements/content-explorer/MetadataViewContainer.d.ts +8 -4
- package/es/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.d.ts +1 -0
- package/es/src/elements/content-explorer/constants.d.ts +4 -2
- package/es/src/elements/content-explorer/utils.d.ts +2 -0
- package/i18n/bn-IN.js +1 -1
- package/i18n/bn-IN.properties +8 -0
- package/i18n/da-DK.js +1 -1
- package/i18n/da-DK.properties +8 -0
- package/i18n/de-DE.js +1 -1
- package/i18n/de-DE.properties +8 -0
- package/i18n/en-AU.js +1 -1
- package/i18n/en-AU.properties +8 -0
- package/i18n/en-CA.js +1 -1
- package/i18n/en-CA.properties +8 -0
- package/i18n/en-GB.js +1 -1
- package/i18n/en-GB.properties +8 -0
- package/i18n/es-419.js +1 -1
- package/i18n/es-419.properties +8 -0
- package/i18n/es-ES.js +1 -1
- package/i18n/es-ES.properties +8 -0
- package/i18n/fi-FI.js +1 -1
- package/i18n/fi-FI.properties +8 -0
- package/i18n/fr-CA.js +1 -1
- package/i18n/fr-CA.properties +8 -0
- package/i18n/fr-FR.js +1 -1
- package/i18n/fr-FR.properties +8 -0
- package/i18n/hi-IN.js +1 -1
- package/i18n/hi-IN.properties +8 -0
- package/i18n/it-IT.js +1 -1
- package/i18n/it-IT.properties +8 -0
- package/i18n/ja-JP.js +1 -1
- package/i18n/ja-JP.properties +8 -0
- package/i18n/ko-KR.js +1 -1
- package/i18n/ko-KR.properties +8 -0
- package/i18n/nb-NO.js +1 -1
- package/i18n/nb-NO.properties +8 -0
- package/i18n/nl-NL.js +1 -1
- package/i18n/nl-NL.properties +8 -0
- package/i18n/pl-PL.js +1 -1
- package/i18n/pl-PL.properties +8 -0
- package/i18n/pt-BR.js +1 -1
- package/i18n/pt-BR.properties +8 -0
- package/i18n/ru-RU.js +1 -1
- package/i18n/ru-RU.properties +8 -0
- package/i18n/sv-SE.js +1 -1
- package/i18n/sv-SE.properties +8 -0
- package/i18n/tr-TR.js +1 -1
- package/i18n/tr-TR.properties +8 -0
- package/i18n/zh-CN.js +1 -1
- package/i18n/zh-CN.properties +8 -0
- package/i18n/zh-TW.js +1 -1
- package/i18n/zh-TW.properties +8 -0
- package/package.json +3 -3
- package/src/elements/common/__mocks__/mockMetadata.ts +7 -11
- package/src/elements/content-explorer/Content.tsx +8 -2
- package/src/elements/content-explorer/ContentExplorer.tsx +209 -194
- package/src/elements/content-explorer/MetadataQueryAPIHelper.ts +111 -5
- package/src/elements/content-explorer/MetadataQueryBuilder.ts +194 -0
- package/src/elements/content-explorer/MetadataViewContainer.tsx +112 -37
- package/src/elements/content-explorer/__tests__/Content.test.tsx +1 -0
- package/src/elements/content-explorer/__tests__/ContentExplorer.test.tsx +2 -5
- package/src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts +427 -8
- package/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts +535 -0
- package/src/elements/content-explorer/__tests__/MetadataViewContainer.test.tsx +413 -9
- package/src/elements/content-explorer/constants.ts +39 -2
- package/src/elements/content-explorer/stories/MetadataView.stories.tsx +3 -21
- package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +2 -13
- 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
|
|
47
|
-
return Object.entries(fields).reduce((acc, [key, {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
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
|
-
|
|
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
|
|
95
|
+
onFilterSubmit
|
|
73
96
|
} = actionBarProps ?? {};
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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,
|
|
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,
|
|
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:
|
|
187
|
+
columns: newColumns,
|
|
142
188
|
items: items,
|
|
143
189
|
tableProps: newTableProps
|
|
144
|
-
},
|
|
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":";;;;;;;;;;AAAA,OAAO,KAAKA,KAAK,MAAM,OAAO;AAE9B,SAASC,YAAY,QAAgC,oBAAoB;;AAOzE;AACA;;AAmBA;AACA;AACA;AACA;AACA,SAASC,uBAAuBA,CAACC,MAAc,EAAU;EACrD;EACA,IAAIA,MAAM,CAACC,UAAU,CAAC,WAAW,CAAC,IAAID,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC,CAACC,MAAM,IAAI,CAAC,EAAE;IACjE;IACA;IACA,MAAMC,KAAK,GAAGJ,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC;IAC/B,OAAOE,KAAK,CAACC,KAAK,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;EACnC;EACA,OAAON,MAAM;AACjB;AAEA,SAASO,sCAAsCA,CAC3CC,YAAmC,EAC0B;EAC7D,IAAI,CAACA,YAAY,EAAE,OAAOC,SAAS;EAEnC,OAAOC,MAAM,CAACC,OAAO,CAACH,YAAY,CAAC,CAACI,MAAM,CACtC,CAACC,GAAG,EAAE,CAACC,GAAG,EAAE;IAAEC;EAAM,CAAC,CAAC,KAAK;IACvBF,GAAG,CAACC,GAAG,CAAC,GAAGE,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,GAAG;MAAEA,KAAK,EAAE;QAAEG,IAAI,EAAEH;MAAM;IAAE,CAAC,GAAG;MAAEA;IAAM,CAAC;IACxE,OAAOF,GAAG;EACd,CAAC,EACD,CAAC,CACL,CAAC;AACL;AAEA,SAASM,+BAA+BA,CACpCC,MAAyD,EACrC;EACpB,OAAOV,MAAM,CAACC,OAAO,CAACS,MAAM,CAAC,CAACR,MAAM,CAAuB,CAACC,GAAG,EAAE,CAACC,GAAG,EAAE;IAAEC;EAAM,CAAC,CAAC,KAAK;IAClFF,GAAG,CAACC,GAAG,CAAC,GACJ,MAAM,IAAIC,KAAK,IAAIC,KAAK,CAACC,OAAO,CAACF,KAAK,CAACG,IAAI,CAAC,GACtC;MAAEH,KAAK,EAAEA,KAAK,CAACG;IAAK,CAAC,GACrB;MAAEH,KAAK,EAAEA;IAA+B,CAAC;IACnD,OAAOF,GAAG;EACd,CAAC,EAAE,CAAC,CAAC,CAAC;AACV;AAUA,MAAMQ,qBAAqB,GAAGC,IAAA,IAOI;EAAA,IAPH;MAC3BC,cAAc;MACdC,OAAO;MACPC,iBAAiB;MACjBC,gBAAgB;MAChBC,YAAY,EAAEC;IAEU,CAAC,GAAAN,IAAA;IADtBO,IAAI,GAAAC,wBAAA,CAAAR,IAAA,EAAAS,SAAA;EAEP,MAAM;IAAEC,KAAK,GAAG;EAAG,CAAC,GAAGP,iBAAiB;EACxC,MAAM;IAAEQ,mBAAmB,EAAEC,uBAAuB;IAAEC,cAAc,EAAEC;EAAmB,CAAC,GAAGb,cAAc,IAAI,CAAC,CAAC;EAEjH,MAAMc,YAAY,GAAGxC,KAAK,CAACyC,OAAO,CAC9B,MAAM,CACF;IACIC,UAAU,EAAE,IAAI;IAChBC,OAAO,EACHd,gBAAgB,EAAEN,MAAM,EAAEqB,GAAG,CAACC,KAAK,IAAI;MACnC,OAAO;QACHC,EAAE,EAAE,GAAGD,KAAK,CAAC5B,GAAG,SAAS;QACzB8B,IAAI,EAAEF,KAAK,CAACG,WAAW;QACvBC,SAAS,EAAEJ,KAAK,CAACK,IAAI;QACrBC,OAAO,EAAEN,KAAK,CAACM,OAAO,EAAEP,GAAG,CAAC,CAAC;UAAE3B;QAAI,CAAC,KAAKA,GAAG,CAAC,IAAI,EAAE;QACnDmC,gBAAgB,EAAE;MACtB,CAAC;IACL,CAAC,CAAC,IAAI;EACd,CAAC,CACJ,EACD,CAACvB,gBAAgB,CACrB,CAAC;;EAED;EACA,MAAMO,mBAAmB,GAAGpC,KAAK,CAACyC,OAAO,CACrC,MAAM/B,sCAAsC,CAAC2B,uBAAuB,CAAC,EACrE,CAACA,uBAAuB,CAC5B,CAAC;;EAED;EACA,MAAMC,cAAc,GAAGtC,KAAK,CAACqD,WAAW,CACnC9B,MAAyD,IAAK;IAC3D,IAAI,CAACgB,kBAAkB,EAAE;IACzB,MAAMe,WAAW,GAAGhC,+BAA+B,CAACC,MAAM,CAAC;IAC3DgB,kBAAkB,CAACe,WAAW,CAAC;EACnC,CAAC,EACD,CAACf,kBAAkB,CACvB,CAAC;EAED,MAAMgB,yBAAyB,GAAGvD,KAAK,CAACyC,OAAO,CAAC,MAAM;IAClD,OAAAe,aAAA,CAAAA,aAAA,KACO9B,cAAc;MACjBU,mBAAmB;MACnBE,cAAc;MACdE;IAAY;EAEpB,CAAC,EAAE,CAACd,cAAc,EAAEU,mBAAmB,EAAEE,cAAc,EAAEE,YAAY,CAAC,CAAC;;EAEvE;EACA,MAAM;MAAEiB;IAAyB,CAAC,GAAGzB,IAAI;IAAlB0B,SAAS,GAAAzB,wBAAA,CAAKD,IAAI,EAAA2B,UAAA;EACzC,MAAMC,oBAAoB,GAAGH,UAAU,EAAE3B,YAAY;;EAErD;EACA,MAAM+B,gBAAgB,GAAG7D,KAAK,CAACqD,WAAW,CACtC,CAAC;IAAElD,MAAM;IAAE2D;EAA0B,CAAC,KAAK;IACvC;IACA;IACA,IAAI/B,oBAAoB,EAAE;MACtB,MAAMgC,aAAa,GAAG7D,uBAAuB,CAAC8D,MAAM,CAAC7D,MAAM,CAAC,CAAC;MAC7D4B,oBAAoB,CAACgC,aAAa,EAAED,SAAS,KAAK,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;IACnF;;IAEA;IACA;IACA,IAAIF,oBAAoB,EAAE;MACtBA,oBAAoB,CAAC;QACjBzD,MAAM;QACN2D;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,EACD,CAAC/B,oBAAoB,EAAE6B,oBAAoB,CAC/C,CAAC;;EAED;EACA,MAAMK,aAAa,GAAAT,aAAA,CAAAA,aAAA,KACZC,UAAU;IACb3B,YAAY,EAAE+B;EAAgB,EACjC;EAED,oBACI7D,KAAA,CAAAkE,aAAA,CAACjE,YAAY,EAAAkE,QAAA;IACTzC,cAAc,EAAE6B,yBAA0B;IAC1C5B,OAAO,EAAEA,OAAQ;IACjBQ,KAAK,EAAEA,KAAM;IACbsB,UAAU,EAAEQ;EAAc,GACtBP,SAAS,CAChB,CAAC;AAEV,CAAC;AAED,eAAelC,qBAAqB","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
|
|
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\
|
|
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: [
|
|
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","
|
|
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}`)
|
|
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
|
-
|
|
160
|
+
industry: {
|
|
173
161
|
value: ['Legal']
|
|
174
162
|
},
|
|
175
163
|
'mimetype-filter': {
|
|
176
164
|
value: ['boxnoteType', 'documentType', 'threedType']
|
|
177
165
|
},
|
|
178
|
-
|
|
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
|