From 6095ec77c6c995d0ca65189061f0c253c6abac7e Mon Sep 17 00:00:00 2001
From: Dominik Hebeler <dominik@suma-ev.de>
Date: Thu, 11 Apr 2019 13:21:15 +0200
Subject: [PATCH] filter settings will now work

---
 app/Http/Kernel.php                    |  1 -
 app/MetaGer.php                        | 56 +++++++++++++++++++++-----
 app/Models/Searchengine.php            |  4 +-
 resources/views/parts/filter.blade.php |  8 +++-
 4 files changed, 55 insertions(+), 14 deletions(-)

diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index 98750bb4b..1071b8326 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -26,7 +26,6 @@ class Kernel extends HttpKernel
      */
     protected $middlewareGroups = [
         'web' => [
-            #\App\Http\Middleware\EncryptCookies::class,
             \Illuminate\Routing\Middleware\SubstituteBindings::class,
         ],
 
diff --git a/app/MetaGer.php b/app/MetaGer.php
index ee8da195c..d2583cf9a 100644
--- a/app/MetaGer.php
+++ b/app/MetaGer.php
@@ -485,7 +485,6 @@ class MetaGer
                 || \Cookie::get($this->getFokus() . "_engine_" . $suma) === "off") { # Check if the user has disabled this engine
             continue;
             }
-
             # Check if this engine can use eventually defined query-filter
             $valid = true;
             foreach ($this->queryFilter as $queryFilter => $filter) {
@@ -498,8 +497,7 @@ class MetaGer
             if ($valid) {
                 foreach ($this->parameterFilter as $filterName => $filter) {
                     # We need to check if the searchengine supports the parameter value, too
-                    $value = $request->input($filter->{"get-parameter"}, "");
-                    if (empty($filter->sumas->$suma) || empty($filter->sumas->{$suma}->values->{$value})) {
+                    if (empty($filter->sumas->$suma) || empty($filter->sumas->{$suma}->values->{$filter->value})) {
                         $valid = false;
                         break;
                     }
@@ -526,12 +524,17 @@ class MetaGer
             }
 
         }
-
         # Implements Yahoo Ads if Yahoo is not enabled as a searchengine
         if (!$this->apiAuthorized && empty($this->enabledSearchengines["yahoo"]) && $this->fokus != "bilder" && !empty($this->sumaFile->sumas->{"yahoo-ads"})) {
             $this->enabledSearchengines["yahoo-ads"] = $this->sumaFile->sumas->{"yahoo-ads"};
         }
 
+        # Special case if search engines are disabled
+        # Since bing is normally only active if a filter is set but it should be active, too if yahoo is disabled
+        if ($this->getFokus() === "web" && empty($this->enabledSearchengines["yahoo"]) && \Cookie::get("web_engine_bing") !== "off") {
+            $this->enabledSearchengines["bing"] = $this->sumaFile->sumas->{"bing"};
+        }
+
         if (sizeof($this->enabledSearchengines) === 0) {
             $filter = "";
             foreach ($this->queryFilter as $queryFilter => $filterPhrase) {
@@ -630,27 +633,55 @@ class MetaGer
         $availableFilter = [];
 
         foreach ($parameterFilter as $filterName => $filter) {
+            $values = $filter->values;
             # Check if any of the enabled search engines provide this filter
             foreach ($this->enabledSearchengines as $engineName => $engine) {
                 if (!empty($filter->sumas->$engineName)) {
-                    $availableFilter[$filterName] = $filter;
+                    if (empty($availableFilter[$filterName])) {
+                        $availableFilter[$filterName] = $filter;
+                        unset($availableFilter[$filterName]->values);
+                    }
+                    if (empty($availableFilter[$filterName]->values)) {
+                        $availableFilter[$filterName]->values = (object) ["" => $values->{""}];
+                    }
+                    foreach ($filter->sumas->{$engineName}->values as $key => $value) {
+                        $availableFilter[$filterName]->values->$key = $values->$key;
+                    }
                 }
             }
             # We will also add the filter from the opt-in search engines (the searchengines that are only used when a filter of it is too)
             foreach ($this->sumaFile->foki->{$this->fokus}->sumas as $suma) {
-                if ($this->sumaFile->sumas->{$suma}->{"filter-opt-in"}) {
+                if ($this->sumaFile->sumas->{$suma}->{"filter-opt-in"} && \Cookie::get($this->getFokus() . "_engine_" . $suma) !== "off") {
                     if (!empty($filter->sumas->{$suma})) {
                         # If the searchengine is disabled this filter shouldn't be available
                         if ((!empty($this->sumaFile->sumas->{$suma}->disabled) && $this->sumaFile->sumas->{$suma}->disabled === true)
                             || (!empty($this->sumaFile->sumas->{$suma}->{"auto-disabled"}) && $this->sumaFile->sumas->{$suma}->{"auto-disabled"} === true)) {
                             continue;
                         }
-                        $availableFilter[$filterName] = $filter;
+                        if (empty($availableFilter[$filterName])) {
+                            $availableFilter[$filterName] = $filter;
+                            unset($availableFilter[$filterName]->values);
+                        }
+                        if (empty($availableFilter[$filterName]->values)) {
+                            $availableFilter[$filterName]->values = (object) ["" => $values->{""}];
+                        }
+                        foreach ($filter->sumas->{$suma}->values as $key => $value) {
+                            $availableFilter[$filterName]->values->$key = $values->$key;
+                        }
                     }
                 }
             }
         }
 
+        # Set the current values for the filters
+        foreach ($availableFilter as $filterName => $filter) {
+            if (\Request::filled($filter->{"get-parameter"})) {
+                $filter->value = \Request::input($filter->{"get-parameter"});
+            } else if (\Cookie::get($this->getFokus() . "_setting_" . $filter->{"get-parameter"}) !== null) {
+                $filter->value = \Cookie::get($this->getFokus() . "_setting_" . $filter->{"get-parameter"});
+            }
+        }
+
         return $availableFilter;
     }
 
@@ -1019,10 +1050,17 @@ class MetaGer
             } else {
                 $usedParameters[$filter->{"get-parameter"}] = true;
             }
-            if ($request->filled($filter->{"get-parameter"})) {
-                $this->parameterFilter[$filterName] = $filter;
+
+            if (($request->filled($filter->{"get-parameter"}) && $request->input($filter->{"get-parameter"}) !== "off") ||
+                \Cookie::get($this->getFokus() . "_setting_" . $filter->{"get-parameter"}) !== null) { # If the filter is set via Cookie
+            $this->parameterFilter[$filterName] = $filter;
+                $this->parameterFilter[$filterName]->value = $request->input($filter->{"get-parameter"}, '');
+                if (empty($this->parameterFilter[$filterName]->value)) {
+                    $this->parameterFilter[$filterName]->value = \Cookie::get($this->getFokus() . "_setting_" . $filter->{"get-parameter"});
+                }
             }
         }
+
         $this->searchCheckHostBlacklist($request);
         $this->searchCheckDomainBlacklist($request);
         $this->searchCheckUrlBlacklist();
diff --git a/app/Models/Searchengine.php b/app/Models/Searchengine.php
index f6bacb096..0ca550a50 100644
--- a/app/Models/Searchengine.php
+++ b/app/Models/Searchengine.php
@@ -7,7 +7,6 @@ use App\MetaGer;
 use Cache;
 use Illuminate\Foundation\Bus\DispatchesJobs;
 use Illuminate\Support\Facades\Redis;
-use Request;
 
 abstract class Searchengine
 {
@@ -76,7 +75,8 @@ abstract class Searchengine
 
         # Parse enabled Parameter-Filter
         foreach ($metager->getParameterFilter() as $filterName => $filter) {
-            $inputParameter = Request::input($filter->{"get-parameter"}, "");
+            $inputParameter = $filter->value;
+
             if (empty($inputParameter) || empty($filter->sumas->{$name}->values->{$inputParameter})) {
                 continue;
             }
diff --git a/resources/views/parts/filter.blade.php b/resources/views/parts/filter.blade.php
index 63d802dfe..2d8dba506 100644
--- a/resources/views/parts/filter.blade.php
+++ b/resources/views/parts/filter.blade.php
@@ -26,9 +26,13 @@
 				@foreach($metager->getAvailableParameterFilter() as $filterName => $filter)
 					<div class="option-selector">
 					<label for="{{$filterName}}">@lang($filter->name)</label>
-					<select name="{{$filter->{'get-parameter'} }}" form="searchForm" onchange="this.form.submit()">
+					<select name="{{$filter->{'get-parameter'} }}" class="custom-select custom-select-sm" form="searchForm" onchange="this.form.submit()">
 						@foreach($filter->values as $value => $text)
-						<option value="{{$value}}" @if(Request::input($filter->{'get-parameter'}, '') === $value)selected="selected" @endif>{{trans($text)}}</option>
+						@if($value === "" && Cookie::get($metager->getFokus() . "_setting_" . $filter->{"get-parameter"}) !== null)
+						<option value="off" @if(empty($filter->value) || $filter->value === "off")selected @endif>{{trans($text)}}</option>
+						@else
+						<option value="{{$value}}" @if(!empty($filter->value) && $filter->value === $value)selected @endif>{{trans($text)}}</option>
+						@endif
 						@endforeach
 					</select>
 					</div>
-- 
GitLab