From db479c5c57d6477569a3190fc67b6401cb9dfff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Fri, 29 May 2020 01:47:54 +0200 Subject: [PATCH] [dome] table view --- ivette/src/dome/src/renderer/table/views.tsx | 99 ++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/ivette/src/dome/src/renderer/table/views.tsx b/ivette/src/dome/src/renderer/table/views.tsx index 442416e77b1..cb2feb1e8fb 100644 --- a/ivette/src/dome/src/renderer/table/views.tsx +++ b/ivette/src/dome/src/renderer/table/views.tsx @@ -444,3 +444,102 @@ function headerRenderer(props: TableHeaderProps) { } // -------------------------------------------------------------------------- +// --- Table Rows +// -------------------------------------------------------------------------- + +const rowClassName = + (selected?: number) => + ({ index }: { index: number }) => + (selected === index ? 'dome-color-selected' : + (index & 1 ? 'dome-xTable-even' : 'dome-xTable-odd')); + +// -------------------------------------------------------------------------- +// --- Column Resizer +// -------------------------------------------------------------------------- + +const DRAGGING = 'dome-xTable-resizer dome-color-dragging'; +const DRAGZONE = 'dome-xTable-resizer dome-color-dragzone'; + +interface ResizerProps { + id: number; + dragging: undefined | number; + left: string; // resized column-id on the left + right: string; // resized column-id on the right + offset: number; // drag-start offset + onStart: DraggableEventHandler; + onStop: DraggableEventHandler; + onDrag: (left: string, right: string, offset: number) => void; +} + +const Resizer = (props: ResizerProps) => ( + <DraggableCore + onStart={props.onStart} + onStop={props.onStop} + onDrag={(_elt, data) => props.onDrag(props.left, props.right, data.x - props.offset)} + > + <div + className={props.id === props.dragging ? DRAGGING : DRAGZONE} + style={{ left: props.offset - 2 }} + /> + </DraggableCore> +); + +const computeWidth = (elt: Element) => { + const parent = elt && elt.parentElement; + return parent && parent.getBoundingClientRect().width; +}; + +// -------------------------------------------------------------------------- +// --- Virtualized Table View +// -------------------------------------------------------------------------- + +// Must be kept in sync with table.css +const CSS_HEADER_HEIGHT = 22; +const CSS_ROW_HEIGHT = 20; + +function makeTable<Key, Row>( + size: Size, + props: TableProps<Key, Row>, + state: TableState<Row>, +) { + const { width, height } = size; + const model = props.model; + const itemCount = model.getRowCount(); + const tableHeight = CSS_HEADER_HEIGHT + CSS_ROW_HEIGHT * itemCount; + const smallHeight = itemCount > 0 && tableHeight < height; + const rowCount = (smallHeight ? itemCount + 1 : itemCount); + const selection = props.selection; + const selected = selection && model.getIndexOf(selection); + const resizers = null; // this.computeResizers(columns); + const columns = makeColumns(state); + return ( + <React.Fragment> + <VTable + ref={state.tableRef} + key='table' + displayName='React-Virtualized-Table' + width={width} + height={height} + rowCount={rowCount} + noRowsRenderer={props.renderEmpty} + rowGetter={state.rowGetter} + rowClassName={rowClassName(selected)} + rowHeight={CSS_ROW_HEIGHT} + headerHeight={CSS_HEADER_HEIGHT} + headerRowRenderer={headerRowRenderer} + onRowsRendered={state.watchRange} + onRowClick={onSelection && this.selectRow} + sortBy={ordering && ordering.sortBy} + sortDirection={ordering && ordering.sortDirection} + sort={model.setOrdering.bind(model)} + scrollToIndex={scrollToIndex} + scrollToAlignment='auto' + > + {columns} + </VTable> + {resizers} + </React.Fragment> + ); +}; + +// -------------------------------------------------------------------------- -- GitLab