From e9896def2f1b1912d888c5d046e58a49dc0c772e Mon Sep 17 00:00:00 2001 From: Igor Dykhta Date: Wed, 12 Apr 2023 15:22:38 +0300 Subject: [PATCH] [Feat] add table config with custom number format (#2192) --- src/actions/src/action-types.ts | 1 + src/actions/src/vis-state-actions.ts | 30 +++++ .../src/common/data-table/header-cell.tsx | 52 ++++++++- .../src/common/data-table/index.tsx | 34 ++---- .../src/common/data-table/option-dropdown.tsx | 106 ++++++++++++++++-- src/components/src/index.ts | 3 +- src/components/src/modal-container.tsx | 3 + .../src/modals/data-table-modal.tsx | 33 +++++- .../tooltip-config/tooltip-chicklet.tsx | 48 ++------ .../layer-panel/layer-config-group.tsx | 2 +- src/constants/src/default-settings.ts | 6 +- src/constants/src/tooltip.ts | 30 +++++ src/reducers/src/vis-state-updaters.ts | 28 ++++- src/reducers/src/vis-state.ts | 2 + src/table/src/kepler-table.ts | 10 ++ src/types/components.d.ts | 28 +++++ src/types/index.d.ts | 1 + src/types/layers.d.ts | 1 + src/utils/src/data-utils.ts | 26 ++++- src/utils/src/dataset-utils.ts | 47 +++++++- src/utils/src/format.ts | 23 ++++ src/utils/src/index.ts | 8 +- .../modals/data-table-modal-test.js | 45 ++++++-- 23 files changed, 467 insertions(+), 100 deletions(-) create mode 100644 src/types/components.d.ts create mode 100644 src/utils/src/format.ts diff --git a/src/actions/src/action-types.ts b/src/actions/src/action-types.ts index 16ea4f1d9d..b62ba7b5ac 100644 --- a/src/actions/src/action-types.ts +++ b/src/actions/src/action-types.ts @@ -112,6 +112,7 @@ export const ActionTypes = { SORT_TABLE_COLUMN: `${ACTION_PREFIX}SORT_TABLE_COLUMN`, PIN_TABLE_COLUMN: `${ACTION_PREFIX}PIN_TABLE_COLUMN`, COPY_TABLE_COLUMN: `${ACTION_PREFIX}COPY_TABLE_COLUMN`, + SET_COLUMN_DISPLAY_FORMAT: `${ACTION_PREFIX}SET_COLUMN_DISPLAY_FORMAT`, NEXT_FILE_BATCH: `${ACTION_PREFIX}NEXT_FILE_BATCH`, PROCESS_FILE_CONTENT: `${ACTION_PREFIX}PROCESS_FILE_CONTENT`, UPDATE_TABLE_COLOR: `${ACTION_PREFIX}UPDATE_TABLE_COLOR`, diff --git a/src/actions/src/vis-state-actions.ts b/src/actions/src/vis-state-actions.ts index 58b82bc242..632527df64 100644 --- a/src/actions/src/vis-state-actions.ts +++ b/src/actions/src/vis-state-actions.ts @@ -620,6 +620,36 @@ export function copyTableColumn( }; } +export type SetColumnDisplayFormatUpdaterAction = { + dataId: string; + column: string; + displayFormat: string; +}; + +/** + * Set column display format + * @param dataId + * @param column + * @param displayFormat + * @returns action + * @public + */ +export function setColumnDisplayFormat( + dataId: string, + column: string, + displayFormat: string +): Merge< + SetColumnDisplayFormatUpdaterAction, + {type: typeof ActionTypes.SET_COLUMN_DISPLAY_FORMAT} +> { + return { + type: ActionTypes.SET_COLUMN_DISPLAY_FORMAT, + dataId, + column, + displayFormat + }; +} + export type AddDataToMapUpdaterOptions = { centrMap?: boolean; readOnly?: boolean; diff --git a/src/components/src/common/data-table/header-cell.tsx b/src/components/src/common/data-table/header-cell.tsx index 254e1a4d54..1326afae78 100644 --- a/src/components/src/common/data-table/header-cell.tsx +++ b/src/components/src/common/data-table/header-cell.tsx @@ -1,10 +1,12 @@ -import React, {CSSProperties, useCallback} from 'react'; +import React, {CSSProperties, useState, useCallback} from 'react'; import styled from 'styled-components'; import classnames from 'classnames'; import Button from './button'; -import {ArrowUp, ArrowDown, VertThreeDots} from '../../common/icons'; -import OptionDropdown from './option-dropdown'; +import {ArrowUp, ArrowDown, VertThreeDots, Hash} from '../../common/icons'; import {SORT_ORDER} from '@kepler.gl/constants'; +import OptionDropdown, {FormatterDropdown} from './option-dropdown'; +import {getFieldFormatLabels} from '@kepler.gl/utils'; +import {ColMeta} from '@kepler.gl/types'; import FieldTokenFactory, {FieldTokenProps} from '../../common/field-token'; import {DataTableProps} from './index'; @@ -58,6 +60,12 @@ const StyledHeaderCell = styled.div` .more { margin-left: 5px; } + + .col-name__format svg { + width: 10px; + height: 10px; + stroke-width: 1; + } `; type CellInfo = { @@ -74,6 +82,7 @@ type HeaderCellProps = { // passed down from react virtualized Grid cellInfo: CellInfo; columns: DataTableProps['columns']; + colMeta?: ColMeta; isPinned?: boolean; showStats?: boolean; props: DataTableProps; @@ -91,12 +100,22 @@ const HeaderCellFactory = (FieldToken: React.FC) => { moreOptionsColumn }: HeaderCellProps) => { const {columnIndex, key, style} = cellInfo; - const {colMeta, sortColumn = {}, sortTableColumn, pinTableColumn, copyTableColumn} = props; + const { + colMeta, + sortColumn, + sortTableColumn, + pinTableColumn, + copyTableColumn, + setDisplayFormat + } = props; + const [showFormatter, setShowFormatter] = useState(false); const column = columns[columnIndex]; const isGhost = column.ghost; const isSorted = sortColumn[column]; const firstCell = columnIndex === 0; + const isFormatted = Boolean(colMeta[column]?.displayFormat); + const formatLabels = isFormatted ? getFieldFormatLabels(colMeta[column].type) : []; const onSortTable = useCallback(() => sortTableColumn(column), [sortTableColumn, column]); const onToggleOptionMenu = useCallback(() => toggleMoreOptions(column), [ toggleMoreOptions, @@ -104,6 +123,17 @@ const HeaderCellFactory = (FieldToken: React.FC) => { ]); const onPin = useCallback(() => pinTableColumn(column), [pinTableColumn, column]); const onCopy = useCallback(() => copyTableColumn(column), [copyTableColumn, column]); + const onSetDisplayFormat = useCallback( + displayFormat => { + setDisplayFormat(column, displayFormat.format); + }, + [column, setDisplayFormat] + ); + + const onToggleDisplayFormat = useCallback(() => { + setShowFormatter(!showFormatter); + }, [showFormatter]); + return ( ) => { ) ) : null} +