improve flow UX

This commit is contained in:
Ruben Fiszel
2022-11-14 23:49:07 +01:00
parent fc16960df2
commit 302fe292c0
4 changed files with 29 additions and 15 deletions
+18 -10
View File
@@ -1,8 +1,9 @@
<script lang="ts">
import Fuse from 'fuse.js'
import { Drawer } from './common'
import { Drawer, Skeleton } from './common'
import DrawerContent from './common/drawer/DrawerContent.svelte'
import IconedResourceType from './IconedResourceType.svelte'
import WindmillIcon from './icons/WindmillIcon.svelte'
type Item = Record<string, any>
export let pickCallback: (path: string, f: string) => void
@@ -12,6 +13,7 @@
export let closeOnClick = true
export let noItemMessage = ''
let loading = false
let items: Item[] | undefined = []
let filteredItems: Item[] | undefined = []
let itemsFilter = ''
@@ -23,11 +25,13 @@
const fuse: Fuse<Item> = new Fuse(items, fuseOptions)
export function openDrawer() {
loading = true
loadItems().then((v) => {
items = v
if (items) {
fuse.setCollection(items)
}
loading = false
})
drawer.openDrawer()
}
@@ -41,15 +45,19 @@
<Drawer bind:this={drawer} size="600px">
<DrawerContent title="Search a {itemName}" on:close={drawer.closeDrawer}>
<div>
{#if filteredItems}
<div class="w-12/12 pb-4">
<input
type="text"
placeholder="Search {itemName}"
bind:value={itemsFilter}
class="search-item"
/>
</div>
<div class="w-12/12 pb-4">
<input
type="text"
placeholder="Search {itemName}"
bind:value={itemsFilter}
class="search-item"
/>
</div>
{#if loading}
{#each new Array(6) as _}
<Skeleton layout={[[2], 0.7]} />
{/each}
{:else if filteredItems}
<ul class="divide-y divide-gray-200">
{#each filteredItems as obj}
<li
@@ -13,6 +13,7 @@
<div class="flex flex-col divide-y h-screen max-h-screen">
<div class="flex justify-between items-center gap-x-2">
<Button
btnClasses="m-1"
variant="border"
size="lg"
color="dark"
@@ -4,6 +4,7 @@
import FlowModuleSchemaMap from './map/FlowModuleSchemaMap.svelte'
import { flowStore } from './flowStore'
import WindmillIcon from '../icons/WindmillIcon.svelte'
import { Skeleton } from '../common'
export let initialPath: string
export let loading: boolean
@@ -14,10 +15,10 @@
<Pane size={25} minSize={20} class="h-full">
<div class="grow overflow-auto bg-gray h-full bg-gray-50 relative">
{#if loading}
<div class="w-full h-full">
<div class="block m-auto mt-40 w-10">
<WindmillIcon class="animate-[spin_6s_linear_infinite]" height="40px" width="40px" />
</div>
<div class="p-2 pt-10">
{#each new Array(6) as _}
<Skeleton layout={[[2], 1.5]} />
{/each}
</div>
{:else if $flowStore.value.modules}
<FlowModuleSchemaMap bind:modules={$flowStore.value.modules} root />
@@ -20,6 +20,8 @@
let stateLoadedFromUrl = initialState != undefined ? decodeState(initialState) : undefined
const initialArgs = decodeArgs($page.url.searchParams.get('args') ?? undefined)
let loading = false
let selectedId: string = 'settings-graph'
let flow: Flow = {
@@ -38,6 +40,7 @@
initFlow(flow)
async function loadFlow(): Promise<void> {
loading = true
flow =
stateLoadedFromUrl != undefined && stateLoadedFromUrl?.flow?.path == flow.path
? stateLoadedFromUrl.flow
@@ -48,6 +51,7 @@
initialPath = flow.path
await initFlow(flow)
loading = false
selectedId = stateLoadedFromUrl?.selectedId
$dirtyStore = false
}
@@ -59,4 +63,4 @@
}
</script>
<FlowBuilder {initialPath} {selectedId} {initialArgs} />
<FlowBuilder {initialPath} {selectedId} {initialArgs} {loading} />