From 6f0cda0e1ea84e2b5c5d297c841749dc5bae879d Mon Sep 17 00:00:00 2001 From: Faton Ramadani Date: Wed, 11 Oct 2023 14:12:48 +0200 Subject: [PATCH] feat(frontend): Table wizard (#2416) * feat(frontend): add helper to configure AG Grid columns def * feat(frontend): add all options * feat(frontend): column definition helper * feat(frontend): add header name * feat(frontend): add presets * feat(frontend): wip * feat(frontend): rework preset * feat(frontend): rework preset * feat(frontend): table wizard * feat(frontend): wip * feat(frontend): wip * feat(frontend): ordering * feat(frontend): add sizing options * feat(frontend): add sync button * feat(frontend): add quick add column buttonsa --- .../components/display/table/AppCell.svelte | 16 +++++ .../components/display/table/AppTable.svelte | 48 ++++++++++---- .../apps/editor/component/components.ts | 7 ++ .../ArrayStaticInputEditor.svelte | 26 +++++++- .../settingsPanel/QuickAddColumn.svelte | 64 +++++++++++++++++++ .../inputEditor/StaticInputEditor.svelte | 22 +++++++ frontend/src/lib/components/apps/inputType.ts | 2 + .../wizards/TableColumnWizard.svelte | 56 ++++++++++++++++ 8 files changed, 229 insertions(+), 12 deletions(-) create mode 100644 frontend/src/lib/components/apps/components/display/table/AppCell.svelte create mode 100644 frontend/src/lib/components/apps/editor/settingsPanel/QuickAddColumn.svelte create mode 100644 frontend/src/lib/components/wizards/TableColumnWizard.svelte diff --git a/frontend/src/lib/components/apps/components/display/table/AppCell.svelte b/frontend/src/lib/components/apps/components/display/table/AppCell.svelte new file mode 100644 index 0000000000..395ead1311 --- /dev/null +++ b/frontend/src/lib/components/apps/components/display/table/AppCell.svelte @@ -0,0 +1,16 @@ + + +{#if type === 'badge'} + + {value} + +{:else if type === 'link'} + {value} +{:else} + {value} +{/if} 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 354e2ede7c..7aedf2a61e 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppTable.svelte @@ -37,6 +37,7 @@ import { Popup } from '$lib/components/common' import ComponentOutputViewer from '$lib/components/apps/editor/contextPanel/ComponentOutputViewer.svelte' import { Plug2 } from 'lucide-svelte' + import AppCell from './AppCell.svelte' export let id: string export let componentInput: AppInput | undefined @@ -147,10 +148,6 @@ } } - function cellIsObject(x: (any) => any, props: any): boolean { - return typeof x != 'string' && typeof x(props) == 'object' - } - let filteredResult: Array> = [] function setFilteredResult() { @@ -250,6 +247,11 @@ } } + function getDisplayNameById(id: string) { + const component = resolvedConfig.columnDefs.find((columnDef) => columnDef.field === id) + return component?.headerName + } + function safeVisibleCell(row: Row) { try { return row.getVisibleCells() @@ -259,6 +261,25 @@ return [] } } + + function updateTable(resolvedConfig) { + $table.getAllLeafColumns().map((column) => { + const columnConfig = resolvedConfig.columnDefs.find( + // @ts-ignore + (columnDef) => columnDef.field === column.columnDef.accessorKey + ) + + if (columnConfig?.hideColumn === column.getIsVisible()) { + column.toggleVisibility() + } + }) + + $table.setColumnOrder(() => + resolvedConfig.columnDefs.map((columnDef: { field: any }) => columnDef.field) + ) + } + + $: updateTable(resolvedConfig) {#each Object.keys(components['tablecomponent'].initialData.configuration) as key (key)} @@ -327,9 +348,12 @@ {@const context = header?.getContext()} {#if context} {@const component = renderCell(header.column.columnDef.header, context)} + {@const displayName = getDisplayNameById(header.id)} - {#if !header.isPlaceholder && component} + {#if displayName} + {displayName} + {:else if !header.isPlaceholder && component} {/if} @@ -363,18 +387,20 @@ {#if cell?.column?.columnDef?.cell} {@const context = cell?.getContext()} {#if context} - {@const component = renderCell(cell.column.columnDef.cell, context)} toggleRow(row)} on:click={() => toggleRow(row)} class="p-4 whitespace-pre-wrap truncate text-xs text-primary" style={'width: ' + cell.column.getSize() + 'px'} > - {#if typeof cell.column.columnDef.cell != 'string' && cellIsObject(cell.column.columnDef.cell, context)} - {JSON.stringify(cell.column.columnDef.cell(context), null, 4)} - {:else if component != undefined} - - {/if} + c.field === cell.column.columnDef.accessorKey + )?.type ?? 'text'} + value={cell.getValue()} + /> {/if} {/if} diff --git a/frontend/src/lib/components/apps/editor/component/components.ts b/frontend/src/lib/components/apps/editor/component/components.ts index 96afb8c903..7bf37745e1 100644 --- a/frontend/src/lib/components/apps/editor/component/components.ts +++ b/frontend/src/lib/components/apps/editor/component/components.ts @@ -90,6 +90,7 @@ export type PieChartComponent = BaseComponent<'piechartcomponent'> export type ChartJsComponent = BaseComponent<'chartjscomponent'> export type ScatterChartComponent = BaseComponent<'scatterchartcomponent'> + export type TableComponent = BaseComponent<'tablecomponent'> & { actionButtons: (BaseAppComponent & ButtonComponent & GridItem)[] } @@ -1387,6 +1388,12 @@ This is a paragraph. }, initialData: { configuration: { + columnDefs: { + type: 'static', + fieldType: 'array', + subFieldType: 'table-column', + value: [{ field: 'id' }, { field: 'name' }, { field: 'age' }] + } as StaticAppInput, search: { fieldType: 'select', type: 'static', diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte index 664c96e57c..bd094a5b46 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte @@ -9,6 +9,7 @@ import { dndzone, SOURCES, TRIGGERS } from 'svelte-dnd-action' import { generateRandomString, pluralize } from '$lib/utils' import Toggle from '$lib/components/Toggle.svelte' + import QuickAddColumn from './QuickAddColumn.svelte' const flipDurationMs = 200 @@ -47,6 +48,8 @@ value.push(selectOptions[0]) } else if (subFieldType === 'ag-grid') { value.push({ field: 'newField', editable: true, flex: 1 }) + } else if (subFieldType === 'table-column') { + value.push({ field: 'newColumn', headerName: 'New column', type: 'text' }) } } else { value.push('') @@ -132,7 +135,7 @@
{pluralize(items.length, 'item')}
- {#if subFieldType === 'ag-grid'} + {#if subFieldType === 'ag-grid' || subFieldType === 'table-column'}
+
+
addElementByType()}> Add + + {#if subFieldType === 'table-column'} + item.field)} + on:add={({ detail }) => { + if (!componentInput.value) componentInput.value = [] + + componentInput.value.push({ field: detail, headerName: detail, type: 'text' }) + componentInput = componentInput + + if (componentInput.value) { + items.push({ + value: componentInput.value[componentInput.value.length - 1], + id: generateRandomString() + }) + } + }} + /> + {/if}
diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/QuickAddColumn.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/QuickAddColumn.svelte new file mode 100644 index 0000000000..dbeb764dcc --- /dev/null +++ b/frontend/src/lib/components/apps/editor/settingsPanel/QuickAddColumn.svelte @@ -0,0 +1,64 @@ + + +{#if remainingColumns.length > 0} +
Quick add
+ +
+ {#each remainingColumns as column} + + {/each} +
+{/if} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte index 1b4288ab47..e4e80cdf28 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte @@ -14,6 +14,7 @@ import Button from '$lib/components/common/button/Button.svelte' import { Settings } from 'lucide-svelte' import AgGridWizard from '$lib/components/wizards/AgGridWizard.svelte' + import TableColumnWizard from '$lib/components/wizards/TableColumnWizard.svelte' export let componentInput: StaticInput | undefined export let fieldType: InputType | undefined = undefined @@ -139,6 +140,27 @@
+ {:else if fieldType === 'table-column'} +
+
+ +
+ + + + + +
+
+
{:else}