Skip to content

Commit fdf8fa4

Browse files
committed
use ConfigProvider instead
1 parent 1020ad3 commit fdf8fa4

File tree

4 files changed

+171
-152
lines changed

4 files changed

+171
-152
lines changed

apps/kitchen-sink/src/ensemble/screens/widgets.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,8 @@ View:
526526
hasDivider: true
527527
borderBottom: false
528528
hidePagination: true
529+
allowSelection: true
530+
hideSelectAll: true
529531
DataColumns:
530532
- label: Number
531533
scroll:
@@ -540,6 +542,10 @@ View:
540542
name: dummyData
541543
template:
542544
DataRow:
545+
styles:
546+
backgroundColor: lime
547+
rowHoverStyle:
548+
backgroundColor: yellow
543549
children:
544550
- Text:
545551
id: ${'x_'+index}

packages/runtime/src/widgets/Collapsible.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,12 @@ export const Collapsible: React.FC<CollapsibleProps> = (props) => {
233233
expandIconPosition={props.expandIconPosition}
234234
items={[...collapsibleItems, ...templateItems]}
235235
onChange={handleCollapsibleChange}
236+
style={{
237+
...values?.styles,
238+
...(values?.styles?.visible === false
239+
? { display: "none" }
240+
: undefined),
241+
}}
236242
/>
237243
</ConfigProvider>
238244
);

packages/runtime/src/widgets/DataGrid/DataGrid.tsx

Lines changed: 157 additions & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Table, type TableProps } from "antd";
1+
import { Table, type TableProps, ConfigProvider } from "antd";
22
import type { SorterResult } from "antd/es/table/interface";
33
import isEqual from "react-fast-compare";
44
import {
@@ -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

123127
function 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

Comments
 (0)