diff --git a/packages/grafana-ui/src/components/Table/FooterRow.tsx b/packages/grafana-ui/src/components/Table/FooterRow.tsx
index 8e9cc1e423c..3811205ec6c 100644
--- a/packages/grafana-ui/src/components/Table/FooterRow.tsx
+++ b/packages/grafana-ui/src/components/Table/FooterRow.tsx
@@ -14,11 +14,10 @@ export interface FooterRowProps {
footerGroups: HeaderGroup[];
footerValues: FooterItem[];
isPaginationVisible: boolean;
- height: number;
}
export const FooterRow = (props: FooterRowProps) => {
- const { totalColumnsWidth, footerGroups, height, isPaginationVisible } = props;
+ const { totalColumnsWidth, footerGroups, isPaginationVisible } = props;
const e2eSelectorsTable = selectors.components.Panels.Visualization.Table;
const tableStyles = useStyles2(getTableStyles);
@@ -33,14 +32,8 @@ export const FooterRow = (props: FooterRowProps) => {
{footerGroups.map((footerGroup: HeaderGroup) => {
const { key, ...footerGroupProps } = footerGroup.getFooterGroupProps();
return (
-
- {footerGroup.headers.map((column: ColumnInstance) => renderFooterCell(column, tableStyles, height))}
+
+ {footerGroup.headers.map((column: ColumnInstance) => renderFooterCell(column, tableStyles))}
);
})}
@@ -48,7 +41,7 @@ export const FooterRow = (props: FooterRowProps) => {
);
};
-function renderFooterCell(column: ColumnInstance, tableStyles: TableStyles, height?: number) {
+function renderFooterCell(column: ColumnInstance, tableStyles: TableStyles) {
const footerProps = column.getHeaderProps();
if (!footerProps) {
@@ -58,9 +51,6 @@ function renderFooterCell(column: ColumnInstance, tableStyles: TableStyles, heig
footerProps.style = footerProps.style ?? {};
footerProps.style.position = 'absolute';
footerProps.style.justifyContent = (column as any).justifyContent;
- if (height) {
- footerProps.style.height = height;
- }
return (
diff --git a/packages/grafana-ui/src/components/Table/HeaderRow.tsx b/packages/grafana-ui/src/components/Table/HeaderRow.tsx
index 7d9147e4a41..ddd7c598692 100644
--- a/packages/grafana-ui/src/components/Table/HeaderRow.tsx
+++ b/packages/grafana-ui/src/components/Table/HeaderRow.tsx
@@ -21,7 +21,7 @@ export const HeaderRow = (props: HeaderRowProps) => {
const tableStyles = useStyles2(getTableStyles);
return (
-
+
{headerGroups.map((headerGroup: HeaderGroup) => {
const { key, ...headerGroupProps } = headerGroup.getHeaderGroupProps();
return (
@@ -62,9 +62,12 @@ function renderHeaderCell(column: any, tableStyles: TableStyles, showTypeIcons?:
)}
{column.render('Header')}
-
- {column.isSorted && (column.isSortedDesc ? : )}
-
+ {column.isSorted &&
+ (column.isSortedDesc ? (
+
+ ) : (
+
+ ))}
{column.canFilter &&
}
>
diff --git a/packages/grafana-ui/src/components/Table/Table.tsx b/packages/grafana-ui/src/components/Table/Table.tsx
index e858c5af919..aafd34af3d4 100644
--- a/packages/grafana-ui/src/components/Table/Table.tsx
+++ b/packages/grafana-ui/src/components/Table/Table.tsx
@@ -150,13 +150,13 @@ export const Table = memo((props: Props) => {
const variableSizeListScrollbarRef = useRef
(null);
const tableStyles = useStyles2(getTableStyles);
const theme = useTheme2();
- const headerHeight = noHeader ? 0 : tableStyles.cellHeight;
+ const headerHeight = noHeader ? 0 : tableStyles.rowHeight;
const [footerItems, setFooterItems] = useState(footerValues);
const [expandedIndexes, setExpandedIndexes] = useState>(new Set());
const prevExpandedIndexes = usePrevious(expandedIndexes);
const footerHeight = useMemo(() => {
- const EXTENDED_ROW_HEIGHT = 33;
+ const EXTENDED_ROW_HEIGHT = headerHeight;
let length = 0;
if (!footerItems) {
@@ -174,7 +174,7 @@ export const Table = memo((props: Props) => {
}
return EXTENDED_ROW_HEIGHT;
- }, [footerItems]);
+ }, [footerItems, headerHeight]);
// React table data array. This data acts just like a dummy array to let react-table know how many rows exist
// The cells use the field to look up values
@@ -288,7 +288,9 @@ export const Table = memo((props: Props) => {
if (enablePagination) {
listHeight -= tableStyles.cellHeight;
}
- const pageSize = Math.round(listHeight / tableStyles.cellHeight) - 1;
+
+ const pageSize = Math.round(listHeight / tableStyles.rowHeight) - 1;
+
useEffect(() => {
// Don't update the page size if it is less than 1
if (pageSize <= 0) {
@@ -473,7 +475,6 @@ export const Table = memo((props: Props) => {
)}
{footerItems && (
{
- const { colors } = theme;
- const headerBg = theme.colors.background.secondary;
const borderColor = theme.colors.border.weak;
const resizerColor = theme.colors.primary.border;
const cellPadding = 6;
@@ -107,27 +105,29 @@ export const getTableStyles = (theme: GrafanaTheme2) => {
`,
thead: css`
label: thead;
- height: ${cellHeight}px;
+ height: ${rowHeight}px;
overflow-y: auto;
overflow-x: hidden;
- background: ${headerBg};
position: relative;
`,
tfoot: css`
label: tfoot;
- height: ${cellHeight}px;
+ height: ${rowHeight}px;
+ border-top: 1px solid ${borderColor};
overflow-y: auto;
overflow-x: hidden;
- background: ${headerBg};
position: relative;
`,
+ headerRow: css`
+ label: row;
+ border-bottom: 1px solid ${borderColor};
+ `,
headerCell: css`
padding: ${cellPadding}px;
overflow: hidden;
white-space: nowrap;
- color: ${colors.primary.text};
- border-right: 1px solid ${theme.colors.border.weak};
display: flex;
+ font-weight: ${theme.typography.fontWeightMedium};
&:last-child {
border-right: none;
@@ -141,8 +141,15 @@ export const getTableStyles = (theme: GrafanaTheme2) => {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
+ font-weight: ${theme.typography.fontWeightMedium};
display: flex;
+ align-items: center;
margin-right: ${theme.spacing(0.5)};
+
+ &:hover {
+ text-decoration: underline;
+ color: ${theme.colors.text.link};
+ }
`,
cellContainer: buildCellContainerStyle(undefined, undefined, true),
cellContainerNoOverflow: buildCellContainerStyle(undefined, undefined, false),
@@ -152,6 +159,9 @@ export const getTableStyles = (theme: GrafanaTheme2) => {
user-select: text;
white-space: nowrap;
`,
+ sortIcon: css`
+ margin-left: ${theme.spacing(0.5)};
+ `,
cellLink: css`
cursor: pointer;
overflow: hidden;
@@ -173,12 +183,10 @@ export const getTableStyles = (theme: GrafanaTheme2) => {
`,
paginationWrapper: css`
display: flex;
- background: ${headerBg};
height: ${cellHeight}px;
justify-content: center;
align-items: center;
width: 100%;
- border-top: 1px solid ${theme.colors.border.weak};
li {
margin-bottom: 0;
}
diff --git a/public/app/plugins/panel/table/module.tsx b/public/app/plugins/panel/table/module.tsx
index 5872e486f2b..5f81d88069d 100644
--- a/public/app/plugins/panel/table/module.tsx
+++ b/public/app/plugins/panel/table/module.tsx
@@ -20,7 +20,6 @@ const footerCategory = 'Table footer';
export const plugin = new PanelPlugin(TablePanel)
.setPanelChangeHandler(tablePanelChangedHandler)
.setMigrationHandler(tableMigrationHandler)
- .setNoPadding()
.useFieldConfig({
useCustomConfig: (builder) => {
builder