From 33c07d3e63f96673719ecb15e45f4cd9e18be80e Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Tue, 28 Mar 2023 16:58:43 +0200 Subject: [PATCH] feat(frontend): add pagination --- .../components/display/table/AppTable.svelte | 108 +++++++++++------- .../display/table/AppTableFooter.svelte | 3 +- .../components/display/table/tableOptions.ts | 2 +- .../components/helpers/DebouncedInput.svelte | 1 + .../apps/components/helpers/InputValue.svelte | 4 +- .../helpers/RunnableComponent.svelte | 4 +- .../apps/components/helpers/eval.ts | 8 +- .../apps/editor/component/components.ts | 8 ++ .../propertyPicker/ObjectViewer.svelte | 3 - .../(root)/(logged)/run/[...run]/+page.svelte | 2 +- 10 files changed, 87 insertions(+), 56 deletions(-) diff --git a/frontend/src/lib/components/apps/components/display/table/AppTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppTable.svelte index dfdb74a8c0..a5567405b0 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppTable.svelte @@ -17,10 +17,11 @@ import AppTableFooter from './AppTableFooter.svelte' import { tableOptions } from './tableOptions' import Alert from '$lib/components/common/alert/Alert.svelte' - import type { ButtonComponent } from '../../../editor/component' + import { components, type ButtonComponent } from '../../../editor/component' import { concatCustomCss } from '../../../utils' import { twMerge } from 'tailwind-merge' - import { initOutput } from '$lib/components/apps/editor/appUtils' + import { initConfig, initOutput } from '$lib/components/apps/editor/appUtils' + import ResolveConfig from '../../helpers/ResolveConfig.svelte' export let id: string export let componentInput: AppInput | undefined @@ -34,9 +35,19 @@ let result: Record[] | undefined = undefined - let search: 'By Runnable' | 'By Component' | 'Disabled' | undefined = undefined + const { app, worldStore, componentControl, selectedComponent, hoverStore, mode } = + getContext('AppViewerContext') + let searchValue = '' - let pagination: boolean | undefined = true + + let outputs = initOutput($worldStore, id, { + selectedRowIndex: 0, + selectedRow: undefined, + loading: false, + result: [], + search: '', + page: 1 + }) $: setSearch(searchValue) @@ -52,8 +63,13 @@ let table = createSvelteTable(options) - const { app, worldStore, componentControl, selectedComponent, hoverStore, mode } = - getContext('AppViewerContext') + let resolvedConfig = initConfig( + components['tablecomponent'].initialData.configuration, + configuration + ) as { + search: 'By Component' | 'By Runnable' | 'Disabled' | undefined + manualPagination: boolean + } let selectedRowIndex = -1 @@ -78,25 +94,6 @@ outputs && toggleRow({ original: result[0] }, 0) - function setOptions(filteredResult: Array>) { - if (!Array.isArray(result)) { - return - } - - const headers = Array.from(new Set(result.flatMap((row) => Object.keys(row)))) - - $options = { - ...tableOptions, - data: filteredResult, - columns: headers.map((header) => { - return { - accessorKey: header, - cell: (info) => info.getValue() - } - }) - } - } - function searchInResult(result: Array>, searchValue: string) { if (searchValue === '') { return result @@ -120,25 +117,48 @@ let filteredResult: Array> = [] - $: filteredResult && setOptions(filteredResult) - $: search === 'By Component' && (filteredResult = searchInResult(result ?? [], searchValue)) - $: (search === 'By Runnable' || search === 'Disabled') && (filteredResult = result ?? []) - let outputs = initOutput($worldStore, id, { - selectedRowIndex: 0, - selectedRow: undefined, - loading: false, - result: [], - search: '' - }) + function setFilteredResult() { + if (resolvedConfig.search === 'By Runnable' || resolvedConfig.search === 'Disabled') { + filteredResult = result ?? [] + } else { + filteredResult = searchInResult(result ?? [], searchValue) + } + } + $: (result || resolvedConfig.search || searchValue) && setFilteredResult() + + $: outputs.page.set($table.getState().pagination.pageIndex) function rerender() { + if (!Array.isArray(result)) { + return + } + + const headers = Array.from( + new Set(result.flatMap((row) => (typeof row == 'object' ? Object.keys(row) : []))) + ) + + $options = { + ...tableOptions, + manualPagination: resolvedConfig.manualPagination, + data: filteredResult, + columns: headers.map((header) => { + return { + accessorKey: header, + cell: (info) => info.getValue() + } + }) + } table = createSvelteTable(options) if (result) { toggleRow({ original: result[0] }, 0, true) } + + if (outputs.page.peak()) { + $table.setPageIndex(outputs?.page.peak()) + } } - $: result && rerender() + $: filteredResult && rerender() $: css = concatCustomCss($app.css?.tablecomponent, customCss) @@ -159,7 +179,14 @@ } - +{#each Object.keys(components['tablecomponent'].initialData.configuration) as key (key)} + +{/each} {#if Array.isArray(result) && result.every(isObject)} @@ -171,7 +198,7 @@ )} style={css?.container?.style ?? ''} > - {#if search !== 'Disabled'} + {#if resolvedConfig.search !== 'Disabled'}
@@ -354,8 +381,9 @@
export let paginationEnabled: boolean = false + export let manualPagination: boolean export let table: Readable> let c = '' export { c as class } @@ -31,7 +32,7 @@ class={twMerge('px-2 py-1 text-xs gap-2 items-center justify-between', c, 'flex flex-row')} {style} > - {#if paginationEnabled && result.length > (tableOptions.initialState?.pagination?.pageSize ?? 25)} + {#if (paginationEnabled && result.length > (tableOptions.initialState?.pagination?.pageSize ?? 25)) || manualPagination}