Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/EntityList/Filters/HiddenFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,9 @@ public function toArray(): array
{
return [];
}

public function defaultValue(): mixed
{
return null;
}
}
82 changes: 2 additions & 80 deletions src/Filters/AutocompleteRemoteFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,90 +2,12 @@

namespace Code16\Sharp\Filters;

use Code16\Sharp\Enums\FilterType;

abstract class AutocompleteRemoteFilter extends Filter
{
private bool $isMaster = false;
private int $debounceDelay = 300;
private int $searchMinChars = 1;
private array $cache = [];

final public function configureMaster(bool $isMaster = true): self
{
$this->isMaster = $isMaster;

return $this;
}
use AutocompleteRemoteFilterTrait;

final public function configureDebounceDelay(int $delay): self
public function defaultValue(): mixed
{
$this->debounceDelay = $delay;

return $this;
}

final public function configureSearchMinChars(int $minChars): self
{
$this->searchMinChars = $minChars;

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 toArray(): array
{
return parent::buildArray([
'type' => FilterType::AutocompleteRemote->value,
'master' => $this->isMaster,
'required' => $this instanceof AutocompleteRemoteRequiredFilter,
// 'multiple' => $this instanceof AutocompleteRemoteMultipleFilter,
'debounceDelay' => $this->debounceDelay,
'searchMinChars' => $this->searchMinChars,
]);
}

final public function format(array $values)
{
if (! is_array(collect($values)->first())) {
return collect($values)
->map(function ($label, $id) {
return compact('id', 'label');
})
->values()
->all();
}

return $values;
}

public function formatRawValue(mixed $value): mixed
{
return $value ? $value['id'] : null;
}

abstract public function values(string $query): array;

abstract public function valueLabelFor(string $id): ?string;
}
99 changes: 99 additions & 0 deletions src/Filters/AutocompleteRemoteFilterTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<?php

namespace Code16\Sharp\Filters;

use Code16\Sharp\Enums\FilterType;

/**
* @internal
*/
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
{
$this->isMaster = $isMaster;

return $this;
}

final public function configureDebounceDelay(int $delay): self
{
$this->debounceDelay = $delay;

return $this;
}

final public function configureSearchMinChars(int $minChars): self
{
$this->searchMinChars = $minChars;

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,
'debounceDelay' => $this->debounceDelay,
'searchMinChars' => $this->searchMinChars,
]);
}

final public function format(array $values)
{
if (! is_array(collect($values)->first())) {
return collect($values)
->map(function ($label, $id) {
return compact('id', 'label');
})
->values()
->all();
}

return $values;
}

public function formatRawValue(mixed $value): mixed
{
return $value ? $value['id'] : null;
}

abstract public function values(string $query): array;

abstract public function valueLabelFor(string $id): ?string;
}
4 changes: 3 additions & 1 deletion src/Filters/AutocompleteRemoteRequiredFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

namespace Code16\Sharp\Filters;

abstract class AutocompleteRemoteRequiredFilter extends AutocompleteRemoteFilter
abstract class AutocompleteRemoteRequiredFilter extends Filter
{
use AutocompleteRemoteFilterTrait;

abstract public function defaultValue(): mixed;
}
5 changes: 5 additions & 0 deletions src/Filters/CheckFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ public function toQueryParam($value): mixed
return $value;
}

public function defaultValue(): bool
{
return false;
}

public function toArray(): array
{
return parent::buildArray([
Expand Down
113 changes: 3 additions & 110 deletions src/Filters/DateRangeFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,119 +2,12 @@

namespace Code16\Sharp\Filters;

use Carbon\Carbon;
use Code16\Sharp\Enums\FilterType;
use Code16\Sharp\Filters\DateRange\DateRangeFilterValue;
use Code16\Sharp\Filters\DateRange\DateRangePreset;

abstract class DateRangeFilter extends Filter
{
private string $dateFormat = 'YYYY-MM-DD';
private bool $isMondayFirst = true;

/** @var DateRangePreset[] */
private ?array $presets = null;

final public function configureDateFormat(string $dateFormat): self
{
$this->dateFormat = $dateFormat;

return $this;
}

final public function configureMondayFirst(bool $isMondayFirst = true): self
{
$this->isMondayFirst = $isMondayFirst;

return $this;
}

final public function configureShowPresets(bool $showPresets = true, ?array $presets = null): self
{
if ($showPresets) {
$this->presets = $presets !== null
? $presets
: [
DateRangePreset::today(),
DateRangePreset::yesterday(),
DateRangePreset::last7days(),
DateRangePreset::last30days(),
DateRangePreset::last365days(),
DateRangePreset::thisMonth(),
DateRangePreset::lastMonth(),
DateRangePreset::thisYear(),
DateRangePreset::lastYear(),
];
} else {
$this->presets = [];
}

return $this;
}

final public function getDateFormat(): string
{
return $this->dateFormat;
}

final public function isMondayFirst(): bool
{
return $this->isMondayFirst;
}

/**
* @internal
*/
final public function fromQueryParam($value): ?array
{
if (! $value) {
return null;
}

[$start, $end] = explode('..', $value);
$start = Carbon::createFromFormat('Ymd', $start)->startOfDay();
$end = Carbon::createFromFormat('Ymd', $end)->endOfDay();

return [
'start' => $start->format('Y-m-d'),
'end' => $end->format('Y-m-d'),
'formatted' => [
'start' => $start->isoFormat($this->getDateFormat()),
'end' => $end->isoFormat($this->getDateFormat()),
],
];
}

/**
* @internal
*/
final public function toQueryParam($value): ?string
{
if (! $value) {
return null;
}

return sprintf(
'%s..%s',
Carbon::parse($value['start'])->format('Ymd'),
Carbon::parse($value['end'])->format('Ymd'),
);
}

public function toArray(): array
{
return parent::buildArray([
'type' => FilterType::DateRange->value,
'required' => $this instanceof DateRangeRequiredFilter,
'mondayFirst' => $this->isMondayFirst(),
'presets' => collect($this->presets)
->map(fn (DateRangePreset $preset) => $preset->toArray())
->toArray(),
]);
}
use DateRangeFilterTrait;

public function formatRawValue(mixed $value): DateRangeFilterValue
public function defaultValue(): mixed
{
return new DateRangeFilterValue(Carbon::parse($value['start']), Carbon::parse($value['end']));
return null;
}
}
Loading
Loading