@@ -26,6 +26,42 @@ const StyledTableCell = styled.td<{
2626 ${ ( { $isFirstRow } ) => $isFirstRow && 'border-top: none' }
2727`
2828
29+ const isEmptyValue = ( value : unknown , columnType ?: ColumnType ) : boolean => {
30+ if ( value == null ) return true
31+
32+ if ( typeof value === 'string' && value . trim ( ) === '' ) return true
33+
34+ if ( typeof value === 'number' && value === 0 ) return true
35+
36+ if ( columnType === ColumnType . DROPDOWN ) {
37+ const dropdownData = value as DropdownColumnProps
38+ if (
39+ ! dropdownData ||
40+ ! dropdownData . options ||
41+ ! dropdownData . selectedValue ||
42+ ( typeof dropdownData . selectedValue === 'string' &&
43+ dropdownData . selectedValue . trim ( ) === '' )
44+ ) {
45+ return true
46+ }
47+ }
48+
49+ if ( columnType === ColumnType . DATE ) {
50+ const dateData = value as DateColumnProps
51+ if (
52+ ! dateData ||
53+ ! dateData . date ||
54+ ( typeof dateData . date === 'string' &&
55+ dateData . date . trim ( ) === '' ) ||
56+ isNaN ( new Date ( dateData . date ) . getTime ( ) )
57+ ) {
58+ return true
59+ }
60+ }
61+
62+ return false
63+ }
64+
2965const TruncatedTextWithTooltip = ( {
3066 text,
3167 style = { } ,
@@ -193,78 +229,68 @@ const TableCell = forwardRef<
193229
194230 if ( column . type === ColumnType . DROPDOWN && ! isEditing ) {
195231 const dropdownData = displayValue as DropdownColumnProps
196- if ( dropdownData && dropdownData . options ) {
197- const selectedOption = dropdownData . options . find (
198- ( opt ) => opt . value === dropdownData . selectedValue
199- )
200-
201- const selectItems : SelectMenuGroupType [ ] = [
202- {
203- items : dropdownData . options . map ( ( option ) => ( {
204- label : option . label ,
205- value : String ( option . value ) ,
206- slot1 : option . icon || undefined ,
207- } ) ) ,
208- showSeparator : false ,
209- } ,
210- ]
211232
233+ if ( isEmptyValue ( dropdownData , ColumnType . DROPDOWN ) ) {
212234 return (
213- < div style = { { width : '100%' , minWidth : '150px' } } >
214- < SingleSelect
215- label = ""
216- placeholder = {
217- dropdownData . placeholder || 'Select...'
218- }
219- variant = { SelectMenuVariant . NO_CONTAINER }
220- items = { selectItems }
221- selected = { String (
222- dropdownData . selectedValue || ''
223- ) }
224- slot = { selectedOption ?. icon }
225- onSelect = { ( value ) => {
226- const updatedDropdownData : DropdownColumnProps =
227- {
228- ...dropdownData ,
229- selectedValue : value ,
230- }
231- if ( onFieldChange ) {
232- onFieldChange ( updatedDropdownData )
233- }
234- } }
235- minMenuWidth = { 150 }
236- maxMenuWidth = { 250 }
237- />
238- </ div >
235+ < Block
236+ style = { {
237+ width : '100%' ,
238+ lineHeight : '1.5' ,
239+ cursor : 'default' ,
240+ } }
241+ >
242+ < TruncatedTextWithTooltip text = "-" />
243+ </ Block >
239244 )
240245 }
241- }
242246
243- if ( column . type === ColumnType . DATE && ! isEditing ) {
244- const dateData = displayValue as DateColumnProps
245- if ( dateData && dateData . date ) {
246- const date = new Date ( dateData . date )
247- const showTime = dateData . showTime || false
248-
249- const formatDate = ( date : Date ) : string => {
250- if ( isNaN ( date . getTime ( ) ) ) return 'Invalid Date'
247+ const selectedOption = dropdownData . options . find (
248+ ( opt ) => opt . value === dropdownData . selectedValue
249+ )
251250
252- const options : Intl . DateTimeFormatOptions = {
253- year : 'numeric' ,
254- month : 'short' ,
255- day : '2-digit' ,
256- }
251+ const selectItems : SelectMenuGroupType [ ] = [
252+ {
253+ items : dropdownData . options . map ( ( option ) => ( {
254+ label : option . label ,
255+ value : String ( option . value ) ,
256+ slot1 : option . icon || undefined ,
257+ } ) ) ,
258+ showSeparator : false ,
259+ } ,
260+ ]
257261
258- if ( showTime ) {
259- options . hour = '2-digit'
260- options . minute = '2-digit'
261- }
262+ return (
263+ < div style = { { width : '100%' , minWidth : '150px' } } >
264+ < SingleSelect
265+ label = ""
266+ placeholder = {
267+ dropdownData . placeholder || 'Select...'
268+ }
269+ variant = { SelectMenuVariant . NO_CONTAINER }
270+ items = { selectItems }
271+ selected = { String ( dropdownData . selectedValue || '' ) }
272+ slot = { selectedOption ?. icon }
273+ onSelect = { ( value ) => {
274+ const updatedDropdownData : DropdownColumnProps =
275+ {
276+ ...dropdownData ,
277+ selectedValue : value ,
278+ }
279+ if ( onFieldChange ) {
280+ onFieldChange ( updatedDropdownData )
281+ }
282+ } }
283+ minMenuWidth = { 150 }
284+ maxMenuWidth = { 250 }
285+ />
286+ </ div >
287+ )
288+ }
262289
263- return new Intl . DateTimeFormat ( 'en-US' , options ) . format (
264- date
265- )
266- }
290+ if ( column . type === ColumnType . DATE && ! isEditing ) {
291+ const dateData = displayValue as DateColumnProps
267292
293+ if ( isEmptyValue ( dateData , ColumnType . DATE ) ) {
268294 return (
269295 < Block
270296 style = { {
@@ -273,18 +299,51 @@ const TableCell = forwardRef<
273299 cursor : 'default' ,
274300 } }
275301 >
276- < TruncatedTextWithTooltip
277- text = { formatDate ( date ) }
278- style = { {
279- fontSize :
280- FOUNDATION_THEME . font . size . body . sm
281- . fontSize ,
282- color : FOUNDATION_THEME . colors . gray [ 700 ] ,
283- } }
284- />
302+ < TruncatedTextWithTooltip text = "-" />
285303 </ Block >
286304 )
287305 }
306+
307+ const date = new Date ( dateData . date )
308+ const showTime = dateData . showTime || false
309+
310+ const formatDate = ( date : Date ) : string => {
311+ if ( isNaN ( date . getTime ( ) ) ) return '-'
312+
313+ const options : Intl . DateTimeFormatOptions = {
314+ year : 'numeric' ,
315+ month : 'short' ,
316+ day : '2-digit' ,
317+ }
318+
319+ if ( showTime ) {
320+ options . hour = '2-digit'
321+ options . minute = '2-digit'
322+ }
323+
324+ return new Intl . DateTimeFormat ( 'en-US' , options ) . format (
325+ date
326+ )
327+ }
328+
329+ return (
330+ < Block
331+ style = { {
332+ width : '100%' ,
333+ lineHeight : '1.5' ,
334+ cursor : 'default' ,
335+ } }
336+ >
337+ < TruncatedTextWithTooltip
338+ text = { formatDate ( date ) }
339+ style = { {
340+ fontSize :
341+ FOUNDATION_THEME . font . size . body . sm . fontSize ,
342+ color : FOUNDATION_THEME . colors . gray [ 700 ] ,
343+ } }
344+ />
345+ </ Block >
346+ )
288347 }
289348
290349 if ( column . renderCell ) {
@@ -301,6 +360,20 @@ const TableCell = forwardRef<
301360 )
302361 }
303362
363+ if ( isEmptyValue ( displayValue , column . type ) ) {
364+ return (
365+ < Block
366+ style = { {
367+ width : '100%' ,
368+ lineHeight : '1.5' ,
369+ cursor : 'default' ,
370+ } }
371+ >
372+ < TruncatedTextWithTooltip text = "-" />
373+ </ Block >
374+ )
375+ }
376+
304377 return (
305378 < Block
306379 style = { {
@@ -309,9 +382,7 @@ const TableCell = forwardRef<
309382 cursor : 'default' ,
310383 } }
311384 >
312- < TruncatedTextWithTooltip
313- text = { displayValue != null ? String ( displayValue ) : '' }
314- />
385+ < TruncatedTextWithTooltip text = { String ( displayValue ) } />
315386 </ Block >
316387 )
317388 }
0 commit comments