perspectives: fixed table header

This commit is contained in:
Jan Prochazka
2022-07-01 08:00:21 +02:00
parent 34ca4c501a
commit 93269fe314

View File

@@ -8,11 +8,14 @@
} from 'dbgate-datalib'; } from 'dbgate-datalib';
import _, { range } from 'lodash'; import _, { range } from 'lodash';
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { prop_dev } from 'svelte/internal'; import { prop_dev, tick } from 'svelte/internal';
export let root: PerspectiveTreeNode; export let root: PerspectiveTreeNode;
let dataRows; let dataRows;
let domWrapper; let domWrapper;
let domTableHead;
let domHeaderWrap;
let theadClone;
async function loadLevelData(node: PerspectiveTreeNode, parentRows: any[]) { async function loadLevelData(node: PerspectiveTreeNode, parentRows: any[]) {
// const loadProps: PerspectiveDataLoadPropsWithNode[] = []; // const loadProps: PerspectiveDataLoadPropsWithNode[] = [];
@@ -72,19 +75,41 @@
// } // }
} }
function handleScroll() { async function createHeaderClone() {
const translate = 'translate(0,' + domWrapper.scrollTop + 'px)'; if (!domTableHead || !domHeaderWrap) return;
domWrapper.querySelector('thead').style.transform = translate; await tick();
if (theadClone) {
theadClone.remove();
theadClone = null;
}
theadClone = domTableHead.cloneNode(true);
const sourceCells = domTableHead.querySelectorAll('th');
const targetCells = theadClone.querySelectorAll('th');
domHeaderWrap.appendChild(theadClone);
for (const [src, dst] of _.zip(sourceCells, targetCells)) {
// @ts-ignore
dst.style.width = `${src.getBoundingClientRect().width}px`;
}
} }
$: loadData(root); $: loadData(root);
$: display = root && dataRows ? new PerspectiveDisplay(root, dataRows) : null; $: display = root && dataRows ? new PerspectiveDisplay(root, dataRows) : null;
$: {
display;
domTableHead;
domHeaderWrap;
createHeaderClone();
}
</script> </script>
<div class="wrapper" on:scroll={handleScroll} bind:this={domWrapper}> <div class="headerWrap" bind:this={domHeaderWrap} />
<div class="wrapper" bind:this={domWrapper}>
{#if display} {#if display}
<table> <table>
<thead> <thead bind:this={domTableHead}>
{#each _.range(display.columnLevelCount) as columnLevel} {#each _.range(display.columnLevelCount) as columnLevel}
<tr> <tr>
{#each display.columns as column} {#each display.columns as column}
@@ -121,6 +146,14 @@
display: flex; display: flex;
} }
.headerWrap {
position: absolute;
left: 0;
top: 0;
right: 16px;
z-index: 100;
}
table { table {
/* position: absolute; /* position: absolute;
left: 0; left: 0;