Use new grid popover for date cells to allow overflow outside grid
This commit is contained in:
parent
46d8a06981
commit
795991438f
|
@ -116,12 +116,11 @@
|
||||||
min-width: var(--spectrum-global-dimension-size-2000);
|
min-width: var(--spectrum-global-dimension-size-2000);
|
||||||
border-color: var(--spectrum-global-color-gray-300);
|
border-color: var(--spectrum-global-color-gray-300);
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
transition: opacity 260ms ease-out, transform 260ms ease-out;
|
transition: opacity 260ms ease-out;
|
||||||
}
|
}
|
||||||
.hidden {
|
.hidden {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
transform: translateY(-20px);
|
|
||||||
}
|
}
|
||||||
.customZindex {
|
.customZindex {
|
||||||
z-index: var(--customZindex) !important;
|
z-index: var(--customZindex) !important;
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
export let invertY = false
|
export let invertY = false
|
||||||
export let contentLines = 1
|
export let contentLines = 1
|
||||||
export let hidden = false
|
export let hidden = false
|
||||||
|
export let rand
|
||||||
|
|
||||||
const emptyError = writable(null)
|
const emptyError = writable(null)
|
||||||
|
|
||||||
|
@ -96,6 +97,7 @@
|
||||||
{invertY}
|
{invertY}
|
||||||
{invertX}
|
{invertX}
|
||||||
{contentLines}
|
{contentLines}
|
||||||
|
{rand}
|
||||||
/>
|
/>
|
||||||
<slot />
|
<slot />
|
||||||
</GridCell>
|
</GridCell>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
} from "@budibase/bbui"
|
} from "@budibase/bbui"
|
||||||
import { onMount } from "svelte"
|
import { onMount } from "svelte"
|
||||||
import dayjs from "dayjs"
|
import dayjs from "dayjs"
|
||||||
import { debounce } from "../../../utils/utils"
|
import GridPopover from "../overlays/GridPopover.svelte"
|
||||||
|
|
||||||
export let value
|
export let value
|
||||||
export let schema
|
export let schema
|
||||||
|
@ -15,8 +15,12 @@
|
||||||
export let focused = false
|
export let focused = false
|
||||||
export let readonly = false
|
export let readonly = false
|
||||||
export let api
|
export let api
|
||||||
|
export let invertX = false
|
||||||
|
export let invertY = false
|
||||||
|
export let rand
|
||||||
|
|
||||||
let isOpen
|
let isOpen
|
||||||
|
let anchor
|
||||||
|
|
||||||
$: timeOnly = schema?.timeOnly
|
$: timeOnly = schema?.timeOnly
|
||||||
$: enableTime = !schema?.dateOnly
|
$: enableTime = !schema?.dateOnly
|
||||||
|
@ -99,7 +103,12 @@
|
||||||
|
|
||||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||||
<div class="container" class:editable on:click={editable ? open : null}>
|
<div
|
||||||
|
class="container"
|
||||||
|
class:editable
|
||||||
|
on:click={editable ? open : null}
|
||||||
|
bind:this={anchor}
|
||||||
|
>
|
||||||
<div class="value">
|
<div class="value">
|
||||||
{displayValue}
|
{displayValue}
|
||||||
</div>
|
</div>
|
||||||
|
@ -109,16 +118,18 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if isOpen}
|
{#if isOpen}
|
||||||
<div class="picker" use:clickOutside={close}>
|
<GridPopover bind:open={isOpen} {anchor} {invertX} {rand}>
|
||||||
<CoreDatePickerPopoverContents
|
<div class="picker" use:clickOutside={close}>
|
||||||
value={parsedValue}
|
<CoreDatePickerPopoverContents
|
||||||
on:change={e => (value = e.detail)}
|
value={parsedValue}
|
||||||
{enableTime}
|
on:change={e => (value = e.detail)}
|
||||||
{timeOnly}
|
{enableTime}
|
||||||
{ignoreTimezones}
|
{timeOnly}
|
||||||
useKeyboardShortcuts={false}
|
{ignoreTimezones}
|
||||||
/>
|
useKeyboardShortcuts={false}
|
||||||
</div>
|
/>
|
||||||
|
</div>
|
||||||
|
</GridPopover>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
|
@ -145,9 +156,6 @@
|
||||||
height: 20px;
|
height: 20px;
|
||||||
}
|
}
|
||||||
.picker {
|
.picker {
|
||||||
position: absolute;
|
|
||||||
top: 100%;
|
|
||||||
left: -1px;
|
|
||||||
background: var(--grid-background-alt);
|
background: var(--grid-background-alt);
|
||||||
border: var(--cell-border);
|
border: var(--cell-border);
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
import GridBody from "./GridBody.svelte"
|
import GridBody from "./GridBody.svelte"
|
||||||
import ResizeOverlay from "../overlays/ResizeOverlay.svelte"
|
import ResizeOverlay from "../overlays/ResizeOverlay.svelte"
|
||||||
import ReorderOverlay from "../overlays/ReorderOverlay.svelte"
|
import ReorderOverlay from "../overlays/ReorderOverlay.svelte"
|
||||||
|
import PopoverOverlay from "../overlays/PopoverOverlay.svelte"
|
||||||
import HeaderRow from "./HeaderRow.svelte"
|
import HeaderRow from "./HeaderRow.svelte"
|
||||||
import ScrollOverlay from "../overlays/ScrollOverlay.svelte"
|
import ScrollOverlay from "../overlays/ScrollOverlay.svelte"
|
||||||
import MenuOverlay from "../overlays/MenuOverlay.svelte"
|
import MenuOverlay from "../overlays/MenuOverlay.svelte"
|
||||||
|
@ -25,7 +26,6 @@
|
||||||
MaxCellRenderOverflow,
|
MaxCellRenderOverflow,
|
||||||
GutterWidth,
|
GutterWidth,
|
||||||
DefaultRowHeight,
|
DefaultRowHeight,
|
||||||
MinHeight,
|
|
||||||
} from "../lib/constants"
|
} from "../lib/constants"
|
||||||
|
|
||||||
export let API = null
|
export let API = null
|
||||||
|
@ -52,7 +52,7 @@
|
||||||
export let buttons = null
|
export let buttons = null
|
||||||
|
|
||||||
// Unique identifier for DOM nodes inside this instance
|
// Unique identifier for DOM nodes inside this instance
|
||||||
const rand = Math.random()
|
const rand = Math.random().toString().slice(2)
|
||||||
|
|
||||||
// Store props in a store for reference in other stores
|
// Store props in a store for reference in other stores
|
||||||
const props = writable($$props)
|
const props = writable($$props)
|
||||||
|
@ -78,7 +78,6 @@
|
||||||
contentLines,
|
contentLines,
|
||||||
gridFocused,
|
gridFocused,
|
||||||
error,
|
error,
|
||||||
focusedCellId,
|
|
||||||
} = context
|
} = context
|
||||||
|
|
||||||
// Keep config store up to date with props
|
// Keep config store up to date with props
|
||||||
|
@ -130,8 +129,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 +
|
style="--row-height:{$rowHeight}px; --default-row-height:{DefaultRowHeight}px; --gutter-width:{GutterWidth}px; --max-cell-render-overflow:{MaxCellRenderOverflow}px; --content-lines:{$contentLines};"
|
||||||
$rowHeight}px;"
|
|
||||||
>
|
>
|
||||||
{#if showControls}
|
{#if showControls}
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
|
@ -183,6 +181,7 @@
|
||||||
<ReorderOverlay />
|
<ReorderOverlay />
|
||||||
<ScrollOverlay />
|
<ScrollOverlay />
|
||||||
<MenuOverlay />
|
<MenuOverlay />
|
||||||
|
<PopoverOverlay />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -221,7 +220,6 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: var(--grid-background);
|
background: var(--grid-background);
|
||||||
min-height: var(--min-height);
|
|
||||||
}
|
}
|
||||||
.grid,
|
.grid,
|
||||||
.grid :global(*) {
|
.grid :global(*) {
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
dispatch,
|
dispatch,
|
||||||
rows,
|
rows,
|
||||||
columnRenderMap,
|
columnRenderMap,
|
||||||
|
rand,
|
||||||
} = getContext("grid")
|
} = getContext("grid")
|
||||||
|
|
||||||
$: rowSelected = !!$selectedRows[row._id]
|
$: rowSelected = !!$selectedRows[row._id]
|
||||||
|
@ -45,6 +46,7 @@
|
||||||
{row}
|
{row}
|
||||||
{invertY}
|
{invertY}
|
||||||
{rowFocused}
|
{rowFocused}
|
||||||
|
{rand}
|
||||||
invertX={columnIdx >= $columnHorizontalInversionIndex}
|
invertX={columnIdx >= $columnHorizontalInversionIndex}
|
||||||
highlighted={rowHovered || rowFocused || reorderSource === column.name}
|
highlighted={rowHovered || rowFocused || reorderSource === column.name}
|
||||||
selected={rowSelected}
|
selected={rowSelected}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
export const Padding = 400
|
export const Padding = 100
|
||||||
export const ScrollBarSize = 8
|
export const ScrollBarSize = 8
|
||||||
export const GutterWidth = 72
|
export const GutterWidth = 72
|
||||||
export const DefaultColumnWidth = 200
|
export const DefaultColumnWidth = 200
|
||||||
|
@ -12,4 +12,3 @@ export const BlankRowID = "blank"
|
||||||
export const RowPageSize = 100
|
export const RowPageSize = 100
|
||||||
export const FocusedCellMinOffset = 48
|
export const FocusedCellMinOffset = 48
|
||||||
export const MaxCellRenderOverflow = 222
|
export const MaxCellRenderOverflow = 222
|
||||||
export const MinHeight = Padding + SmallRowHeight
|
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
<script>
|
||||||
|
import { Popover } from "@budibase/bbui"
|
||||||
|
import { getContext } from "svelte"
|
||||||
|
|
||||||
|
export let rand
|
||||||
|
export let invertX
|
||||||
|
export let open
|
||||||
|
export let anchor
|
||||||
|
|
||||||
|
const { rowHeight, scroll } = getContext("grid")
|
||||||
|
|
||||||
|
let initialOffsetX = 0
|
||||||
|
let initialOffsetY = 0
|
||||||
|
|
||||||
|
$: updateInitialOffsets(open)
|
||||||
|
$: offsetX = initialOffsetX - $scroll.left
|
||||||
|
$: offsetY = initialOffsetY - ($scroll.top % $rowHeight)
|
||||||
|
$: style = `transform: translateX(${offsetX}px) translateY(${offsetY}px);`
|
||||||
|
$: markup = `<style>.grid-popover-container .spectrum-Popover { ${style} }</style>`
|
||||||
|
|
||||||
|
const updateInitialOffsets = open => {
|
||||||
|
if (!open) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
initialOffsetX = $scroll.left
|
||||||
|
initialOffsetY = $scroll.top % $rowHeight
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- eslint-disable-next-line svelte/no-at-html-tags -->
|
||||||
|
{@html markup}
|
||||||
|
<Popover
|
||||||
|
bind:open
|
||||||
|
{anchor}
|
||||||
|
align={invertX ? "right" : "left"}
|
||||||
|
portalTarget="#grid-{rand} .grid-popover-container"
|
||||||
|
offset={0}
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</Popover>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<div class="grid-popover-container" />
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.grid-popover-container {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -127,6 +127,7 @@
|
||||||
on:mousedown={startVDragging}
|
on:mousedown={startVDragging}
|
||||||
on:touchstart={startVDragging}
|
on:touchstart={startVDragging}
|
||||||
class:dragging={isDraggingV}
|
class:dragging={isDraggingV}
|
||||||
|
data-ignore-click-outside="true"
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
{#if $showHScrollbar}
|
{#if $showHScrollbar}
|
||||||
|
@ -137,6 +138,7 @@
|
||||||
on:mousedown={startHDragging}
|
on:mousedown={startHDragging}
|
||||||
on:touchstart={startHDragging}
|
on:touchstart={startHDragging}
|
||||||
class:dragging={isDraggingH}
|
class:dragging={isDraggingH}
|
||||||
|
data-ignore-click-outside="true"
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue