1- import { Table , type TableProps } from "antd" ;
1+ import { Table , type TableProps , ConfigProvider } from "antd" ;
22import type { SorterResult } from "antd/es/table/interface" ;
33import isEqual from "react-fast-compare" ;
44import {
@@ -65,7 +65,13 @@ interface DataColumn {
6565 visible ?: boolean ;
6666}
6767
68- export interface DataGridStyles extends Partial < EnsembleWidgetStyles > {
68+ export interface DataGridStyles
69+ extends Partial <
70+ EnsembleWidgetStyles & {
71+ rowHoverBg ?: Expression < string > ;
72+ rowSelectedHoverBg ?: Expression < string > ;
73+ }
74+ > {
6975 headerStyle ?: {
7076 backgroundColor ?: Expression < string > ;
7177 fontSize ?: Expression < string > ;
@@ -85,7 +91,6 @@ export interface DataGridRowTemplate {
8591 onTap ?: EnsembleAction ;
8692 children ?: EnsembleWidget [ ] ;
8793 styles ?: EnsembleWidgetStyles ;
88- rowHoverStyle ?: EnsembleWidgetStyles ;
8994 } & HasItemTemplate ;
9095}
9196
@@ -117,7 +122,6 @@ export type GridProps = {
117122 totalRows ?: number ;
118123 curPage ?: number ;
119124 virtual ?: boolean ;
120- hideSelectAll ?: boolean ;
121125} & EnsembleWidgetProps < DataGridStyles > ;
122126
123127function djb2Hash ( str : string ) : number {
@@ -367,7 +371,6 @@ export const DataGrid: React.FC<GridProps> = (props) => {
367371 pageSize,
368372 curPage,
369373 widgetName,
370- rowHoverStyle : itemTemplate . template . properties . rowHoverStyle ,
371374 } ,
372375 props . id ,
373376 {
@@ -379,7 +382,6 @@ export const DataGrid: React.FC<GridProps> = (props) => {
379382 } ,
380383 ) ;
381384 const headerStyle = values ?. styles ?. headerStyle ;
382- const rowHoverStyle = values ?. rowHoverStyle ;
383385
384386 useEffect ( ( ) => {
385387 setPageSize ( values ?. pageSize || 10 ) ;
@@ -517,140 +519,158 @@ export const DataGrid: React.FC<GridProps> = (props) => {
517519 return (
518520 < div id = { resolvedWidgetId } ref = { containerRef } >
519521 < div ref = { rootRef } >
520- < Table
521- components = { components }
522- dataSource = { namedData }
523- key = { resolvedWidgetId }
524- onChange = { onChange }
525- onRow = { ( record , recordIndex ) => ( {
526- "data-index" : recordIndex ,
527- "data-record" : record ,
528- "data-styles" : itemTemplate . template . properties . styles ,
529- onClick : itemTemplate . template . properties . onTap
530- ? ( ) : unknown => onTapActionCallback ( record , recordIndex )
531- : undefined ,
532- } ) }
533- pagination = { paginationObject }
534- rowKey = { ( data : unknown ) => {
535- const identifier : string = evaluate (
536- defaultScreenContext ,
537- itemTemplate . key ,
538- {
539- [ itemTemplate . name ] : get ( data , itemTemplate . name ) as unknown ,
522+ < ConfigProvider
523+ theme = { {
524+ components : {
525+ Table : {
526+ rowHoverBg : values ?. styles ?. rowHoverBg ,
527+ rowSelectedHoverBg : values ?. styles ?. rowSelectedHoverBg ,
540528 } ,
541- ) ;
542- if ( identifier ) {
543- return identifier ;
544- }
545- const res = djb2Hash ( JSON . stringify ( data ) ) ;
546- return String ( res ) ;
547- } }
548- rowSelection = {
549- allowSelection
550- ? {
551- columnWidth : values ?. selectionColWidth ,
552- type : selectionType ,
553- onChange : ( selectedRowKeys , selectedRows ) : void => {
554- setRowsKey ( selectedRowKeys ) ;
555- setRowsSelected ( selectedRows ) ;
556- if ( rest . onRowsSelected ) {
557- onRowsSelectedCallback ( selectedRowKeys , selectedRows ) ;
558- }
559- } ,
560- getCheckboxProps : ( record ) => {
561- return {
562- disabled : handleRowSelectableOrNot ( record ) ,
563- } ;
564- } ,
565- defaultSelectedRowKeys : values ?. defaultSelectedRowKeys ,
566- selectedRowKeys : rowsKey . length ? rowsKey : undefined ,
567- hideSelectAll : values ?. hideSelectAll ,
568- }
569- : undefined
570- }
571- scroll = {
572- values ?. scroll
573- ? {
574- y : values . scroll . scrollHeight ,
575- x : values . scroll . scrollWidth || "max-content" ,
576- }
577- : undefined
578- }
579- style = { {
580- width : "100%" ,
581- ...values ?. styles ,
582- ...( values ?. styles ?. visible === false
583- ? { display : "none" }
584- : undefined ) ,
529+ } ,
585530 } }
586- tableLayout = "auto"
587- virtual = { values ?. virtual }
588531 >
589- { dataColumns . map ( ( col , colIndex ) => {
590- return (
591- < Table . Column
592- dataIndex = { itemTemplate . name }
593- filters = { col . filter ?. values . map ( ( { label, value } ) => ( {
594- text : label ,
595- value,
596- } ) ) }
597- hidden = { col . visible === false }
598- key = { colIndex }
599- minWidth = { col . width ?? 100 }
600- onFilter = {
601- col . filter ?. onFilter
602- ? ( value , record ) : boolean =>
603- Boolean (
604- evaluate ( defaultScreenContext , col . filter ?. onFilter , {
605- value,
606- record,
607- [ itemTemplate . name ] : get (
608- record ,
609- itemTemplate . name ,
610- ) as unknown ,
611- } ) ,
612- )
613- : undefined
614- }
615- onHeaderCell = {
616- values ?. allowResizableColumns
617- ? ( ) => ( {
618- width : col . width ,
619- onResize : handleResize (
620- colIndex ,
621- ) as ReactEventHandler < any > ,
622- } )
623- : undefined
624- }
625- render = { ( _ , record , rowIndex ) : ReactElement => {
626- return (
627- < DataCell
628- columnIndex = { colIndex }
629- data = { record }
630- rowIndex = { rowIndex }
631- scopeName = { itemTemplate . name }
632- template = { itemTemplate . template }
633- />
634- ) ;
635- } }
636- shouldCellUpdate = { ( record , prev ) => ! isEqual ( record , prev ) }
637- sorter = {
638- col . sort ?. compareFn
639- ? ( a , b ) : number =>
640- Number (
641- evaluate ( defaultScreenContext , col . sort ?. compareFn , {
642- a,
643- b,
644- } ) ,
645- )
646- : undefined
647- }
648- title = { col . label as string | React . ReactNode }
649- width = { col . width }
650- />
651- ) ;
652- } ) }
653- </ Table >
532+ < Table
533+ components = { components }
534+ dataSource = { namedData }
535+ key = { resolvedWidgetId }
536+ onChange = { onChange }
537+ onRow = { ( record , recordIndex ) => ( {
538+ "data-index" : recordIndex ,
539+ "data-record" : record ,
540+ "data-styles" : itemTemplate . template . properties . styles ,
541+ onClick : itemTemplate . template . properties . onTap
542+ ? ( ) : unknown => onTapActionCallback ( record , recordIndex )
543+ : undefined ,
544+ } ) }
545+ pagination = { paginationObject }
546+ rowKey = { ( data : unknown ) => {
547+ const identifier : string = evaluate (
548+ defaultScreenContext ,
549+ itemTemplate . key ,
550+ {
551+ [ itemTemplate . name ] : get ( data , itemTemplate . name ) as unknown ,
552+ } ,
553+ ) ;
554+ if ( identifier ) {
555+ return identifier ;
556+ }
557+ const res = djb2Hash ( JSON . stringify ( data ) ) ;
558+ return String ( res ) ;
559+ } }
560+ rowSelection = {
561+ allowSelection
562+ ? {
563+ columnWidth : values ?. selectionColWidth ,
564+ type : selectionType ,
565+ onChange : ( selectedRowKeys , selectedRows ) : void => {
566+ setRowsKey ( selectedRowKeys ) ;
567+ setRowsSelected ( selectedRows ) ;
568+ if ( rest . onRowsSelected ) {
569+ onRowsSelectedCallback ( selectedRowKeys , selectedRows ) ;
570+ }
571+ } ,
572+ getCheckboxProps : ( record ) => {
573+ return {
574+ disabled : handleRowSelectableOrNot ( record ) ,
575+ } ;
576+ } ,
577+ defaultSelectedRowKeys : values ?. defaultSelectedRowKeys ,
578+ selectedRowKeys : rowsKey . length ? rowsKey : undefined ,
579+ }
580+ : undefined
581+ }
582+ scroll = {
583+ values ?. scroll
584+ ? {
585+ y : values . scroll . scrollHeight ,
586+ x : values . scroll . scrollWidth || "max-content" ,
587+ }
588+ : undefined
589+ }
590+ style = { {
591+ width : "100%" ,
592+ ...values ?. styles ,
593+ ...( values ?. styles ?. visible === false
594+ ? { display : "none" }
595+ : undefined ) ,
596+ } }
597+ tableLayout = "auto"
598+ virtual = { values ?. virtual }
599+ >
600+ { dataColumns . map ( ( col , colIndex ) => {
601+ return (
602+ < Table . Column
603+ dataIndex = { itemTemplate . name }
604+ filters = { col . filter ?. values . map ( ( { label, value } ) => ( {
605+ text : label ,
606+ value,
607+ } ) ) }
608+ hidden = { col . visible === false }
609+ key = { colIndex }
610+ minWidth = { col . width ?? 100 }
611+ onFilter = {
612+ col . filter ?. onFilter
613+ ? ( value , record ) : boolean =>
614+ Boolean (
615+ evaluate (
616+ defaultScreenContext ,
617+ col . filter ?. onFilter ,
618+ {
619+ value,
620+ record,
621+ [ itemTemplate . name ] : get (
622+ record ,
623+ itemTemplate . name ,
624+ ) as unknown ,
625+ } ,
626+ ) ,
627+ )
628+ : undefined
629+ }
630+ onHeaderCell = {
631+ values ?. allowResizableColumns
632+ ? ( ) => ( {
633+ width : col . width ,
634+ onResize : handleResize (
635+ colIndex ,
636+ ) as ReactEventHandler < any > ,
637+ } )
638+ : undefined
639+ }
640+ render = { ( _ , record , rowIndex ) : ReactElement => {
641+ return (
642+ < DataCell
643+ columnIndex = { colIndex }
644+ data = { record }
645+ rowIndex = { rowIndex }
646+ scopeName = { itemTemplate . name }
647+ template = { itemTemplate . template }
648+ />
649+ ) ;
650+ } }
651+ shouldCellUpdate = { ( record , prev ) => ! isEqual ( record , prev ) }
652+ sorter = {
653+ col . sort ?. compareFn
654+ ? ( a , b ) : number =>
655+ Number (
656+ evaluate (
657+ defaultScreenContext ,
658+ col . sort ?. compareFn ,
659+ {
660+ a,
661+ b,
662+ } ,
663+ ) ,
664+ )
665+ : undefined
666+ }
667+ title = { col . label as string | React . ReactNode }
668+ width = { col . width }
669+ />
670+ ) ;
671+ } ) }
672+ </ Table >
673+ </ ConfigProvider >
654674 < style >
655675 { `
656676 .react-resizable {
@@ -708,20 +728,6 @@ export const DataGrid: React.FC<GridProps> = (props) => {
708728 ! headerStyle ?. borderBottom ? "border-bottom: none !important" : ""
709729 }
710730 }
711-
712- ${
713- rowHoverStyle
714- ? `#${ resolvedWidgetId } .ant-table-tbody > tr > td {
715- transition: all 0.2s ease-in-out;
716- }
717- #${ resolvedWidgetId } .ant-table-tbody > tr:hover > td {
718- ${ getComponentStyles ( "" , rowHoverStyle , true , true ) }
719- }
720- #${ resolvedWidgetId } .ant-table-tbody > tr.ant-table-row:hover > td {
721- ${ getComponentStyles ( "" , rowHoverStyle , true , true ) }
722- }`
723- : ""
724- }
725731 ` }
726732 </ style >
727733 </ div >
0 commit comments