- {{ value.label }}
+
+ {{ trans_choice('sharp::filters.select.label.selected', values.length, { count: values.length }) }}
+
+
+ {{ values[0]?.label }}
+
diff --git a/resources/js/show/components/fields/Dashboard.vue b/resources/js/show/components/fields/Dashboard.vue
index d33bbb728..2701a2476 100644
--- a/resources/js/show/components/fields/Dashboard.vue
+++ b/resources/js/show/components/fields/Dashboard.vue
@@ -90,11 +90,13 @@
}
async function onFilterChange(filter: FilterData, value: FilterData['value']) {
+ const filterValues = filters.nextValues(filter, value);
+ filters.setCurrentValues(filterValues);
const data = await api.post(
route('code16.sharp.api.dashboard.filters.store', { dashboardKey: props.field.dashboardKey }),
{
query: dashboard.value.query,
- filterValues: filters.nextValues(filter, value),
+ filterValues,
hiddenFilters: props.field.hiddenFilters,
}
)
@@ -104,11 +106,13 @@
}
async function onFiltersReset(resettedFilters: FilterData[]) {
+ const filterValues = filters.defaultValues(resettedFilters);
+ filters.setCurrentValues(filterValues);
const data = await api.post(
route('code16.sharp.api.dashboard.filters.store', { dashboardKey: props.field.dashboardKey }),
{
query: { ...dashboard.value.query, search: null },
- filterValues: filters.defaultValues(resettedFilters),
+ filterValues,
hiddenFilters: props.field.hiddenFilters,
}
)
diff --git a/resources/js/show/components/fields/EntityList.vue b/resources/js/show/components/fields/EntityList.vue
index 0df03d263..34ae6cdc4 100644
--- a/resources/js/show/components/fields/EntityList.vue
+++ b/resources/js/show/components/fields/EntityList.vue
@@ -93,11 +93,13 @@
}
async function onFilterChange(filter: FilterData, value: FilterData['value']) {
+ const filterValues = filters.nextValues(filter, value);
+ filters.setCurrentValues(filterValues);
const data = await api.post(
route('code16.sharp.api.list.filters.store', { entityKey: props.field.entityListKey }),
{
query: entityList.value.query,
- filterValues: filters.nextValues(filter, value),
+ filterValues,
hiddenFilters: props.field.hiddenFilters,
}
)
@@ -107,11 +109,13 @@
}
async function onFilterResetAll() {
+ const filterValues = filters.defaultValues(filters.rootFilters);
+ filters.setCurrentValues(filterValues);
const data = await api.post(
route('code16.sharp.api.list.filters.store', { entityKey: props.field.entityListKey }),
{
query: { ...entityList.value.query, search: null },
- filterValues: filters.defaultValues(filters.rootFilters),
+ filterValues,
hiddenFilters: props.field.hiddenFilters,
}
)
diff --git a/resources/js/types/generated.d.ts b/resources/js/types/generated.d.ts
index 038f68dca..706022c5b 100644
--- a/resources/js/types/generated.d.ts
+++ b/resources/js/types/generated.d.ts
@@ -19,10 +19,14 @@ export type AreaGraphWidgetData = {
opacity: number | null;
};
export type AutocompleteRemoteFilterData = {
- value?: { id: string | number; label: string };
+ value?:
+ | { id: string | number; label: string }
+ | Array<{ id: string | number; label: string }>
+ | null;
key: string;
label: string | null;
type: "autocompleteRemote";
+ multiple: boolean;
required: boolean;
master: boolean;
debounceDelay: number;
diff --git a/src/Data/Filters/AutocompleteRemoteFilterData.php b/src/Data/Filters/AutocompleteRemoteFilterData.php
index 485fb1e52..114251a43 100644
--- a/src/Data/Filters/AutocompleteRemoteFilterData.php
+++ b/src/Data/Filters/AutocompleteRemoteFilterData.php
@@ -13,7 +13,7 @@
final class AutocompleteRemoteFilterData extends Data
{
#[Optional]
- #[LiteralTypeScriptType('{ id: string|number, label: string }')]
+ #[LiteralTypeScriptType('{ id: string|number, label: string } | Array<{ id: string|number, label: string }> | null')]
public mixed $value;
public function __construct(
@@ -21,7 +21,7 @@ public function __construct(
public ?string $label,
#[LiteralTypeScriptType('"'.FilterType::AutocompleteRemote->value.'"')]
public FilterType $type,
- // public bool $multiple,
+ public bool $multiple,
public bool $required,
public bool $master,
public int $debounceDelay,
diff --git a/src/Filters/AutocompleteRemoteFilter.php b/src/Filters/AutocompleteRemoteFilter.php
index 02a58b087..fe33d6a76 100644
--- a/src/Filters/AutocompleteRemoteFilter.php
+++ b/src/Filters/AutocompleteRemoteFilter.php
@@ -5,6 +5,7 @@
abstract class AutocompleteRemoteFilter extends Filter
{
use AutocompleteRemoteFilterTrait;
+ use AutocompleteRemoteSingleFilterTrait;
public function defaultValue(): mixed
{
diff --git a/src/Filters/AutocompleteRemoteFilterTrait.php b/src/Filters/AutocompleteRemoteFilterTrait.php
index 324cf2284..c8fb2099f 100644
--- a/src/Filters/AutocompleteRemoteFilterTrait.php
+++ b/src/Filters/AutocompleteRemoteFilterTrait.php
@@ -12,7 +12,6 @@ trait AutocompleteRemoteFilterTrait
private bool $isMaster = false;
private int $debounceDelay = 300;
private int $searchMinChars = 1;
- private array $cache = [];
final public function configureMaster(bool $isMaster = true): self
{
@@ -35,40 +34,13 @@ final public function configureSearchMinChars(int $minChars): self
return $this;
}
- public function fromQueryParam($value): mixed
- {
- if ($value) {
- if ($this->cache[$value] ?? null) {
- return $this->cache[$value];
- }
- if ($label = $this->valueLabelFor($value)) {
- return $this->cache[$value] = [
- 'id' => $value,
- 'label' => $label,
- ];
- }
- }
-
- return null;
- }
-
- public function toQueryParam($value): mixed
- {
- return is_array($value) ? $value['id'] : $value;
- }
-
- public function defaultValue(): mixed
- {
- return null;
- }
-
public function toArray(): array
{
return parent::buildArray([
'type' => FilterType::AutocompleteRemote->value,
'master' => $this->isMaster,
'required' => $this instanceof AutocompleteRemoteRequiredFilter,
- // 'multiple' => $this instanceof AutocompleteRemoteMultipleFilter,
+ 'multiple' => $this instanceof AutocompleteRemoteMultipleFilter,
'debounceDelay' => $this->debounceDelay,
'searchMinChars' => $this->searchMinChars,
]);
@@ -88,12 +60,10 @@ final public function format(array $values)
return $values;
}
- public function formatRawValue(mixed $value): mixed
- {
- return $value ? $value['id'] : null;
- }
-
+ /**
+ * Return the options matching the typed search, as [id => label].
+ *
+ * @return array