diff --git a/packages/web/src/datagrid/ColumnLabel.js b/packages/web/src/datagrid/ColumnLabel.js index 5a0bc9933..4ca1f81ff 100644 --- a/packages/web/src/datagrid/ColumnLabel.js +++ b/packages/web/src/datagrid/ColumnLabel.js @@ -15,7 +15,7 @@ export default function ColumnLabel(column) { if (column.foreignKey) Icon = ForeignKeyIcon; return ( ); } diff --git a/packages/web/src/datagrid/DataGridCore.js b/packages/web/src/datagrid/DataGridCore.js index a1eaa1e26..9160b4402 100644 --- a/packages/web/src/datagrid/DataGridCore.js +++ b/packages/web/src/datagrid/DataGridCore.js @@ -102,6 +102,8 @@ const NullSpan = styled.span` font-style: italic; `; +const wheelRowCount = 5; + function CellFormattedValue({ value }) { if (value == null) return (NULL); if (_.isDate(value)) return moment(value).format('YYYY-MM-DD HH:mm:ss'); @@ -133,6 +135,7 @@ export default function DataGridCore(props) { const [currentCell, setCurrentCell] = React.useState(topLeftCell); const [selectedCells, setSelectedCells] = React.useState(emptyCellArray); const [dragStartCell, setDragStartCell] = React.useState(nullCell); + const [shiftDragStartCell, setShiftDragStartCell] = React.useState(nullCell); const loadNextData = async () => { if (isLoading) return; @@ -200,7 +203,7 @@ export default function DataGridCore(props) { // console.log('containerWidth', containerWidth); const gridScrollAreaHeight = containerHeight - 2 * rowHeight; - const gridScrollAreaWidth = containerWidth - columnSizes.frozenSize - headerColWidth; + const gridScrollAreaWidth = containerWidth - columnSizes.frozenSize - headerColWidth - 32; const visibleRowCountUpperBound = Math.ceil(gridScrollAreaHeight / Math.floor(rowHeight)); const visibleRowCountLowerBound = Math.floor(gridScrollAreaHeight / Math.ceil(rowHeight)); @@ -340,12 +343,50 @@ export default function DataGridCore(props) { } } + function handleGridWheel(event) { + console.log('WHEEL', event, event.deltaY); + + // let delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail))); + let newFirstVisibleRowScrollIndex = firstVisibleRowScrollIndex; + if (event.deltaY > 0) { + newFirstVisibleRowScrollIndex += wheelRowCount; + } + if (event.deltaY < 0) { + newFirstVisibleRowScrollIndex -= wheelRowCount; + } + let rowCount = rowCountNewIncluded; + if (newFirstVisibleRowScrollIndex + visibleRowCountLowerBound > rowCount) { + newFirstVisibleRowScrollIndex = rowCount - visibleRowCountLowerBound + 1; + } + if (newFirstVisibleRowScrollIndex < 0) { + newFirstVisibleRowScrollIndex = 0; + } + setFirstVisibleRowScrollIndex(newFirstVisibleRowScrollIndex); + // @ts-ignore + setvScrollValueToSet(newFirstVisibleRowScrollIndex); + setvScrollValueToSetDate(new Date()); + } + function handleGridKeyDown(event) { handleCursorMove(event); + + if (event.shiftKey) { + if (!isRegularCell(shiftDragStartCell)) { + setShiftDragStartCell(currentCell); + } + } else { + setShiftDragStartCell(nullCell); + } + + const newCell = handleCursorMove(event); + if (event.shiftKey && newCell) { + // @ts-ignore + setSelectedCells(getCellRange(shiftDragStartCell, newCell)); + } } function handleCursorMove(event) { - if (!isRegularCell(currentCell)) return false; + if (!isRegularCell(currentCell)) return null; let rowCount = rowCountNewIncluded; if (event.ctrlKey) { switch (event.keyCode) { @@ -366,7 +407,7 @@ export default function DataGridCore(props) { case keycodes.a: setSelectedCells([['header', 'header']]); event.preventDefault(); - return true; + return ['header', 'header']; } } else { switch (event.keyCode) { @@ -390,30 +431,31 @@ export default function DataGridCore(props) { return moveCurrentCell(currentCell[0] + visibleRowCountLowerBound, currentCell[1], event); } } - return false; + return null; } function focusFilterEditor(columnRealIndex) { // let modelIndex = this.columnSizes.realToModel(columnRealIndex); // this.headerFilters[this.columns[modelIndex].uniquePath].focus(); - return true; + return ['filter', columnRealIndex]; } function moveCurrentCell(row, col, event) { - let rowCount = rowCountNewIncluded; + const rowCount = rowCountNewIncluded; if (row < 0) row = 0; if (row >= rowCount) row = rowCount - 1; if (col < 0) col = 0; if (col >= columnSizes.realCount) col = columnSizes.realCount - 1; setCurrentCell([row, col]); - setSelectedCells([...(event.ctrlKey ? selectedCells : []), [row, col]]); + // setSelectedCells([...(event.ctrlKey ? selectedCells : []), [row, col]]); + setSelectedCells([[row, col]]); scrollIntoView([row, col]); // this.selectedCells.push(this.currentCell); // this.scrollIntoView(this.currentCell); if (event) event.preventDefault(); - return true; + return [row, col]; } function scrollIntoView(cell) { @@ -534,6 +576,7 @@ export default function DataGridCore(props) { onMouseMove={handleGridMouseMove} onMouseUp={handleGridMouseUp} onKeyDown={handleGridKeyDown} + onWheel={handleGridWheel} // table can be focused tabIndex={-1} ref={tableRef} diff --git a/packages/web/src/datagrid/SeriesSizes.ts b/packages/web/src/datagrid/SeriesSizes.ts index 2dee617c9..0ab4ea9ac 100644 --- a/packages/web/src/datagrid/SeriesSizes.ts +++ b/packages/web/src/datagrid/SeriesSizes.ts @@ -259,16 +259,25 @@ export class SeriesSizes { if (scrollIndex < firstVisibleIndex) { return scrollIndex; } - let res: number = 0; - let testedIndex: number = scrollIndex; - while (res < viewportSize && testedIndex >= 0) { - let size: number = this.getSizeByScrollIndex(testedIndex); - if (res + size > viewportSize) return testedIndex + 1; - testedIndex--; - res += size; + let testedIndex = firstVisibleIndex + 1; + while (testedIndex < this.scrollCount) { + if (this.isWholeInView(testedIndex, scrollIndex, viewportSize)) { + return testedIndex; + } + testedIndex++; } - if (res >= viewportSize && testedIndex < scrollIndex) return testedIndex + 1; - return firstVisibleIndex; + return this.scrollCount - 1; + + // let res: number = 0; + // let testedIndex: number = scrollIndex; + // while (res < viewportSize && testedIndex >= 0) { + // let size: number = this.getSizeByScrollIndex(testedIndex); + // if (res + size > viewportSize) return testedIndex + 1; + // testedIndex--; + // res += size; + // } + // if (res >= viewportSize && testedIndex < scrollIndex) return testedIndex + 1; + // return firstVisibleIndex; } public resize(realIndex: number, newSize: number): void { if (realIndex < 0) return; diff --git a/packages/web/src/datagrid/selection.ts b/packages/web/src/datagrid/selection.ts index 573274dce..28ff9384a 100644 --- a/packages/web/src/datagrid/selection.ts +++ b/packages/web/src/datagrid/selection.ts @@ -8,6 +8,7 @@ export const nullCell: CellAddress = null; export const emptyCellArray: CellAddress[] = []; export function isRegularCell(cell: CellAddress): cell is RegularCellAddress { + if (!cell) return false; const [row, col] = cell; return _.isNumber(row) && _.isNumber(col); }