widget column bar - respects sizes

This commit is contained in:
Jan Prochazka
2021-03-18 09:58:25 +01:00
parent 9089f78593
commit 24f4e1d898
3 changed files with 87 additions and 14 deletions

View File

@@ -1,5 +1,39 @@
<div class="main-container">
<slot></slot>
<script lang="ts">
import { setContext } from 'svelte';
import { writable } from 'svelte/store';
import createRef from '../utility/createRef';
let definitions = [];
const dynamicPropsCollection = [];
let clientHeight;
const widgetColumnBarHeight = writable(0);
setContext('widgetColumnBarHeight', widgetColumnBarHeight);
setContext('pushWidgetItemDefinition', (item, dynamicProps) => {
dynamicPropsCollection.push(dynamicProps);
definitions = [...definitions, item];
return definitions.length - 1;
});
setContext('updateWidgetItemDefinition', (index, item) => {
definitions[index] = item;
});
$: $widgetColumnBarHeight = clientHeight;
$: computeDynamicProps(definitions);
function computeDynamicProps(defs: any[]) {
for (let index = 0; index < defs.length; index++) {
const definition = defs[index];
const splitterVisible = !!defs.slice(index + 1).find(x => x && !x.collapsed && !x.skip);
dynamicPropsCollection[index].set({ splitterVisible });
}
}
</script>
<div class="main-container" bind:clientHeight>
<slot />
</div>
<style>

View File

@@ -1,28 +1,69 @@
<script lang="ts">
import _ from 'lodash';
import { getContext } from 'svelte';
import { writable } from 'svelte/store';
import WidgetTitle from './WidgetTitle.svelte';
import splitterDrag from '../utility/splitterDrag';
export let title;
export let name;
export let skip = false;
export let height = null;
export let collapsed = null;
let size = 0;
const dynamicProps = writable({
splitterVisible: false,
});
const pushWidgetItemDefinition = getContext('pushWidgetItemDefinition') as any;
const updateWidgetItemDefinition = getContext('updateWidgetItemDefinition') as any;
const widgetColumnBarHeight = getContext('widgetColumnBarHeight') as any;
const widgetItemIndex = pushWidgetItemDefinition(
{
collapsed,
height,
},
dynamicProps
);
$: updateWidgetItemDefinition(widgetItemIndex, { collapsed: !visible, height });
$: setInitialSize(height, $widgetColumnBarHeight);
function setInitialSize(initialSize, parentHeight) {
if (_.isString(initialSize) && initialSize.endsWith('px')) size = parseInt(initialSize.slice(0, -2));
else if (_.isString(initialSize) && initialSize.endsWith('%'))
size = (parentHeight * parseFloat(initialSize.slice(0, -1))) / 100;
else size = parentHeight / 3;
}
let visible = !collapsed;
</script>
<WidgetTitle on:click={() => (visible = !visible)}>{title}</WidgetTitle>
{#if !skip}
<WidgetTitle on:click={() => (visible = !visible)}>{title}</WidgetTitle>
{#if visible}
<div>
<slot />
</div>
{#if visible}
<div class="wrapper" style={$dynamicProps.splitterVisible ? `height:${size}px` : 'flex: 1 1 0'}>
<slot />
</div>
{#if $dynamicProps.splitterVisible}
<div class="vertical-split-handle" use:splitterDrag={'clientY'} on:resizeSplitter={e => (size += e.detail)} />
{/if}
{/if}
{/if}
<style>
div {
.wrapper {
overflow: hidden;
position: relative;
flex-direction: column;
display: flex;
min-height: 100px;
}
</style>