11import * as React from 'react' ;
2+ import type { EnumType , FloatType , MetadataFormFieldValue , RangeType } from '@box/metadata-filter' ;
23import { MetadataView , type MetadataViewProps } from '@box/metadata-view' ;
3- import { FloatType , MetadataFormFieldValue , RangeType } from '@box/metadata-filter' ;
44
5- import type { MetadataTemplate } from '../../common/types/metadata' ;
65import type { Collection } from '../../common/types/core' ;
6+ import type { MetadataTemplate } from '../../common/types/metadata' ;
77
8- // Public-friendly metadata value shape (array value for enum type, range/float objects stay the same)
9- export type MetadataFormFieldValuePublic = string [ ] | RangeType | FloatType ;
8+ // Public-friendly version of MetadataFormFieldValue from @box/metadata-filter
9+ // (string[] for enum type, range/float objects stay the same)
10+ type EnumToStringArray < T > = T extends EnumType ? string [ ] : T ;
11+ type ExternalMetadataFormFieldValue = EnumToStringArray < MetadataFormFieldValue > ;
1012
11- export type FilterValuesPublic = Record <
13+ type ExternalFilterValues = Record <
1214 string ,
1315 {
14- value : MetadataFormFieldValuePublic ;
16+ value : ExternalMetadataFormFieldValue ;
1517 }
1618> ;
1719
18- export type ActionBarProps = Omit <
20+ type ActionBarProps = Omit <
1921 MetadataViewProps [ 'actionBarProps' ] ,
2022 'initialFilterValues' | 'onFilterSubmit' | 'filterGroups'
2123> & {
22- initialFilterValues ?: FilterValuesPublic ;
23- onFilterSubmit ?: ( filterValues : FilterValuesPublic ) => void ;
24+ initialFilterValues ?: ExternalFilterValues ;
25+ onFilterSubmit ?: ( filterValues : ExternalFilterValues ) => void ;
2426} ;
2527
28+ function transformInitialFilterValuesToInternal (
29+ publicValues ?: ExternalFilterValues ,
30+ ) : Record < string , { value : MetadataFormFieldValue } > | undefined {
31+ if ( ! publicValues ) return undefined ;
32+
33+ return Object . entries ( publicValues ) . reduce < Record < string , { value : MetadataFormFieldValue } > > (
34+ ( acc , [ key , { value } ] ) => {
35+ acc [ key ] = Array . isArray ( value ) ? { value : { enum : value } } : { value } ;
36+ return acc ;
37+ } ,
38+ { } ,
39+ ) ;
40+ }
41+
42+ function transformInternalFieldsToPublic (
43+ fields : Record < string , { value : MetadataFormFieldValue } > ,
44+ ) : ExternalFilterValues {
45+ return Object . entries ( fields ) . reduce < ExternalFilterValues > ( ( acc , [ key , { value } ] ) => {
46+ acc [ key ] =
47+ 'enum' in value && Array . isArray ( value . enum )
48+ ? { value : value . enum }
49+ : { value : value as RangeType | FloatType } ;
50+ return acc ;
51+ } , { } ) ;
52+ }
53+
2654export interface MetadataViewContainerProps extends Omit < MetadataViewProps , 'items' | 'actionBarProps' > {
2755 actionBarProps ?: ActionBarProps ;
2856 currentCollection : Collection ;
@@ -37,6 +65,7 @@ const MetadataViewContainer = ({
3765 ...rest
3866} : MetadataViewContainerProps ) => {
3967 const { items = [ ] } = currentCollection ;
68+ const { initialFilterValues : initialFilterValuesProp , onFilterSubmit : onFilterSubmitProp } = actionBarProps ?? { } ;
4069
4170 const filterGroups = React . useMemo (
4271 ( ) => [
@@ -58,41 +87,19 @@ const MetadataViewContainer = ({
5887 ) ;
5988
6089 // Transform initial filter values to internal field format
61- const initialFilterValues = React . useMemo ( ( ) => {
62- const filterValues = actionBarProps ?. initialFilterValues ;
63- if ( ! filterValues ) return undefined ;
64-
65- const transformed : Record < string , { value : MetadataFormFieldValue } > = { } ;
66- Object . entries ( filterValues ) . forEach ( ( [ key , filterValue ] ) => {
67- const { value } = filterValue ;
68- if ( Array . isArray ( value ) ) {
69- // Convert customer-friendly array to internal enum shape
70- transformed [ key ] = { value : { enum : value } } ;
71- } else {
72- // Keep range/float as-is
73- transformed [ key ] = { value } ;
74- }
75- } ) ;
76- return transformed ;
77- } , [ actionBarProps ?. initialFilterValues ] ) ;
90+ const initialFilterValues = React . useMemo (
91+ ( ) => transformInitialFilterValuesToInternal ( initialFilterValuesProp ) ,
92+ [ initialFilterValuesProp ] ,
93+ ) ;
7894
7995 // Transform field values to public-friendly format
8096 const onFilterSubmit = React . useCallback (
8197 ( fields : Record < string , { value : MetadataFormFieldValue } > ) => {
82- if ( ! actionBarProps ?. onFilterSubmit ) return ;
83-
84- const transformed : Record < string , { value : MetadataFormFieldValuePublic } > = { } ;
85- Object . entries ( fields ) . forEach ( ( [ key , filterValue ] ) => {
86- const { value } = filterValue ;
87- if ( value && typeof value === 'object' && 'enum' in value && Array . isArray ( value . enum ) ) {
88- transformed [ key ] = { value : value . enum } ;
89- } else {
90- transformed [ key ] = { value : value as RangeType | FloatType } ;
91- }
92- } ) ;
93- actionBarProps . onFilterSubmit ( transformed ) ;
98+ if ( ! onFilterSubmitProp ) return ;
99+ const transformed = transformInternalFieldsToPublic ( fields ) ;
100+ onFilterSubmitProp ( transformed ) ;
94101 } ,
95- [ actionBarProps ] ,
102+ [ onFilterSubmitProp ] ,
96103 ) ;
97104
98105 const transformedActionBarProps = React . useMemo ( ( ) => {
0 commit comments