Skip to content

Commit

Permalink
Merge 770a556 into 224c117
Browse files Browse the repository at this point in the history
  • Loading branch information
exabyssus committed Sep 16, 2019
2 parents 224c117 + 770a556 commit 1a5ca63
Show file tree
Hide file tree
Showing 51 changed files with 2,497 additions and 538 deletions.
9 changes: 9 additions & 0 deletions resources/assets/js/include/filter.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,15 @@ jQuery(document).ready(function() {
var filterOpenButton = $('.js-filter-trigger');
var filterWindow = $('.form-filter');
var contentWindow = $('#main > .content');
var searchInputName = 'search';

filterWindow.submit( function(eventObj) {
$('<input />').attr('type', 'hidden')
.attr('name', searchInputName)
.attr('value', $(`#${searchInputName}`).val())
.appendTo(filterWindow);
return true;
});

function openCloseFilter() {
filterWindow.toggleClass('show');
Expand Down
10 changes: 10 additions & 0 deletions resources/assets/js/include/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ jQuery(function () {
var timeout;
var form = jQuery(e.target);
var all_selector = 'input, select';
var filterForm = jQuery('#grid-filter');


// Set up options.
var options = form.data('search-options');
Expand Down Expand Up @@ -72,6 +74,8 @@ jQuery(function () {
var url = new UrlBuilder({ baseUrl: form_url });
url.add(form.serializeArray());

url.add(filterForm.serializeArray());

if ('replaceState' in window.history) {
window.history.replaceState(window.history.state, window.title, url.getUrl());
}
Expand Down Expand Up @@ -104,6 +108,12 @@ jQuery(function () {
form.trigger('searchstart');
};

if(filterForm.length){
form.on('submit', function(eventObj) {
filterForm.trigger('submit');
return false;
});
}

form.on('searchresponse', function (e, response) {
response = jQuery('<div />').append(response);
Expand Down
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',
];
1 change: 0 additions & 1 deletion src/Admin/Exports/ExportInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

/**
* Interface ExportInterface.
* @package Arbory\Base\Admin\Grid
*/
interface ExportInterface
{
Expand Down
16 changes: 16 additions & 0 deletions src/Admin/Filter/Concerns/WithCustomExecutor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?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;
}
32 changes: 32 additions & 0 deletions src/Admin/Filter/Concerns/WithParameterValidation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?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;
}
33 changes: 33 additions & 0 deletions src/Admin/Filter/Config/BaseConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace Arbory\Base\Admin\Filter\Config;

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

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;
}
}
54 changes: 54 additions & 0 deletions src/Admin/Filter/Config/SelectLikeTypeConfig.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?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): self
{
$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): self
{
$this->set(static::CONFIG_OPTIONS, $options);

return $this;
}

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

return $this;
}

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

namespace Arbory\Base\Admin\Filter;

interface CustomizedTargetInterface
{
public function getFilterTitle(): string;
}
45 changes: 45 additions & 0 deletions src/Admin/Filter/FilterCollection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?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): self
{
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): self
{
return $this->filter(static function (FilterItem $filterItem) use ($owner) {
return $owner === $filterItem->getOwner();
});
}

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

namespace Arbory\Base\Admin\Filter;

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

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

foreach ($filterManager->getFilters() as $filterItem) {
$this->executeForItem($filterItem, $parameters, $builder);
}

return $builder;
}

/**
* @param FilterItem $filterItem
* @param FilterParameters $parameters
* @param Builder $builder
*/
protected function executeForItem(FilterItem $filterItem, FilterParameters $parameters, Builder $builder): void
{
if (! $parameters->has($filterItem->getName())) {
return;
}

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

return;
}

$type = $filterItem->getType();

if ($type instanceof WithCustomExecutor) {
$type->execute($filterItem, $builder);

return;
}

$this->applyQuery($parameters, $filterItem, $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);
}
}
}
Loading

0 comments on commit 1a5ca63

Please sign in to comment.