diff --git a/src/lib/Crud/Form.ts b/src/lib/Crud/Form.ts index 9f64dd23..4e3d1354 100644 --- a/src/lib/Crud/Form.ts +++ b/src/lib/Crud/Form.ts @@ -1,6 +1,6 @@ import type { CrudOperation, FieldInterface, FieldOptions } from '$lib'; -export type SubmittedData = Record; +export type SubmittedData = Record>; /** * Function to get an record of {@link FormDataEntryValue} items from an "onSubmit" form {@link SubmitEvent} object. @@ -18,8 +18,15 @@ export function getSubmittedFormData(event: SubmitEvent): SubmittedData { return {}; } - new FormData(target as HTMLFormElement, event.submitter).forEach((value, key) => { - normalizedData[key] = value; + const formData = new FormData(target as HTMLFormElement, event.submitter); + + formData.forEach((value, key) => { + if (normalizedData[key] && !Array.isArray(normalizedData[key])) { + normalizedData[key] = [normalizedData[key]]; + normalizedData[key].push(value); + } else { + normalizedData[key] = value; + } }); return normalizedData; diff --git a/src/lib/Filter.ts b/src/lib/Filter.ts index 215d7e3f..1c278335 100644 --- a/src/lib/Filter.ts +++ b/src/lib/Filter.ts @@ -36,8 +36,8 @@ export class BooleanFilter extends Filter { } /** */ -export class DateFilter extends Filter { - public readonly componentName: FilterTheme = 'date'; +export class DateRangeFilter extends Filter { + public readonly componentName: FilterTheme = 'date_range'; } /** */ diff --git a/src/lib/themes/svelte/carbon/Crud/CrudList.svelte b/src/lib/themes/svelte/carbon/Crud/CrudList.svelte index 294a4ffd..2a4d5974 100644 --- a/src/lib/themes/svelte/carbon/Crud/CrudList.svelte +++ b/src/lib/themes/svelte/carbon/Crud/CrudList.svelte @@ -7,7 +7,7 @@ import type { BaseField, FieldOptions } from '$lib/Fields'; import type { CrudDefinition } from '$lib/Crud'; - import { List } from '$lib/Crud/Operations'; + import { type CrudOperation, List } from '$lib/Crud/Operations'; import type { Action } from '$lib/Actions'; @@ -76,7 +76,13 @@ ]).then((results) => results[0]); } - rows = providerResponse.then((responseResults) => { + type Item = { + id?: null | string | number; + __crud_operation?: CrudOperation; + [key: string]: unknown; + }; + + rows = providerResponse.then((responseResults): Item[] => { if ( responseResults && !Array.isArray(responseResults) && @@ -87,10 +93,9 @@ ); } - let finalRows = - responseResults instanceof PaginatedResults - ? responseResults.currentItems - : responseResults; + let finalRows: Array = ( + responseResults instanceof PaginatedResults ? responseResults.currentItems : responseResults + ) as Array; paginator = responseResults instanceof PaginatedResults ? responseResults : undefined; @@ -100,9 +105,9 @@ // Make sure final results always have the "id" field, // which is mandatory for Carbon's DataTable. - finalRows = finalRows.map((result: object) => { + finalRows = finalRows.map((result: Item) => { if (!result.id && crud.options.identifierFieldName !== 'id') { - result.id = result[crud.options.identifierFieldName]; + result.id = String(result[crud.options.identifierFieldName] || ''); } result.__crud_operation = operation; @@ -162,6 +167,7 @@ {onSort} sortable={sortableDataTable} filters={configuredFilters} + filtersValues={requestParameters.filters} theme={dashboard.theme} on:submitFilters={onFiltersSubmit} > diff --git a/src/lib/themes/svelte/carbon/DataTable/DataTable.svelte b/src/lib/themes/svelte/carbon/DataTable/DataTable.svelte index 3e6e1110..7b9aea83 100644 --- a/src/lib/themes/svelte/carbon/DataTable/DataTable.svelte +++ b/src/lib/themes/svelte/carbon/DataTable/DataTable.svelte @@ -29,6 +29,7 @@ export let globalActions: Array = []; export let batchActions: Action[] = []; export let filters: Array> = []; + export let filtersValues: { [key: string]: string | Array | undefined } = {}; export let page: number | undefined; export let theme: ThemeConfig; export let sortable: boolean; @@ -154,6 +155,7 @@ {theme} actions={globalActionsDisplay || []} filters={filters || []} + filtersValues={filtersValues || {}} on:submitFilters={onFiltersSubmit} /> {/if} diff --git a/src/lib/themes/svelte/carbon/DataTable/Toolbar/DataTableToolbar.svelte b/src/lib/themes/svelte/carbon/DataTable/Toolbar/DataTableToolbar.svelte index b3bbd13d..d2cd759a 100644 --- a/src/lib/themes/svelte/carbon/DataTable/Toolbar/DataTableToolbar.svelte +++ b/src/lib/themes/svelte/carbon/DataTable/Toolbar/DataTableToolbar.svelte @@ -19,17 +19,18 @@ export let actions: Array = []; export let filters: Array> = []; + export let filtersValues: { [key: string]: string | Array | undefined } = {}; export let theme: ThemeConfig; - let filtersValues: Record = {}; - const dispatchEvent = createEventDispatcher<{ submitFilters: SubmitEvent }>(); + const dispatchEvent = createEventDispatcher<{ submitFilters: SubmittedData }>(); filters.forEach((filter: Filter) => { - filtersValues[filter.field] = undefined; + filtersValues[filter.field] ??= undefined; }); function onFiltersSubmit(event: SubmitEvent) { event.preventDefault(); + event.stopPropagation(); if (!event.target) { throw new Error( 'No target when submitted filters. Did you forget to attach the event to a Form?' @@ -66,15 +67,15 @@ {#if filters.length} - + !!i).length > 0}> {$_('datatable.filters.menu_title')} -
+ {#each filters as filter}
- + {/each}