mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-02-24 01:07:24 +08:00
Sorting: Extracted URL sort helper to own class
Was only used in one place, so didn't make sense to have extra global helper clutter.
This commit is contained in:
parent
ac0cd9995d
commit
5b0cb3dd50
@ -5,6 +5,7 @@ namespace BookStack\Activity\Controllers;
|
||||
use BookStack\Activity\ActivityType;
|
||||
use BookStack\Activity\Models\Activity;
|
||||
use BookStack\Http\Controller;
|
||||
use BookStack\Sorting\SortUrl;
|
||||
use BookStack\Util\SimpleListOptions;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
@ -65,6 +66,7 @@ class AuditLogController extends Controller
|
||||
'filters' => $filters,
|
||||
'listOptions' => $listOptions,
|
||||
'activityTypes' => $types,
|
||||
'filterSortUrl' => new SortUrl('settings/audit', array_filter($request->except('page')))
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@ -96,35 +96,3 @@ function theme_path(string $path = ''): ?string
|
||||
|
||||
return base_path('themes/' . $theme . ($path ? DIRECTORY_SEPARATOR . $path : $path));
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a URL with multiple parameters for sorting purposes.
|
||||
* Works out the logic to set the correct sorting direction
|
||||
* Discards empty parameters and allows overriding.
|
||||
*/
|
||||
function sortUrl(string $path, array $data, array $overrideData = []): string
|
||||
{
|
||||
$queryStringSections = [];
|
||||
$queryData = array_merge($data, $overrideData);
|
||||
|
||||
// Change sorting direction is already sorted on current attribute
|
||||
if (isset($overrideData['sort']) && $overrideData['sort'] === $data['sort']) {
|
||||
$queryData['order'] = ($data['order'] === 'asc') ? 'desc' : 'asc';
|
||||
} elseif (isset($overrideData['sort'])) {
|
||||
$queryData['order'] = 'asc';
|
||||
}
|
||||
|
||||
foreach ($queryData as $name => $value) {
|
||||
$trimmedVal = trim($value);
|
||||
if ($trimmedVal === '') {
|
||||
continue;
|
||||
}
|
||||
$queryStringSections[] = urlencode($name) . '=' . urlencode($trimmedVal);
|
||||
}
|
||||
|
||||
if (count($queryStringSections) === 0) {
|
||||
return url($path);
|
||||
}
|
||||
|
||||
return url($path . '?' . implode('&', $queryStringSections));
|
||||
}
|
||||
|
49
app/Sorting/SortUrl.php
Normal file
49
app/Sorting/SortUrl.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
namespace BookStack\Sorting;
|
||||
|
||||
/**
|
||||
* Generate a URL with multiple parameters for sorting purposes.
|
||||
* Works out the logic to set the correct sorting direction
|
||||
* Discards empty parameters and allows overriding.
|
||||
*/
|
||||
class SortUrl
|
||||
{
|
||||
public function __construct(
|
||||
protected string $path,
|
||||
protected array $data,
|
||||
protected array $overrideData = []
|
||||
) {
|
||||
}
|
||||
|
||||
public function withOverrideData(array $overrideData = []): self
|
||||
{
|
||||
return new self($this->path, $this->data, $overrideData);
|
||||
}
|
||||
|
||||
public function build(): string
|
||||
{
|
||||
$queryStringSections = [];
|
||||
$queryData = array_merge($this->data, $this->overrideData);
|
||||
|
||||
// Change sorting direction if already sorted on current attribute
|
||||
if (isset($this->overrideData['sort']) && $this->overrideData['sort'] === $this->data['sort']) {
|
||||
$queryData['order'] = ($this->data['order'] === 'asc') ? 'desc' : 'asc';
|
||||
} elseif (isset($this->overrideData['sort'])) {
|
||||
$queryData['order'] = 'asc';
|
||||
}
|
||||
|
||||
foreach ($queryData as $name => $value) {
|
||||
$trimmedVal = trim($value);
|
||||
if ($trimmedVal !== '') {
|
||||
$queryStringSections[] = urlencode($name) . '=' . urlencode($trimmedVal);
|
||||
}
|
||||
}
|
||||
|
||||
if (count($queryStringSections) === 0) {
|
||||
return url($this->path);
|
||||
}
|
||||
|
||||
return url($this->path . '?' . implode('&', $queryStringSections));
|
||||
}
|
||||
}
|
@ -26,11 +26,11 @@
|
||||
class="input-base text-left">{{ $filters['event'] ?: trans('settings.audit_event_filter_no_filter') }}</button>
|
||||
<ul refs="dropdown@menu" class="dropdown-menu">
|
||||
<li @if($filters['event'] === '') class="active" @endif><a
|
||||
href="{{ sortUrl('/settings/audit', array_filter(request()->except('page')), ['event' => '']) }}"
|
||||
href="{{ $filterSortUrl->withOverrideData(['event' => ''])->build() }}"
|
||||
class="text-item">{{ trans('settings.audit_event_filter_no_filter') }}</a></li>
|
||||
@foreach($activityTypes as $type)
|
||||
<li @if($type === $filters['event']) class="active" @endif><a
|
||||
href="{{ sortUrl('/settings/audit', array_filter(request()->except('page')), ['event' => $type]) }}"
|
||||
href="{{ $filterSortUrl->withOverrideData(['event' => $type])->build() }}"
|
||||
class="text-item">{{ $type }}</a></li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
Loading…
x
Reference in New Issue
Block a user