Rework grid block height to support percentages again while ensuring min height is respected

This commit is contained in:
Andrew Kingston 2024-05-14 11:25:29 +01:00
parent 9c312826ca
commit 9184d1b1f4
2 changed files with 23 additions and 26 deletions

View File

@ -36,6 +36,7 @@
let grid let grid
let gridContext let gridContext
let minHeight
$: parsedColumns = getParsedColumns(columns) $: parsedColumns = getParsedColumns(columns)
$: columnWhitelist = parsedColumns.filter(x => x.active).map(x => x.field) $: columnWhitelist = parsedColumns.filter(x => x.active).map(x => x.field)
@ -50,8 +51,7 @@
metadata: { dataSource: table }, metadata: { dataSource: table },
}, },
] ]
$: height = $component.styles?.normal?.height || "408px" $: gridContext?.minHeight?.subscribe($height => (minHeight = $height))
$: styles = getSanitisedStyles($component.styles)
// Provide additional data context for live binding eval // Provide additional data context for live binding eval
export const getAdditionalDataContext = () => { export const getAdditionalDataContext = () => {
@ -128,23 +128,16 @@
) )
} }
const getSanitisedStyles = styles => {
return {
...styles,
normal: {
...styles?.normal,
height: undefined,
},
}
}
onMount(() => { onMount(() => {
gridContext = grid.getContext() gridContext = grid.getContext()
}) })
</script> </script>
<div use:styleable={styles} class:in-builder={$builderStore.inBuilder}> <span style="--min-height:{minHeight}px">
<span style="--height:{height};"> <div
use:styleable={$component.styles}
class:in-builder={$builderStore.inBuilder}
>
<Grid <Grid
bind:this={grid} bind:this={grid}
datasource={table} datasource={table}
@ -170,12 +163,15 @@
buttons={enrichedButtons} buttons={enrichedButtons}
on:rowclick={e => onRowClick?.({ row: e.detail })} on:rowclick={e => onRowClick?.({ row: e.detail })}
/> />
</span>
</div> </div>
</span>
<Provider {data} {actions} /> <Provider {data} {actions} />
<style> <style>
span {
display: contents;
}
div { div {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -183,14 +179,10 @@
border: 1px solid var(--spectrum-global-color-gray-300); border: 1px solid var(--spectrum-global-color-gray-300);
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;
height: 410px;
min-height: var(--min-height);
} }
div.in-builder :global(*) { div.in-builder :global(*) {
pointer-events: none; pointer-events: none;
} }
span {
display: contents;
}
span :global(.grid) {
height: var(--height);
}
</style> </style>

View File

@ -1,6 +1,6 @@
<script> <script>
import { setContext, onMount } from "svelte" import { setContext, onMount } from "svelte"
import { writable } from "svelte/store" import { writable, derived } from "svelte/store"
import { fade } from "svelte/transition" import { fade } from "svelte/transition"
import { clickOutside, ProgressCircle } from "@budibase/bbui" import { clickOutside, ProgressCircle } from "@budibase/bbui"
import { createEventManagers } from "../lib/events" import { createEventManagers } from "../lib/events"
@ -109,8 +109,13 @@
notifyError, notifyError,
buttons, buttons,
}) })
$: minHeight =
Padding + SmallRowHeight + $rowHeight + (showControls ? ControlsHeight : 0) // Derive min height and make available in context
const minHeight = derived(rowHeight, $height => {
const heightForControls = showControls ? ControlsHeight : 0
return Padding + SmallRowHeight + $height + heightForControls
})
context = { ...context, minHeight }
// Set context for children to consume // Set context for children to consume
setContext("grid", context) setContext("grid", context)
@ -136,7 +141,7 @@
class:quiet class:quiet
on:mouseenter={() => gridFocused.set(true)} on:mouseenter={() => gridFocused.set(true)}
on:mouseleave={() => gridFocused.set(false)} on:mouseleave={() => gridFocused.set(false)}
style="--row-height:{$rowHeight}px; --default-row-height:{DefaultRowHeight}px; --gutter-width:{GutterWidth}px; --max-cell-render-overflow:{MaxCellRenderOverflow}px; --content-lines:{$contentLines}; --min-height:{minHeight}px; --controls-height:{ControlsHeight}px;" style="--row-height:{$rowHeight}px; --default-row-height:{DefaultRowHeight}px; --gutter-width:{GutterWidth}px; --max-cell-render-overflow:{MaxCellRenderOverflow}px; --content-lines:{$contentLines}; --min-height:{$minHeight}px; --controls-height:{ControlsHeight}px;"
> >
{#if showControls} {#if showControls}
<div class="controls"> <div class="controls">