diff --git a/app/client/src/components/designSystems/appsmith/TableComponent.tsx b/app/client/src/components/designSystems/appsmith/TableComponent.tsx
new file mode 100644
index 0000000000..67a94672e6
--- /dev/null
+++ b/app/client/src/components/designSystems/appsmith/TableComponent.tsx
@@ -0,0 +1,67 @@
+import BaseTable, { Column } from "react-base-table";
+import styled from "styled-components";
+import React from "react";
+import { noop } from "../../../utils/AppsmithUtils";
+
+const StyledTable = styled(BaseTable)`
+ .row-selected {
+ background-color: ${props =>
+ props.theme.widgets.tableWidget.selectHighlightColor};
+ }
+`;
+
+export interface Column {
+ key: string;
+ dataKey: string;
+ title: string;
+ width: number;
+}
+
+export interface ReactBaseTableProps {
+ width: number;
+ height: number;
+ columns: Column[];
+ data: object[];
+ maxHeight: number;
+ selectedRowIndex?: number;
+}
+
+export interface SelectableTableProps extends ReactBaseTableProps {
+ onRowClick: (rowData: object, rowIndex: number) => void;
+}
+
+export default class SelectableTable extends React.PureComponent<
+ SelectableTableProps
+> {
+ static defaultProps = {};
+
+ _onClick = ({ rowData, rowIndex }: { rowData: object; rowIndex: number }) => {
+ if (this.props.selectedRowIndex !== rowIndex) {
+ this.props.onRowClick(rowData, rowIndex);
+ }
+ };
+
+ _rowClassName = ({ rowIndex }: { rowIndex: number }) => {
+ const { selectedRowIndex } = this.props;
+ return selectedRowIndex === rowIndex ? "row-selected" : "";
+ };
+
+ render() {
+ const { onRowClick, ...rest } = this.props;
+ return (
+
+ );
+ }
+}
+
+SelectableTable.defaultProps = {
+ ...BaseTable.defaultProps,
+ onRowSelect: noop,
+ onSelectedRowsChange: noop,
+};
diff --git a/app/client/src/constants/DefaultTheme.tsx b/app/client/src/constants/DefaultTheme.tsx
index 7bd30f7019..bf7cd64c0a 100644
--- a/app/client/src/constants/DefaultTheme.tsx
+++ b/app/client/src/constants/DefaultTheme.tsx
@@ -49,6 +49,11 @@ export type Theme = {
minWidth: number;
minHeight: number;
};
+ widgets: {
+ tableWidget: {
+ selectHighlightColor: Color;
+ };
+ };
};
export const getColorWithOpacity = (color: Color, opacity: number) => {
@@ -142,6 +147,11 @@ export const theme: Theme = {
minWidth: 300,
minHeight: 300,
},
+ widgets: {
+ tableWidget: {
+ selectHighlightColor: Colors.GEYSER_LIGHT,
+ },
+ },
};
export { css, createGlobalStyle, keyframes, ThemeProvider };
diff --git a/app/client/src/utils/AppsmithUtils.tsx b/app/client/src/utils/AppsmithUtils.tsx
index 1500e8a957..35229b87cf 100644
--- a/app/client/src/utils/AppsmithUtils.tsx
+++ b/app/client/src/utils/AppsmithUtils.tsx
@@ -86,3 +86,5 @@ export const getNextWidgetName = (
return prefix + (lastIndex + 1);
};
+
+export const noop = () => {};
diff --git a/app/client/src/widgets/BaseWidget.tsx b/app/client/src/widgets/BaseWidget.tsx
index aa1157fbd4..4a3d201f68 100644
--- a/app/client/src/widgets/BaseWidget.tsx
+++ b/app/client/src/widgets/BaseWidget.tsx
@@ -40,6 +40,16 @@ abstract class BaseWidget<
executeAction && executeAction(actionPayloads);
}
+ updateWidgetProperty(
+ widgetId: string,
+ propertyName: string,
+ propertyValue: any,
+ ): void {
+ const { updateWidgetProperty } = this.context;
+ updateWidgetProperty &&
+ updateWidgetProperty(widgetId, propertyName, propertyValue);
+ }
+
componentDidMount(): void {
this.calculateWidgetBounds(
this.props.rightColumn,
diff --git a/app/client/src/widgets/TableWidget.tsx b/app/client/src/widgets/TableWidget.tsx
index 48d65051c8..e27779ec17 100644
--- a/app/client/src/widgets/TableWidget.tsx
+++ b/app/client/src/widgets/TableWidget.tsx
@@ -2,16 +2,12 @@ import React from "react";
import BaseWidget, { WidgetProps, WidgetState } from "./BaseWidget";
import { WidgetType } from "../constants/WidgetConstants";
import { ActionPayload } from "../constants/ActionConstants";
-import BaseTable, { AutoResizer } from "react-base-table";
+import { AutoResizer } from "react-base-table";
import "react-base-table/styles.css";
import { forIn } from "lodash";
-
-interface Column {
- key: string;
- dataKey: string;
- title: string;
- width: number;
-}
+import SelectableTable, {
+ Column,
+} from "../components/designSystems/appsmith/TableComponent";
function constructColumns(data: object[]): Column[] {
const cols: Column[] = [];
@@ -54,12 +50,23 @@ class TableWidget extends BaseWidget {
return (
{({ width, height }: { width: number; height: number }) => (
- {
+ const { widgetId, onRowSelected } = this.props;
+ super.updateWidgetProperty(widgetId, "selectedRow", {
+ data: rowData,
+ index: index,
+ });
+ super.executeAction(onRowSelected);
+ }}
/>
)}
@@ -85,6 +92,10 @@ export interface TableWidgetProps extends WidgetProps {
recordActions?: TableAction[];
onPageChange?: ActionPayload[];
onRowSelected?: ActionPayload[];
+ selectedRow?: {
+ data: object;
+ index: number;
+ };
}
export default TableWidget;