box-ui-elements 24.0.0-beta.4 → 24.0.0-beta.6
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/openwith.js +1 -1
- package/dist/picker.js +1 -1
- package/dist/preview.js +1 -1
- package/dist/sharing.js +1 -1
- package/dist/sidebar.js +1 -1
- package/dist/uploader.js +1 -1
- package/es/api/Metadata.js +98 -13
- package/es/api/Metadata.js.flow +110 -12
- package/es/api/Metadata.js.map +1 -1
- package/es/elements/common/messages.js +16 -0
- package/es/elements/common/messages.js.flow +25 -0
- package/es/elements/common/messages.js.map +1 -1
- package/es/elements/content-explorer/Content.js +5 -2
- package/es/elements/content-explorer/Content.js.map +1 -1
- package/es/elements/content-explorer/ContentExplorer.js +31 -6
- package/es/elements/content-explorer/ContentExplorer.js.map +1 -1
- package/es/elements/content-explorer/MetadataQueryAPIHelper.js +164 -10
- package/es/elements/content-explorer/MetadataQueryAPIHelper.js.map +1 -1
- package/es/elements/content-explorer/MetadataQueryBuilder.js +115 -0
- package/es/elements/content-explorer/MetadataQueryBuilder.js.map +1 -0
- package/es/elements/content-explorer/MetadataSidePanel.js +40 -14
- package/es/elements/content-explorer/MetadataSidePanel.js.map +1 -1
- package/es/elements/content-explorer/MetadataViewContainer.js +133 -36
- package/es/elements/content-explorer/MetadataViewContainer.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 +65 -29
- package/es/elements/content-explorer/stories/tests/MetadataView-visual.stories.js.map +1 -1
- package/es/elements/content-explorer/utils.js +140 -12
- 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 +19 -6
- package/es/src/elements/content-explorer/MetadataQueryAPIHelper.d.ts +22 -3
- package/es/src/elements/content-explorer/MetadataQueryBuilder.d.ts +27 -0
- package/es/src/elements/content-explorer/MetadataSidePanel.d.ts +6 -3
- package/es/src/elements/content-explorer/MetadataViewContainer.d.ts +10 -4
- package/es/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.d.ts +1 -0
- package/es/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.d.ts +1 -0
- package/es/src/elements/content-explorer/utils.d.ts +9 -3
- package/i18n/bn-IN.js +4 -0
- package/i18n/bn-IN.properties +12 -0
- package/i18n/da-DK.js +4 -0
- package/i18n/da-DK.properties +12 -0
- package/i18n/de-DE.js +5 -1
- package/i18n/de-DE.properties +12 -0
- package/i18n/en-AU.js +4 -0
- package/i18n/en-AU.properties +12 -0
- package/i18n/en-CA.js +4 -0
- package/i18n/en-CA.properties +12 -0
- package/i18n/en-GB.js +4 -0
- package/i18n/en-GB.properties +12 -0
- package/i18n/en-US.js +4 -0
- package/i18n/en-US.properties +8 -0
- package/i18n/en-x-pseudo.js +4 -0
- package/i18n/es-419.js +5 -1
- package/i18n/es-419.properties +12 -0
- package/i18n/es-ES.js +5 -1
- package/i18n/es-ES.properties +12 -0
- package/i18n/fi-FI.js +4 -0
- package/i18n/fi-FI.properties +12 -0
- package/i18n/fr-CA.js +4 -0
- package/i18n/fr-CA.properties +12 -0
- package/i18n/fr-FR.js +4 -0
- package/i18n/fr-FR.properties +12 -0
- package/i18n/hi-IN.js +4 -0
- package/i18n/hi-IN.properties +12 -0
- package/i18n/it-IT.js +4 -0
- package/i18n/it-IT.properties +12 -0
- package/i18n/ja-JP.js +6 -2
- package/i18n/ja-JP.properties +14 -2
- package/i18n/ko-KR.js +4 -0
- package/i18n/ko-KR.properties +12 -0
- package/i18n/nb-NO.js +4 -0
- package/i18n/nb-NO.properties +12 -0
- package/i18n/nl-NL.js +4 -0
- package/i18n/nl-NL.properties +12 -0
- package/i18n/pl-PL.js +4 -0
- package/i18n/pl-PL.properties +12 -0
- package/i18n/pt-BR.js +4 -0
- package/i18n/pt-BR.properties +12 -0
- package/i18n/ru-RU.js +5 -1
- package/i18n/ru-RU.properties +12 -0
- package/i18n/sv-SE.js +4 -0
- package/i18n/sv-SE.properties +12 -0
- package/i18n/tr-TR.js +5 -1
- package/i18n/tr-TR.properties +12 -0
- package/i18n/zh-CN.js +4 -0
- package/i18n/zh-CN.properties +12 -0
- package/i18n/zh-TW.js +4 -0
- package/i18n/zh-TW.properties +12 -0
- package/package.json +3 -3
- package/src/api/Metadata.js +110 -12
- package/src/api/__tests__/Metadata.test.js +120 -0
- package/src/elements/common/__mocks__/mockMetadata.ts +7 -11
- package/src/elements/common/messages.js +25 -0
- package/src/elements/content-explorer/Content.tsx +9 -2
- package/src/elements/content-explorer/ContentExplorer.tsx +71 -17
- package/src/elements/content-explorer/MetadataQueryAPIHelper.ts +199 -8
- package/src/elements/content-explorer/MetadataQueryBuilder.ts +159 -0
- package/src/elements/content-explorer/MetadataSidePanel.tsx +55 -14
- package/src/elements/content-explorer/MetadataViewContainer.tsx +164 -29
- package/src/elements/content-explorer/__tests__/Content.test.tsx +1 -0
- package/src/elements/content-explorer/__tests__/ContentExplorer.test.tsx +38 -7
- package/src/elements/content-explorer/__tests__/MetadataQueryAPIHelper.test.ts +428 -12
- package/src/elements/content-explorer/__tests__/MetadataQueryBuilder.test.ts +419 -0
- package/src/elements/content-explorer/__tests__/MetadataSidePanel.test.tsx +145 -3
- package/src/elements/content-explorer/__tests__/MetadataViewContainer.test.tsx +413 -9
- package/src/elements/content-explorer/stories/MetadataView.stories.tsx +3 -21
- package/src/elements/content-explorer/stories/tests/MetadataView-visual.stories.tsx +56 -21
- package/src/elements/content-explorer/utils.ts +150 -13
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const _excluded = ["actionBarProps", "columns", "currentCollection", "metadataTemplate"];
|
|
1
|
+
const _excluded = ["actionBarProps", "columns", "currentCollection", "metadataTemplate", "onMetadataFilter", "onSortChange", "tableProps"];
|
|
2
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); }
|
|
3
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; }
|
|
4
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; }
|
|
@@ -8,11 +8,31 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
|
|
|
8
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; }
|
|
9
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; }
|
|
10
10
|
import * as React from 'react';
|
|
11
|
+
import { useIntl } from 'react-intl';
|
|
11
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';
|
|
12
16
|
|
|
13
17
|
// Public-friendly version of MetadataFormFieldValue from @box/metadata-filter
|
|
14
18
|
// (string[] for enum type, range/float objects stay the same)
|
|
15
19
|
|
|
20
|
+
const ITEM_FILTER_NAME = 'item_name';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Helper function to trim metadataFieldNamePrefix from column names
|
|
24
|
+
* For example: 'metadata.enterprise_1515946.mdViewTemplate1.industry' -> 'industry'
|
|
25
|
+
*/
|
|
26
|
+
function trimMetadataFieldPrefix(column) {
|
|
27
|
+
// Check if the column starts with 'metadata.' and contains at least 2 dots
|
|
28
|
+
if (column.startsWith('metadata.') && column.split('.').length >= 3) {
|
|
29
|
+
// Split by dots and take everything after the first 3 parts
|
|
30
|
+
// metadata.enterprise_1515946.mdViewTemplate1.industry -> industry
|
|
31
|
+
const parts = column.split('.');
|
|
32
|
+
return parts.slice(3).join('.');
|
|
33
|
+
}
|
|
34
|
+
return column;
|
|
35
|
+
}
|
|
16
36
|
function transformInitialFilterValuesToInternal(publicValues) {
|
|
17
37
|
if (!publicValues) return undefined;
|
|
18
38
|
return Object.entries(publicValues).reduce((acc, [key, {
|
|
@@ -28,68 +48,145 @@ function transformInitialFilterValuesToInternal(publicValues) {
|
|
|
28
48
|
return acc;
|
|
29
49
|
}, {});
|
|
30
50
|
}
|
|
31
|
-
function
|
|
32
|
-
return Object.entries(fields).reduce((acc, [key, {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
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
|
|
39
67
|
};
|
|
40
68
|
return acc;
|
|
41
69
|
}, {});
|
|
42
70
|
}
|
|
71
|
+
|
|
72
|
+
// Internal helper function for component use
|
|
73
|
+
function transformInternalFieldsToPublic(fields) {
|
|
74
|
+
return convertFilterValuesToExternal(fields);
|
|
75
|
+
}
|
|
43
76
|
const MetadataViewContainer = _ref => {
|
|
44
77
|
let {
|
|
45
78
|
actionBarProps,
|
|
46
79
|
columns,
|
|
47
80
|
currentCollection,
|
|
48
|
-
metadataTemplate
|
|
81
|
+
metadataTemplate,
|
|
82
|
+
onMetadataFilter,
|
|
83
|
+
onSortChange: onSortChangeInternal,
|
|
84
|
+
tableProps
|
|
49
85
|
} = _ref,
|
|
50
86
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
87
|
+
const {
|
|
88
|
+
formatMessage
|
|
89
|
+
} = useIntl();
|
|
51
90
|
const {
|
|
52
91
|
items = []
|
|
53
92
|
} = currentCollection;
|
|
54
93
|
const {
|
|
55
94
|
initialFilterValues: initialFilterValuesProp,
|
|
56
|
-
onFilterSubmit
|
|
95
|
+
onFilterSubmit
|
|
57
96
|
} = actionBarProps ?? {};
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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 || [];
|
|
72
117
|
|
|
73
|
-
|
|
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]);
|
|
74
143
|
const initialFilterValues = React.useMemo(() => transformInitialFilterValuesToInternal(initialFilterValuesProp), [initialFilterValuesProp]);
|
|
75
|
-
|
|
76
|
-
// Transform field values to public-friendly format
|
|
77
|
-
const onFilterSubmit = React.useCallback(fields => {
|
|
78
|
-
if (!onFilterSubmitProp) return;
|
|
144
|
+
const handleFilterSubmit = React.useCallback(fields => {
|
|
79
145
|
const transformed = transformInternalFieldsToPublic(fields);
|
|
80
|
-
|
|
81
|
-
|
|
146
|
+
onMetadataFilter(transformed);
|
|
147
|
+
if (onFilterSubmit) {
|
|
148
|
+
onFilterSubmit(transformed);
|
|
149
|
+
}
|
|
150
|
+
}, [onFilterSubmit, onMetadataFilter]);
|
|
82
151
|
const transformedActionBarProps = React.useMemo(() => {
|
|
83
152
|
return _objectSpread(_objectSpread({}, actionBarProps), {}, {
|
|
84
153
|
initialFilterValues,
|
|
85
|
-
onFilterSubmit,
|
|
154
|
+
onFilterSubmit: handleFilterSubmit,
|
|
86
155
|
filterGroups
|
|
87
156
|
});
|
|
88
|
-
}, [actionBarProps, initialFilterValues,
|
|
157
|
+
}, [actionBarProps, initialFilterValues, handleFilterSubmit, filterGroups]);
|
|
158
|
+
|
|
159
|
+
// Create a wrapper function that calls both. The wrapper function should follow the signature of onSortChange from RAC
|
|
160
|
+
const handleSortChange = React.useCallback(({
|
|
161
|
+
column,
|
|
162
|
+
direction
|
|
163
|
+
}) => {
|
|
164
|
+
// Call the internal onSortChange first
|
|
165
|
+
// API accepts asc/desc "https://developer.box.com/reference/post-metadata-queries-execute-read/"
|
|
166
|
+
if (onSortChangeInternal) {
|
|
167
|
+
const trimmedColumn = trimMetadataFieldPrefix(String(column));
|
|
168
|
+
onSortChangeInternal(trimmedColumn, direction === 'ascending' ? 'ASC' : 'DESC');
|
|
169
|
+
}
|
|
170
|
+
const onSortChangeExternal = tableProps?.onSortChange;
|
|
171
|
+
// Then call the original customer-provided onSortChange if it exists
|
|
172
|
+
// Accepts "ascending" / "descending" (https://react-spectrum.adobe.com/react-aria/Table.html)
|
|
173
|
+
if (onSortChangeExternal) {
|
|
174
|
+
onSortChangeExternal({
|
|
175
|
+
column,
|
|
176
|
+
direction
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}, [onSortChangeInternal, tableProps]);
|
|
180
|
+
|
|
181
|
+
// Create new tableProps with our wrapper function
|
|
182
|
+
const newTableProps = _objectSpread(_objectSpread({}, tableProps), {}, {
|
|
183
|
+
onSortChange: handleSortChange
|
|
184
|
+
});
|
|
89
185
|
return /*#__PURE__*/React.createElement(MetadataView, _extends({
|
|
90
186
|
actionBarProps: transformedActionBarProps,
|
|
91
|
-
columns:
|
|
92
|
-
items: items
|
|
187
|
+
columns: newColumns,
|
|
188
|
+
items: items,
|
|
189
|
+
tableProps: newTableProps
|
|
93
190
|
}, rest));
|
|
94
191
|
};
|
|
95
192
|
export default MetadataViewContainer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataViewContainer.js","names":["React","MetadataView","transformInitialFilterValuesToInternal","publicValues","undefined","Object","entries","reduce","acc","key","value","Array","isArray","enum","transformInternalFieldsToPublic","fields","MetadataViewContainer","_ref","actionBarProps","columns","currentCollection","metadataTemplate","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","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';\n\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\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}\n\nconst MetadataViewContainer = ({\n actionBarProps,\n columns,\n currentCollection,\n metadataTemplate,\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 return <MetadataView actionBarProps={transformedActionBarProps} columns={columns} items={items} {...rest} />;\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":[]}
|
|
@@ -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":[]}
|
|
@@ -8,6 +8,7 @@ import { Download, SignMeOthers } from '@box/blueprint-web-assets/icons/Fill/ind
|
|
|
8
8
|
import { Sign } from '@box/blueprint-web-assets/icons/Line';
|
|
9
9
|
import { expect, fn, userEvent, waitFor, within, screen } from 'storybook/test';
|
|
10
10
|
import noop from 'lodash/noop';
|
|
11
|
+
import orderBy from 'lodash/orderBy';
|
|
11
12
|
import ContentExplorer from '../../ContentExplorer';
|
|
12
13
|
import { DEFAULT_HOSTNAME_API } from '../../../../constants';
|
|
13
14
|
import { mockMetadata, mockSchema } from '../../../common/__mocks__/mockMetadata';
|
|
@@ -33,15 +34,11 @@ const metadataQuery = {
|
|
|
33
34
|
}],
|
|
34
35
|
fields: [
|
|
35
36
|
// Default to returning all fields in the metadata template schema, and name as a standalone (non-metadata) field
|
|
36
|
-
...mockSchema.fields.map(field => `${metadataFieldNamePrefix}.${field.key}`)
|
|
37
|
+
...mockSchema.fields.map(field => `${metadataFieldNamePrefix}.${field.key}`)]
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
// Used for metadata view v1
|
|
40
41
|
const fieldsToShow = [{
|
|
41
|
-
key: `${metadataFieldNamePrefix}.name`,
|
|
42
|
-
canEdit: false,
|
|
43
|
-
displayName: 'Alias'
|
|
44
|
-
}, {
|
|
45
42
|
key: `${metadataFieldNamePrefix}.industry`,
|
|
46
43
|
canEdit: true
|
|
47
44
|
}, {
|
|
@@ -53,15 +50,7 @@ const fieldsToShow = [{
|
|
|
53
50
|
}];
|
|
54
51
|
|
|
55
52
|
// Used for metadata view v2
|
|
56
|
-
const columns = [{
|
|
57
|
-
// Always include the name column
|
|
58
|
-
textValue: 'Name',
|
|
59
|
-
id: 'name',
|
|
60
|
-
type: 'string',
|
|
61
|
-
allowsSorting: true,
|
|
62
|
-
minWidth: 150,
|
|
63
|
-
maxWidth: 150
|
|
64
|
-
}, ...mockSchema.fields.map(field => ({
|
|
53
|
+
const columns = [...mockSchema.fields.map(field => ({
|
|
65
54
|
textValue: field.displayName,
|
|
66
55
|
id: `${metadataFieldNamePrefix}.${field.key}`,
|
|
67
56
|
type: field.type,
|
|
@@ -131,25 +120,20 @@ const metadataViewV2WithBulkItemActions = _objectSpread(_objectSpread({}, metada
|
|
|
131
120
|
export const metadataViewV2 = {
|
|
132
121
|
args: metadataViewV2ElementProps
|
|
133
122
|
};
|
|
134
|
-
|
|
135
|
-
// @TODO Assert that rows are actually sorted in a different order, once handleSortChange is implemented
|
|
136
123
|
export const metadataViewV2SortsFromHeader = {
|
|
137
124
|
args: metadataViewV2ElementProps,
|
|
138
125
|
play: async ({
|
|
139
126
|
canvas
|
|
140
127
|
}) => {
|
|
141
|
-
await
|
|
142
|
-
expect(canvas.getByRole('row', {
|
|
143
|
-
name: /Industry/i
|
|
144
|
-
})).toBeInTheDocument();
|
|
145
|
-
});
|
|
146
|
-
const firstRow = canvas.getByRole('row', {
|
|
147
|
-
name: /Industry/i
|
|
148
|
-
});
|
|
149
|
-
const industryHeader = within(firstRow).getByRole('columnheader', {
|
|
128
|
+
const industryHeader = await canvas.findByRole('columnheader', {
|
|
150
129
|
name: 'Industry'
|
|
151
130
|
});
|
|
152
|
-
|
|
131
|
+
expect(industryHeader).toBeInTheDocument();
|
|
132
|
+
const firstRow = await canvas.findByRole('row', {
|
|
133
|
+
name: /Child 2/i
|
|
134
|
+
});
|
|
135
|
+
expect(firstRow).toBeInTheDocument();
|
|
136
|
+
await userEvent.click(industryHeader);
|
|
153
137
|
}
|
|
154
138
|
};
|
|
155
139
|
export const metadataViewV2WithCustomActions = {
|
|
@@ -173,13 +157,13 @@ export const metadataViewV2WithCustomActions = {
|
|
|
173
157
|
};
|
|
174
158
|
const initialFilterActionBarProps = {
|
|
175
159
|
initialFilterValues: {
|
|
176
|
-
|
|
160
|
+
industry: {
|
|
177
161
|
value: ['Legal']
|
|
178
162
|
},
|
|
179
163
|
'mimetype-filter': {
|
|
180
164
|
value: ['boxnoteType', 'documentType', 'threedType']
|
|
181
165
|
},
|
|
182
|
-
|
|
166
|
+
role: {
|
|
183
167
|
value: ['Developer', 'Business Owner', 'Marketing']
|
|
184
168
|
}
|
|
185
169
|
}
|
|
@@ -263,6 +247,43 @@ export const metadataViewV2WithBulkItemActionMenuShowsItemActionMenu = {
|
|
|
263
247
|
expect(downloadAction).toBeInTheDocument();
|
|
264
248
|
}
|
|
265
249
|
};
|
|
250
|
+
export const sidePanelOpenWithMultipleItemsSelected = {
|
|
251
|
+
args: _objectSpread(_objectSpread({}, metadataViewV2ElementProps), {}, {
|
|
252
|
+
metadataViewProps: {
|
|
253
|
+
columns,
|
|
254
|
+
tableProps: {
|
|
255
|
+
isSelectAllEnabled: true
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}),
|
|
259
|
+
play: async ({
|
|
260
|
+
canvas
|
|
261
|
+
}) => {
|
|
262
|
+
await waitFor(() => {
|
|
263
|
+
expect(canvas.getByRole('row', {
|
|
264
|
+
name: /Child 2/i
|
|
265
|
+
})).toBeInTheDocument();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// Select the first row by clicking its checkbox
|
|
269
|
+
const firstItem = canvas.getByRole('row', {
|
|
270
|
+
name: /Child 2/i
|
|
271
|
+
});
|
|
272
|
+
const checkbox = within(firstItem).getByRole('checkbox');
|
|
273
|
+
await userEvent.click(checkbox);
|
|
274
|
+
|
|
275
|
+
// Select the second row by clicking its checkbox
|
|
276
|
+
const secondItem = canvas.getAllByRole('row', {
|
|
277
|
+
name: /Child 1/i
|
|
278
|
+
})[0];
|
|
279
|
+
const secondCheckbox = within(secondItem).getByRole('checkbox');
|
|
280
|
+
await userEvent.click(secondCheckbox);
|
|
281
|
+
const metadataButton = canvas.getByRole('button', {
|
|
282
|
+
name: 'Metadata'
|
|
283
|
+
});
|
|
284
|
+
await userEvent.click(metadataButton);
|
|
285
|
+
}
|
|
286
|
+
};
|
|
266
287
|
const meta = {
|
|
267
288
|
title: 'Elements/ContentExplorer/tests/MetadataView/visual',
|
|
268
289
|
component: ContentExplorer,
|
|
@@ -273,7 +294,22 @@ const meta = {
|
|
|
273
294
|
},
|
|
274
295
|
parameters: {
|
|
275
296
|
msw: {
|
|
276
|
-
handlers: [
|
|
297
|
+
handlers: [
|
|
298
|
+
// 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.
|
|
299
|
+
http.post(`${DEFAULT_HOSTNAME_API}/2.0/metadata_queries/execute_read`, async ({
|
|
300
|
+
request
|
|
301
|
+
}) => {
|
|
302
|
+
const body = await request.clone().json();
|
|
303
|
+
const orderByDirection = body.order_by[0].direction;
|
|
304
|
+
const orderByFieldKey = body.order_by[0].field_key;
|
|
305
|
+
|
|
306
|
+
// Hardcoded case for sorting by industry
|
|
307
|
+
if (orderByFieldKey === `industry` && orderByDirection === 'ASC') {
|
|
308
|
+
const sortedMetadata = orderBy(mockMetadata.entries, 'metadata.enterprise_0.templateName.industry', 'asc');
|
|
309
|
+
return HttpResponse.json(_objectSpread(_objectSpread({}, mockMetadata), {}, {
|
|
310
|
+
entries: sortedMetadata
|
|
311
|
+
}));
|
|
312
|
+
}
|
|
277
313
|
return HttpResponse.json(mockMetadata);
|
|
278
314
|
}), http.get(`${DEFAULT_HOSTNAME_API}/2.0/metadata_templates/enterprise/templateName/schema`, () => {
|
|
279
315
|
return HttpResponse.json(mockSchema);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MetadataView-visual.stories.js","names":["http","HttpResponse","Download","SignMeOthers","Sign","expect","fn","userEvent","waitFor","within","screen","noop","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","getByRole","name","toBeInTheDocument","firstRow","industryHeader","click","metadataViewV2WithCustomActions","ellipsesButton","initialFilterActionBarProps","initialFilterValues","value","metadataViewV2WithInitialFilterValues","actionBarProps","toHaveTextContent","contactRoleChip","fileTypeChip","sidePanelOpenWithSingleItemSelected","checkbox","metadataButton","metadataViewV2WithBulkItemActionMenuShowsItemActionMenu","findByRole","ellipsisButton","downloadAction","meta","title","component","global","FEATURE_FLAGS","rootFolderId","FOLDER_ID","token","TOKEN","parameters","msw","handlers","post","json","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';\nimport noop from 'lodash/noop';\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\n// @TODO Assert that rows are actually sorted in a different order, once handleSortChange is implemented\nexport const metadataViewV2SortsFromHeader: Story = {\n args: metadataViewV2ElementProps,\n play: async ({ canvas }) => {\n await waitFor(() => {\n expect(canvas.getByRole('row', { name: /Industry/i })).toBeInTheDocument();\n });\n\n const firstRow = canvas.getByRole('row', { name: /Industry/i });\n const industryHeader = within(firstRow).getByRole('columnheader', { name: 'Industry' });\n 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\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 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\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":[]}
|