Skip to content

Commit

Permalink
[Table Visualization] format table cell and restore showTotal feature
Browse files Browse the repository at this point in the history
* format table cell to show Date and percent
* restore showTotal feature: it allows table vis to show total,
avg, min, max and count statics on count
* fix some type errors

Partically resolved:
opensearch-project#2379

Signed-off-by: Anan Zhuang <ananzh@amazon.com>
  • Loading branch information
ananzh committed Oct 12, 2022
1 parent 7e969bc commit 75c65ed
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
* SPDX-License-Identifier: Apache-2.0
*/

import React, { useState, useCallback, useMemo, useRef, useEffect } from 'react';
import { isEqual, orderBy } from 'lodash';
import React, { useCallback, useMemo, useRef } from 'react';
import { orderBy } from 'lodash';
import { EuiDataGridProps, EuiDataGrid, EuiDataGridSorting } from '@elastic/eui';

import { IInterpreterRenderHandlers } from 'src/plugins/expressions';
Expand Down Expand Up @@ -32,7 +32,7 @@ export const TableVisComponent = ({ table, visConfig, handlers }: TableVisCompon
const currentColState = useRef<{
columnsWidth: ColumnWidth[];
}>({
columnsWidth: handlers.uiState.get('vis.columnsWidth'),
columnsWidth: handlers.uiState.get('vis.columnsWidth') || [],
});

const sortedRows = useMemo(() => {
Expand All @@ -44,9 +44,15 @@ export const TableVisComponent = ({ table, visConfig, handlers }: TableVisCompon

const renderCellValue = useMemo(() => {
return (({ rowIndex, columnId }) => {
return sortedRows.hasOwnProperty(rowIndex) ? sortedRows[rowIndex][columnId] || null : null;
const rawContent = sortedRows[rowIndex][columnId];
const colIndex = columns.findIndex((col) => col.id === columnId);
const column = columns[colIndex];
// use formatter to format raw content
// this can format date and percentage data
const formattedContent = column.formatter.convert(rawContent, 'text');
return sortedRows.hasOwnProperty(rowIndex) ? formattedContent || null : null;
}) as EuiDataGridProps['renderCellValue'];
}, [sortedRows]);
}, [sortedRows, columns]);

const dataGridColumns = getDataGridColumns(
sortedRows,
Expand All @@ -57,7 +63,7 @@ export const TableVisComponent = ({ table, visConfig, handlers }: TableVisCompon
);

const sortedColumns = useMemo(() => {
const sort = handlers.uiState.get('vis.sortColumn');
const sort: SortColumn = handlers.uiState.get('vis.sortColumn') || {};
return sort && sort.colIndex !== null && sort.direction
? [{ id: dataGridColumns[sort.colIndex]?.id, direction: sort.direction }]
: [];
Expand Down Expand Up @@ -97,19 +103,39 @@ export const TableVisComponent = ({ table, visConfig, handlers }: TableVisCompon
[columns, currentColState, handlers.uiState]
);

const footerCellValue = visConfig.showTotal
? // @ts-expect-error
({ columnId }) => {
const colIndex = columns.findIndex((col) => col.id === columnId);
return columns[colIndex]?.formattedTotal || null;
}
: undefined;

return (
<EuiDataGrid
aria-label="tableVis"
columns={dataGridColumns}
columnVisibility={{
visibleColumns: columns.map(({ id }) => id),
setVisibleColumns: () => {},
setVisibleColumns: () => { },
}}
rowCount={rows.length}
renderCellValue={renderCellValue}
sorting={{ columns: sortedColumns, onSort }}
onColumnResize={onColumnResize}
pagination={pagination}
gridStyle={{
border: 'horizontal',
header: 'underline',
}}
minSizeForControls={1}
renderFooterCellValue={footerCellValue}
toolbarVisibility={{
showColumnSelector: false,
showSortSelector: false,
showFullScreenSelector: false,
showStyleSelector: false,
}}
/>
);
};
2 changes: 1 addition & 1 deletion src/plugins/vis_type_table/public/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export interface TableVisParams {
export interface FormattedColumn {
id: string;
title: string;
formatter: IFieldFormat | undefined;
formatter: IFieldFormat;
filterable: boolean;
formattedTotal?: string | number;
sumTotal?: number;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ export interface FormattedDataProps {
formattedRows: OpenSearchDashboardsDatatableRow[];
formattedColumns: FormattedColumn[];
}

export const convertToFormattedData = (
table: Table,
visConfig: TableVisConfig
Expand All @@ -95,7 +96,9 @@ export const convertToFormattedData = (
const dimension =
isBucket || isSplitColumn || metrics.find((metric) => metric.accessor === i);

const formatter = dimension ? getFormatService().deserialize(dimension.format) : undefined;
if (!dimension) return undefined;

const formatter = getFormatService().deserialize(dimension.format);

const formattedColumn: FormattedColumn = {
id: col.id,
Expand Down Expand Up @@ -157,15 +160,15 @@ export const convertToFormattedData = (

return formattedColumn;
})
.filter((column) => column);
.filter((column): column is FormattedColumn => !!column);

if (visConfig.percentageCol) {
const insertAtIndex = formattedColumns.findIndex(
(col) => col.title === visConfig.percentageCol
);

// column to show percentage for was removed
if (insertAtIndex < 0) return;
if (insertAtIndex < 0) return { formattedRows, formattedColumns };

const { cols, rows } = addPercentageCol(
formattedColumns,
Expand Down

0 comments on commit 75c65ed

Please sign in to comment.