Add legacy in-memory filtering and sorting for views and external datasources

This commit is contained in:
Andrew Kingston 2021-05-11 19:07:52 +01:00
parent a3fbe6a34a
commit 6d1c9c3e44
4 changed files with 50 additions and 16 deletions

View File

@ -80,7 +80,7 @@
/>
{/each}
<div>
<Button icon="AddCircle" size="S" cta on:click={addField}>
<Button icon="AddCircle" secondary on:click={addField}>
Add
{fieldLabel}
</Button>

View File

@ -12,22 +12,35 @@
getDatasourceForProvider,
getSchemaForDatasource,
} from "builderStore/dataBinding"
import FilterBuilder from "./FilterBuilder.svelte"
import LuceneFilterBuilder from "./LuceneFilterBuilder.svelte"
import { currentAsset } from "builderStore"
import SaveFields from "../EventsEditor/actions/SaveFields.svelte"
const dispatch = createEventDispatcher()
export let value = {}
export let value = []
export let componentInstance
let drawer
let tempValue = Array.isArray(value) ? value : []
let tempValue = value
$: schemaFields = getSchemaFields(componentInstance)
$: numFilters = Array.isArray(tempValue)
? tempValue.length
: Object.keys(tempValue || {}).length
$: dataSource = getDatasourceForProvider($currentAsset, componentInstance)
$: schema = getSchemaForDatasource(dataSource)?.schema
$: schemaFields = Object.values(schema || {})
$: internalTable = dataSource?.type === "table"
const getSchemaFields = component => {
const datasource = getDatasourceForProvider($currentAsset, component)
const { schema } = getSchemaForDatasource(datasource)
return Object.values(schema || {})
// Reset value if value is wrong type for the datasource.
// Lucene editor needs an array, and simple editor needs an object.
$: {
if (internalTable && !Array.isArray(value)) {
tempValue = []
dispatch("change", [])
} else if (!internalTable && Array.isArray(value)) {
tempValue = {}
dispatch("change", {})
}
}
const saveFilter = async () => {
@ -43,14 +56,35 @@
<DrawerContent slot="body">
<Layout>
<Body size="S">
{#if !Object.keys(tempValue || {}).length}
{#if !numFilters}
Add your first filter column.
{:else}
Results are filtered to only those which match all of the following
constaints.
{/if}
</Body>
<FilterBuilder bind:value={tempValue} {schemaFields} />
{#if internalTable}
<LuceneFilterBuilder bind:value={tempValue} {schemaFields} />
{:else}
<div class="fields">
<SaveFields
parameterFields={Array.isArray(value) ? {} : value}
{schemaFields}
valueLabel="Equals"
on:change={e => (tempValue = e.detail)}
/>
</div>
{/if}
</Layout>
</DrawerContent>
</Drawer>
<style>
.fields {
display: grid;
column-gap: var(--spacing-l);
row-gap: var(--spacing-s);
align-items: center;
grid-template-columns: auto 1fr auto 1fr auto;
}
</style>

View File

@ -24,7 +24,7 @@
let pageNumber = 0
$: internalTable = dataSource?.type === "table"
$: query = dataSource?.type === "table" ? buildLuceneQuery(filter) : null
$: query = internalTable ? buildLuceneQuery(filter) : null
$: hasNextPage = bookmarks[pageNumber + 1] != null
$: hasPrevPage = pageNumber > 0
$: getSchema(dataSource)
@ -34,8 +34,8 @@
if (internalTable) {
rows = allRows
} else {
rows = sortRows(allRows, sortColumn, sortOrder)
rows = limitRows(rows, limit)
const sortedRows = sortRows(allRows, sortColumn, sortOrder)
rows = limitRows(sortedRows, limit)
}
}
$: actions = [
@ -213,7 +213,7 @@
}
const nextPage = async () => {
if (!hasNextPage) {
if (!hasNextPage || !internalTable) {
return
}
const res = await API.searchTable({
@ -244,7 +244,7 @@
}
const prevPage = async () => {
if (!hasPrevPage) {
if (!hasPrevPage || !internalTable) {
return
}
const res = await API.searchTable({