From 68f21274edb39148a41e4b11571033f2379b8704 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 19 Jun 2023 09:54:24 +0100 Subject: [PATCH] Add settings to grid block for filtering and sorting, and refactor grid logic to allow external control of these stores --- .../buttons/grid/GridFilterButton.svelte | 3 ++ packages/client/manifest.json | 18 +++++++++ .../src/components/app/GridBlock.svelte | 6 +++ .../grid/cells/RelationshipCell.svelte | 7 +++- .../src/components/grid/layout/Grid.svelte | 38 ++++++++++++++----- .../src/components/grid/stores/rows.js | 25 +++++------- packages/frontend-core/src/fetch/DataFetch.js | 6 ++- packages/frontend-core/src/utils/index.js | 1 + packages/frontend-core/src/utils/memo.js | 35 +++++++++++++++++ 9 files changed, 111 insertions(+), 28 deletions(-) create mode 100644 packages/frontend-core/src/utils/memo.js diff --git a/packages/builder/src/components/backend/DataTable/buttons/grid/GridFilterButton.svelte b/packages/builder/src/components/backend/DataTable/buttons/grid/GridFilterButton.svelte index 2283862303..45e5d4e2b0 100644 --- a/packages/builder/src/components/backend/DataTable/buttons/grid/GridFilterButton.svelte +++ b/packages/builder/src/components/backend/DataTable/buttons/grid/GridFilterButton.svelte @@ -4,6 +4,9 @@ const { columns, tableId, filter, table } = getContext("grid") + // Wipe filter whenever table ID changes to avoid using stale filters + $: $tableId, filter.set([]) + const onFilter = e => { filter.set(e.detail || []) } diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 327b05a320..3f36f2f666 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -5237,6 +5237,7 @@ "width": 600, "height": 400 }, + "info": "Grid Block is only compatible with internal or SQL tables", "settings": [ { "type": "table", @@ -5244,6 +5245,23 @@ "key": "table", "required": true }, + { + "type": "filter", + "label": "Filtering", + "key": "filter" + }, + { + "type": "field/sortable", + "label": "Sort column", + "key": "sortColumn" + }, + { + "type": "select", + "label": "Sort order", + "key": "sortOrder", + "options": ["Ascending", "Descending"], + "defaultValue": "Ascending" + }, { "type": "boolean", "label": "Add rows", diff --git a/packages/client/src/components/app/GridBlock.svelte b/packages/client/src/components/app/GridBlock.svelte index 482721613d..5267582bc8 100644 --- a/packages/client/src/components/app/GridBlock.svelte +++ b/packages/client/src/components/app/GridBlock.svelte @@ -9,6 +9,9 @@ export let allowEditRows = true export let allowDeleteRows = true export let stripeRows = false + export let filter = null + export let sortColumn = null + export let sortOrder = null const component = getContext("component") const { styleable, API, builderStore } = getContext("sdk") @@ -25,6 +28,9 @@ {allowEditRows} {allowDeleteRows} {stripeRows} + {filter} + {sortColumn} + {sortOrder} showControls={false} allowExpandRows={false} allowSchemaChanges={false} diff --git a/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte b/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte index 689c9a8a92..58aab8038b 100644 --- a/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte +++ b/packages/frontend-core/src/components/grid/cells/RelationshipCell.svelte @@ -42,6 +42,8 @@ let candidateIndex let lastSearchId let searching = false + let valuesHeight = 0 + let container $: oneRowOnly = schema?.relationshipType === "one-to-many" $: editable = focused && !readonly @@ -138,6 +140,8 @@ const open = async () => { isOpen = true + valuesHeight = container.getBoundingClientRect().height + console.log(valuesHeight) // Find the primary display for the related table if (!primaryDisplay) { @@ -243,7 +247,7 @@
-
+
1} @@ -290,6 +294,7 @@ class:invertY on:wheel|stopPropagation use:clickOutside={close} + style="--values-height:{valuesHeight}px;" >