Shrink grid padding to least possible while allowing space for required controls
This commit is contained in:
parent
c5935e9e56
commit
1e492c7a1d
|
@ -26,7 +26,7 @@
|
|||
MaxCellRenderOverflow,
|
||||
GutterWidth,
|
||||
DefaultRowHeight,
|
||||
Padding,
|
||||
VPadding,
|
||||
SmallRowHeight,
|
||||
ControlsHeight,
|
||||
ScrollBarSize,
|
||||
|
@ -119,7 +119,7 @@
|
|||
// Derive min height and make available in context
|
||||
const minHeight = derived(rowHeight, $height => {
|
||||
const heightForControls = showControls ? ControlsHeight : 0
|
||||
return Padding + SmallRowHeight + $height + heightForControls
|
||||
return VPadding + SmallRowHeight + $height + heightForControls
|
||||
})
|
||||
context = { ...context, minHeight }
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
filter,
|
||||
inlineFilters,
|
||||
columnRenderMap,
|
||||
scrollTop,
|
||||
} = getContext("grid")
|
||||
|
||||
let visible = false
|
||||
|
@ -43,6 +44,21 @@
|
|||
$: $datasource, (visible = false)
|
||||
$: selectedRowCount = Object.values($selectedRows).length
|
||||
$: hasNoRows = !$rows.length
|
||||
$: renderedRowCount = $renderedRows.length
|
||||
$: offset = getOffset($hasNextPage, renderedRowCount, $rowHeight, $scrollTop)
|
||||
|
||||
const getOffset = (hasNextPage, rowCount, rowHeight, scrollTop) => {
|
||||
// If we have a next page of data then we aren't truly at the bottom, so we
|
||||
// render the add row component at the top
|
||||
if (hasNextPage) {
|
||||
return 0
|
||||
}
|
||||
offset = rowCount * rowHeight - (scrollTop % rowHeight)
|
||||
if (rowCount !== 0) {
|
||||
offset -= 1
|
||||
}
|
||||
return offset
|
||||
}
|
||||
|
||||
const addRow = async () => {
|
||||
// Blur the active cell and tick to let final value updates propagate
|
||||
|
@ -85,12 +101,6 @@
|
|||
return
|
||||
}
|
||||
|
||||
// If we have a next page of data then we aren't truly at the bottom, so we
|
||||
// render the add row component at the top
|
||||
if ($hasNextPage) {
|
||||
offset = 0
|
||||
}
|
||||
|
||||
// If we don't have a next page then we're at the bottom and can scroll to
|
||||
// the max available offset
|
||||
else {
|
||||
|
@ -98,10 +108,6 @@
|
|||
...state,
|
||||
top: $maxScrollTop,
|
||||
}))
|
||||
offset = $renderedRows.length * $rowHeight - ($maxScrollTop % $rowHeight)
|
||||
if ($renderedRows.length !== 0) {
|
||||
offset -= 1
|
||||
}
|
||||
}
|
||||
|
||||
// Update state and select initial cell
|
||||
|
@ -312,8 +318,10 @@
|
|||
pointer-events: all;
|
||||
z-index: 3;
|
||||
position: absolute;
|
||||
top: calc(var(--row-height) + var(--offset) + 24px);
|
||||
left: 18px;
|
||||
top: calc(
|
||||
var(--row-height) + var(--offset) + var(--default-row-height) / 2
|
||||
);
|
||||
left: calc(var(--default-row-height) / 2);
|
||||
}
|
||||
.button-with-keys {
|
||||
display: flex;
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
export const Padding = 100
|
||||
export const ScrollBarSize = 8
|
||||
export const GutterWidth = 72
|
||||
export const DefaultColumnWidth = 200
|
||||
export const MinColumnWidth = 80
|
||||
export const SmallRowHeight = 36
|
||||
export const MediumRowHeight = 64
|
||||
export const LargeRowHeight = 92
|
||||
export const DefaultRowHeight = SmallRowHeight
|
||||
export const VPadding = SmallRowHeight * 2
|
||||
export const HPadding = 40
|
||||
export const ScrollBarSize = 8
|
||||
export const GutterWidth = 72
|
||||
export const DefaultColumnWidth = 200
|
||||
export const MinColumnWidth = 80
|
||||
export const NewRowID = "new"
|
||||
export const BlankRowID = "blank"
|
||||
export const RowPageSize = 100
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
import { writable, derived, get } from "svelte/store"
|
||||
import { tick } from "svelte"
|
||||
import { Padding, GutterWidth, FocusedCellMinOffset } from "../lib/constants"
|
||||
import {
|
||||
GutterWidth,
|
||||
FocusedCellMinOffset,
|
||||
ScrollBarSize,
|
||||
HPadding,
|
||||
VPadding,
|
||||
} from "../lib/constants"
|
||||
import { parseCellID } from "../lib/utils"
|
||||
|
||||
export const createStores = () => {
|
||||
|
@ -34,28 +40,15 @@ export const deriveStores = context => {
|
|||
// Memoize store primitives
|
||||
const stickyColumnWidth = derived(stickyColumn, $col => $col?.width || 0, 0)
|
||||
|
||||
// Derive vertical limits
|
||||
const contentHeight = derived(
|
||||
[rows, rowHeight],
|
||||
([$rows, $rowHeight]) => ($rows.length + 1) * $rowHeight + Padding,
|
||||
0
|
||||
)
|
||||
const maxScrollTop = derived(
|
||||
[height, contentHeight],
|
||||
([$height, $contentHeight]) => Math.max($contentHeight - $height, 0),
|
||||
0
|
||||
)
|
||||
|
||||
// Derive horizontal limits
|
||||
const contentWidth = derived(
|
||||
[visibleColumns, stickyColumnWidth, buttonColumnWidth],
|
||||
([$visibleColumns, $stickyColumnWidth, $buttonColumnWidth]) => {
|
||||
const space = Math.max(Padding, $buttonColumnWidth - 1)
|
||||
let width = GutterWidth + space + $stickyColumnWidth
|
||||
let width = GutterWidth + $buttonColumnWidth + $stickyColumnWidth
|
||||
$visibleColumns.forEach(col => {
|
||||
width += col.width
|
||||
})
|
||||
return width
|
||||
return width + HPadding
|
||||
},
|
||||
0
|
||||
)
|
||||
|
@ -71,14 +64,6 @@ export const deriveStores = context => {
|
|||
},
|
||||
0
|
||||
)
|
||||
|
||||
// Derive whether to show scrollbars or not
|
||||
const showVScrollbar = derived(
|
||||
[contentHeight, height],
|
||||
([$contentHeight, $height]) => {
|
||||
return $contentHeight > $height
|
||||
}
|
||||
)
|
||||
const showHScrollbar = derived(
|
||||
[contentWidth, screenWidth],
|
||||
([$contentWidth, $screenWidth]) => {
|
||||
|
@ -86,6 +71,30 @@ export const deriveStores = context => {
|
|||
}
|
||||
)
|
||||
|
||||
// Derive vertical limits
|
||||
const contentHeight = derived(
|
||||
[rows, rowHeight, showHScrollbar],
|
||||
([$rows, $rowHeight, $showHScrollbar]) => {
|
||||
let height = ($rows.length + 1) * $rowHeight + VPadding
|
||||
if ($showHScrollbar) {
|
||||
height += ScrollBarSize * 2
|
||||
}
|
||||
return height
|
||||
},
|
||||
0
|
||||
)
|
||||
const maxScrollTop = derived(
|
||||
[height, contentHeight],
|
||||
([$height, $contentHeight]) => Math.max($contentHeight - $height, 0),
|
||||
0
|
||||
)
|
||||
const showVScrollbar = derived(
|
||||
[contentHeight, height],
|
||||
([$contentHeight, $height]) => {
|
||||
return $contentHeight > $height
|
||||
}
|
||||
)
|
||||
|
||||
return {
|
||||
contentHeight,
|
||||
contentWidth,
|
||||
|
|
Loading…
Reference in New Issue