Skip to content

Commit

Permalink
Merge d0ac2f7 into 1b8b6fb
Browse files Browse the repository at this point in the history
  • Loading branch information
rerzy committed Aug 1, 2019
2 parents 1b8b6fb + d0ac2f7 commit d3e87c2
Show file tree
Hide file tree
Showing 46 changed files with 2,275 additions and 534 deletions.
8 changes: 6 additions & 2 deletions resources/assets/stylesheets/layout/filter.scss
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,13 @@
{
margin-bottom: 20px;

.select
&.hidden {
display: none;
}

.select, .text
{
select
select, input
{
height: 40px;
width: 100%;
Expand Down
1 change: 1 addition & 0 deletions resources/lang/en/filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@
],
'enabled' => 'Enabled',
'apply' => 'Apply',
'reset' => 'Reset',
];
18 changes: 18 additions & 0 deletions src/Admin/Filter/Concerns/WithCustomExecutor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php


namespace Arbory\Base\Admin\Filter\Concerns;


use Arbory\Base\Admin\Filter\FilterItem;
use Illuminate\Database\Eloquent\Builder;

interface WithCustomExecutor
{
/**
* @param FilterItem $filterItem
* @param Builder $builder
* @return void
*/
public function execute(FilterItem $filterItem, Builder $builder): void;
}
34 changes: 34 additions & 0 deletions src/Admin/Filter/Concerns/WithParameterValidation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php


namespace Arbory\Base\Admin\Filter\Concerns;


use Arbory\Base\Admin\Filter\Parameters\FilterParameters;

interface WithParameterValidation
{
/**
* @param FilterParameters $parameters
* @param callable $attributeResolver
*
* @return array
*/
public function rules(FilterParameters $parameters, callable $attributeResolver): array;

/**
* @param FilterParameters $parameters
* @param callable $attributeResolver
*
* @return array
*/
public function messages(FilterParameters $parameters, callable $attributeResolver): array;

/**
* @param FilterParameters $parameters
* @param callable $attributeResolver
*
* @return array
*/
public function attributes(FilterParameters $parameters, callable $attributeResolver): array;
}
35 changes: 35 additions & 0 deletions src/Admin/Filter/Config/BaseConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php


namespace Arbory\Base\Admin\Filter\Config;


use Arbory\Base\Support\ExtendedFluent;
use Illuminate\Support\Str;
use ReflectionClass;

class BaseConfig extends ExtendedFluent
{
private const PREFIX_CONFIG = 'CONFIG_';

/**
* Returns defined config options
*
* @return array
* @throws \ReflectionException
*/
public static function getAvailable(): array
{
$reflection = new ReflectionClass(static::class);

$available = [];

foreach($reflection->getConstants() as $constant) {
if(Str::startsWith($constant, self::PREFIX_CONFIG)) {
$available[] = Str::after($constant, self::PREFIX_CONFIG);
}
}

return $available;
}
}
56 changes: 56 additions & 0 deletions src/Admin/Filter/Config/SelectLikeTypeConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php


namespace Arbory\Base\Admin\Filter\Config;


class SelectLikeTypeConfig extends BaseConfig
{
/**
* Accepts a key => value iterable array
*/
public const CONFIG_OPTIONS = 'options';

/**
* Accepts bool
*/
public const CONFIG_MULTIPLE = 'multiple';

/**
* @param iterable $options
* @return SelectLikeTypeConfig
*/
public function setOptions(iterable $options): SelectLikeTypeConfig
{
$this->set(static::CONFIG_OPTIONS, $options);

return $this;
}

/**
* @return iterable
*/
public function getOptions(): iterable
{
return $this->get(static::CONFIG_OPTIONS);
}

/**
* @param bool $options
* @return SelectLikeTypeConfig
*/
public function setMultiple(?bool $options): SelectLikeTypeConfig
{
$this->set(static::CONFIG_OPTIONS, $options);

return $this;
}

/**
* @return bool
*/
public function isMultiple(): ?bool
{
return $this->get(static::CONFIG_MULTIPLE);
}
}
29 changes: 29 additions & 0 deletions src/Admin/Filter/Config/TextLikeTypeConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php


namespace Arbory\Base\Admin\Filter\Config;


class TextLikeTypeConfig extends BaseConfig
{
public const CONFIG_TYPE = 'type';

/**
* @param string $type
* @return TextLikeTypeConfig
*/
public function setType(string $type): TextLikeTypeConfig
{
$this->set(static::CONFIG_TYPE, $type);

return $this;
}

/**
* @return string|null
*/
public function getType(): ?string
{
return $this->get(static::CONFIG_TYPE);
}
}
10 changes: 10 additions & 0 deletions src/Admin/Filter/CustomizedTargetInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php


namespace Arbory\Base\Admin\Filter;


interface CustomizedTargetInterface
{
public function getFilterTitle(): string;
}
47 changes: 47 additions & 0 deletions src/Admin/Filter/FilterCollection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php


namespace Arbory\Base\Admin\Filter;


use Illuminate\Support\Collection;

class FilterCollection extends Collection
{
/**
* @var FilterItem[]
*/
protected $items = [];

/**
* @param string[] $concerns
* @return FilterCollection|FilterItem[]
*/
public function findByConcerns(array $concerns): FilterCollection
{
return $this->filter(static function (FilterItem $filterItem) use ($concerns) {
$implements = array_values(class_implements($filterItem->getType()));

return count(array_intersect($concerns, $implements)) === count($concerns);
});
}

/**
* @param $owner
* @return FilterCollection|FilterItem[]
*/
public function findByOwner($owner): FilterCollection
{
return $this->filter(static function (FilterItem $filterItem) use ($owner) {
return $owner === $filterItem->getOwner();
});
}

/**
* @return FilterCollection
*/
public function findWithoutOwners(): FilterCollection
{
return $this->findByOwner(null);
}
}
63 changes: 63 additions & 0 deletions src/Admin/Filter/FilterExecutor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<?php


namespace Arbory\Base\Admin\Filter;


use Arbory\Base\Admin\Filter\Concerns\WithCustomExecutor;
use Arbory\Base\Admin\Filter\Parameters\FilterParameters;
use Illuminate\Database\Eloquent\Builder;

class FilterExecutor
{
/**
* @param FilterManager $filterManager
* @param Builder $builder
*
* @return Builder
*/
public function execute(FilterManager $filterManager, Builder $builder): Builder
{
$filters = $filterManager->getFilters();
$parameters = $filterManager->getParameters();

foreach ($filters as $filterItem) {
if (! $parameters->has($filterItem->getName())) {
continue;
}

// Use user defined executor
if ($executor = $filterItem->getExecutor()) {
$executor($filterItem, $builder);

continue;
}

$type = $filterItem->getType();

if ($type instanceof WithCustomExecutor) {
$type->execute($filterItem, $builder);
} else {
$this->applyQuery($filterManager->getParameters(), $filterItem, $builder);
}
}

return $builder;
}

/**
* @param FilterParameters $parameters
* @param FilterItem $filterItem
* @param Builder $builder
*/
protected function applyQuery(FilterParameters $parameters, FilterItem $filterItem, Builder $builder): void
{
$value = $parameters->getFromFilter($filterItem);

if (is_array($value)) {
$builder->whereIn($filterItem->getName(), $value);
} else {
$builder->where($filterItem->getName(), $value);
}
}
}
67 changes: 67 additions & 0 deletions src/Admin/Filter/FilterFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php


namespace Arbory\Base\Admin\Filter;


use Illuminate\Contracts\Container\Container;
use Illuminate\Support\Str;

class FilterFactory
{
/**
* @var Container
*/
protected $container;

/**
* FilterTypeFactory constructor.
* @param Container $container
*/
public function __construct(Container $container)
{
$this->container = $container;
}

/**
* @param string $type
* @param iterable $config
* @return FilterTypeInterface
*/
public function makeType(string $type, iterable $config): FilterTypeInterface
{
/**
* @var $instance FilterTypeInterface
*/
$instance = $this->container->make($type);

$instance->setConfig($config);

return $instance;
}

/**
* @param string $typeClass
* @param string $name
* @param iterable $config
* @return FilterItem
*/
public function makeSimpleFilter(string $typeClass, string $name, iterable $config): FilterItem
{
$item = $this->newInstance();

$item->setType($this->makeType($typeClass, $config));
$item->setName($name);
$item->setTitle(Str::camel($name));

return $item;
}

/**
* @return FilterItem
*/
protected function newInstance()
{
return new FilterItem();
}
}
Loading

0 comments on commit d3e87c2

Please sign in to comment.