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;
'filters' => $filters,
'listOptions' => $listOptions,
'activityTypes' => $types,
+ 'filterSortUrl' => new SortUrl('settings/audit', array_filter($request->except('page')))
]);
}
}
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));
-}
--- /dev/null
+<?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));
+ }
+}
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>