@@ -12,6 +12,7 @@ import React, { type ReactElement, type ReactNode } from 'react'
1212import type { EntityAccessor , EntityDef , EnumFilterArtifact , EnumListFilterArtifact , FieldRef } from '@contember/bindx'
1313import {
1414 createColumn ,
15+ createColumnStaticRender ,
1516 createRelationColumn ,
1617 hasOneCellConfig ,
1718 hasManyCellConfig ,
@@ -99,9 +100,33 @@ function renderDateTimeDefault({ value }: ColumnRenderProps<string | null>): Rea
99100 return date . toLocaleString ( )
100101}
101102
102- function renderEnumListDefault ( { value } : ColumnRenderProps < readonly string [ ] | null > ) : React . ReactNode {
103+ function EnumCellLabel ( { value, enumOptions, enumName } : {
104+ value : string
105+ enumOptions : Readonly < Record < string , ReactNode > > | undefined
106+ enumName : string | undefined
107+ } ) : ReactNode {
108+ const formatter = useEnumOptionsFormatter ( )
109+ if ( enumOptions ?. [ value ] != null ) return enumOptions [ value ]
110+ if ( enumName ) {
111+ const resolved = formatter ( enumName )
112+ if ( resolved [ value ] != null ) return resolved [ value ]
113+ }
114+ return value
115+ }
116+
117+ function renderEnumDefault ( { value, enumOptions, enumName } : ColumnRenderProps < string | null > ) : ReactNode {
118+ if ( value == null ) return ''
119+ return < EnumCellLabel value = { value } enumOptions = { enumOptions } enumName = { enumName } />
120+ }
121+
122+ function renderEnumListDefault ( { value, enumOptions, enumName } : ColumnRenderProps < readonly string [ ] | null > ) : ReactNode {
103123 if ( ! Array . isArray ( value ) ) return ''
104- return value . join ( ', ' )
124+ return value . map ( ( v , i ) => (
125+ < React . Fragment key = { i } >
126+ { i > 0 ? ', ' : null }
127+ < EnumCellLabel value = { v } enumOptions = { enumOptions } enumName = { enumName } />
128+ </ React . Fragment >
129+ ) )
105130}
106131
107132function ColumnEnumFilterControls ( ) : ReactElement {
@@ -152,41 +177,45 @@ export const DataGridBooleanColumn = createColumn(booleanColumnDef, {
152177 renderFilter : ( ) => < DataGridBooleanFilterControls /> ,
153178} )
154179
155- const _DataGridEnumColumn = createColumn ( enumColumnDef , {
156- renderCell : renderScalarDefault ,
157- renderFilter : ( ) => < ColumnEnumFilterControls /> ,
158- } )
159-
160180type ExtractEnum < F > = F extends FieldRef < infer T > ? Exclude < T , null | undefined > & string : string
161181
162- export const DataGridEnumColumn = < F extends FieldRef < any > > ( props : {
163- field : F
164- header ?: ReactNode
165- sortable ?: boolean
166- filter ?: boolean
167- children ?: ( value : ExtractEnum < F > | null , accessor : EntityAccessor < object > ) => ReactNode
168- options ?: { [ K in ExtractEnum < F > ] ?: ReactNode }
169- } ) : ReactNode => null
170- DataGridEnumColumn . staticRender = _DataGridEnumColumn . staticRender
171-
172- const _DataGridEnumListColumn = createColumn ( enumListColumnDef , {
173- renderCell : renderEnumListDefault ,
174- renderFilter : ( ) => < ColumnEnumFilterControls /> ,
175- } )
182+ export const DataGridEnumColumn = Object . assign (
183+ < F extends FieldRef < any > > ( _props : {
184+ field : F
185+ header ?: ReactNode
186+ sortable ?: boolean
187+ filter ?: boolean
188+ children ?: ( value : ExtractEnum < F > | null , accessor : EntityAccessor < object > ) => ReactNode
189+ options ?: { [ K in ExtractEnum < F > ] ?: ReactNode }
190+ } ) : ReactNode => null ,
191+ {
192+ staticRender : createColumnStaticRender ( enumColumnDef , {
193+ renderCell : renderEnumDefault ,
194+ renderFilter : ( ) => < ColumnEnumFilterControls /> ,
195+ } ) ,
196+ } ,
197+ )
176198
177199type ExtractEnumList < F > = F extends FieldRef < infer T >
178200 ? T extends readonly ( infer U ) [ ] | null ? U & string : string
179201 : string
180202
181- export const DataGridEnumListColumn = < F extends FieldRef < any > > ( props : {
182- field : F
183- header ?: ReactNode
184- sortable ?: boolean
185- filter ?: boolean
186- children ?: ( value : ExtractEnumList < F > [ ] | null , accessor : EntityAccessor < object > ) => ReactNode
187- options ?: { [ K in ExtractEnumList < F > ] ?: ReactNode }
188- } ) : ReactNode => null
189- DataGridEnumListColumn . staticRender = _DataGridEnumListColumn . staticRender
203+ export const DataGridEnumListColumn = Object . assign (
204+ < F extends FieldRef < any > > ( _props : {
205+ field : F
206+ header ?: ReactNode
207+ sortable ?: boolean
208+ filter ?: boolean
209+ children ?: ( value : ExtractEnumList < F > [ ] | null , accessor : EntityAccessor < object > ) => ReactNode
210+ options ?: { [ K in ExtractEnumList < F > ] ?: ReactNode }
211+ } ) : ReactNode => null ,
212+ {
213+ staticRender : createColumnStaticRender ( enumListColumnDef , {
214+ renderCell : renderEnumListDefault ,
215+ renderFilter : ( ) => < ColumnEnumFilterControls /> ,
216+ } ) ,
217+ } ,
218+ )
190219
191220export const DataGridUuidColumn = createColumn ( uuidColumnDef , {
192221 renderCell : renderScalarDefault ,
0 commit comments