search functionality and settings fixes

This commit is contained in:
Chris 2018-02-05 14:21:54 +00:00
parent ae3d27aca8
commit ba273ffbcf
13 changed files with 314 additions and 39 deletions

View file

@ -32,6 +32,8 @@ class SettingsController extends Controller
{ {
$setting = Setting::find($id); $setting = Setting::find($id);
if((bool)$setting->system === true) return abort(404);
if (!is_null($setting)) { if (!is_null($setting)) {
return view('settings.edit')->with([ return view('settings.edit')->with([
'setting' => $setting, 'setting' => $setting,
@ -80,4 +82,21 @@ class SettingsController extends Controller
]); ]);
} }
} }
/**
* @param int $id
*
* @return \Illuminate\Http\RedirectResponse
*/
public function clear($id)
{
$setting = Setting::find($id);
if((bool)$setting->system !== true) {
$setting->value = '';
$setting->save();
}
return redirect()->route('settings.index')->with([
'success' => 'You have successfully edited this Setting!',
]);
}
} }

View file

@ -15,7 +15,9 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function boot() public function boot()
{ {
if(!file_exists(database_path(env('DB_DATABASE')))) { $alt_bg = '';
if(!is_file(database_path(env('DB_DATABASE')))) {
// first time setup // first time setup
touch(database_path(env('DB_DATABASE'))); touch(database_path(env('DB_DATABASE')));
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true)); Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true));
@ -24,10 +26,11 @@ class AppServiceProvider extends ServiceProvider
//Artisan::call('config:cache'); //Artisan::call('config:cache');
//Artisan::call('route:cache'); //Artisan::call('route:cache');
} }
$alt_bg = ''; if(is_file(database_path(env('DB_DATABASE')))) {
if($bg_image = Setting::fetch('background_image')) { if($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url('.asset('storage/'.$bg_image).')"'; $alt_bg = ' style="background-image: url('.asset('storage/'.$bg_image).')"';
} }
}
view()->share('alt_bg', $alt_bg); view()->share('alt_bg', $alt_bg);
} }

View file

@ -4,6 +4,7 @@ namespace App;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Input;
use Form;
class Setting extends Model class Setting extends Model
{ {
@ -39,6 +40,79 @@ class Setting extends Model
]; ];
} }
public function getListValueAttribute()
{
switch($this->type) {
case 'image':
if(!empty($this->value)) {
$value = '<a href="'.asset('storage/'.$this->value).'" title="View" target="_blank">View</a>';
} else {
$value = '- not set -';
}
break;
case 'boolean':
if((bool)$this->value === true) {
$value = 'Yes';
} else {
$value = 'No';
}
break;
case 'select':
if(!empty($this->value) || $this->value !== 'none') {
$options = (array)json_decode($this->options);
$value = $options[$this->value];
} else {
$value = '- not set -';
}
break;
default:
$value = $this->value;
break;
}
return $value;
}
public function getEditValueAttribute()
{
switch($this->type) {
case 'image':
$value = '';
if(isset($this->value) && !empty($this->value)) {
$value .= '<a class="setting-view-image" href="'.asset('storage/'.$this->value).'" title="View" target="_blank"><img src="'.asset('storage/'.$this->value).'" /></a>';
}
$value .= Form::file('value', ['class' => 'form-control']);
if(isset($this->value) && !empty($this->value)) {
$value .= '<a class="settinglink" href="'.route('settings.clear', $this->id).'" title="Remove">Reset back to default</a>';
}
break;
case 'boolean':
$checked = false;
if(isset($this->value) && (bool)$this->value === true) $checked = true;
$set_checked = ($checked) ? ' checked="checked"' : '';
$value = '
<label class="switch">
<input type="hidden" name="value" value="0" />
<input type="checkbox" name="value" value="1"'.$set_checked.' />
<span class="slider round"></span>
</label>';
break;
case 'select':
$options = json_decode($this->options);
$value = Form::select('value', $options, null, ['class' => 'form-control']);
break;
default:
$value = Form::text('value', null, ['class' => 'form-control']);
break;
}
return $value;
}
public function group() public function group()
{ {
return $this->belongsTo('App\SettingGroup', 'group_id'); return $this->belongsTo('App\SettingGroup', 'group_id');
@ -85,4 +159,42 @@ class Setting extends Model
{ {
return array_key_exists($key, Setting::$cache); return array_key_exists($key, Setting::$cache);
} }
/**
* @return html
*/
public static function search()
{
$output = '';
$homepage_search = self::fetch('homepage_search');
$search_provider = self::where('key', '=', 'search_provider')->first();
$options = (array)json_decode($search_provider->options);
$name = $options[$search_provider->value];
if((bool)$homepage_search && (bool)$search_provider->value) {
switch($search_provider->value) {
case 'google':
$url = 'https://www.google.com/search';
$var = 'q';
break;
case 'ddg':
$url = 'https://duckduckgo.com/';
$var = 'q';
break;
case 'bing':
$url = 'https://www.bing.com/search';
$var = 'q';
break;
}
$output .= '<div class="searchform">';
$output .= Form::open(['url' => $url, 'method' => 'get']);
$output .= '<div class="input-container">';
$output .= Form::text($var, null, ['class' => 'homesearch', 'placeholder' => $name.' search...']);
$output .= '<button type="submit">Search</button>';
$output .= '</div>';
$output .= Form::close();
$output .= '</div>';
}
return $output;
}
} }

View file

@ -18,6 +18,7 @@ class CreateSettingsTable extends Migration
$table->integer('group_id')->default(0); $table->integer('group_id')->default(0);
$table->string('key'); $table->string('key');
$table->string('type')->default('text'); $table->string('type')->default('text');
$table->text('options')->nullable();
$table->string('label'); $table->string('label');
$table->string('value')->nullable(); $table->string('value')->nullable();
$table->string('order')->default(0); $table->string('order')->default(0);

View file

@ -61,10 +61,27 @@ class SettingsSeeder extends Seeder
$setting->id = 3; $setting->id = 3;
$setting->group_id = 3; $setting->group_id = 3;
$setting->key = 'homepage_search'; $setting->key = 'homepage_search';
$setting->type = 'text'; $setting->type = 'boolean';
$setting->label = 'Homepage Search'; $setting->label = 'Homepage Search';
$setting->save(); $setting->save();
} }
if(!Setting::find(4)) {
$options = json_encode([
'none' => '- not set -',
'google' => 'Google',
'ddg' => 'DuckDuckGo',
'bing' => 'Bing'
]);
$setting = new Setting;
$setting->id = 4;
$setting->group_id = 3;
$setting->key = 'search_provider';
$setting->type = 'select';
$setting->options = $options;
$setting->label = 'Search Provider';
$setting->save();
}
} }
} }

83
public/css/app.css vendored
View file

@ -318,6 +318,13 @@ body {
padding: 20px; padding: 20px;
} }
#app main {
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
#app main, #app main,
#app #sortable { #app #sortable {
padding: 10px; padding: 10px;
@ -721,7 +728,8 @@ div.create .input label:not(.switch) {
font-weight: 300; font-weight: 300;
} }
div.create .input input { div.create .input input,
div.create .input select {
width: 100%; width: 100%;
border: 1px solid #dedfe2; border: 1px solid #dedfe2;
padding: 10px; padding: 10px;
@ -864,6 +872,79 @@ button.link {
background: transparent; background: transparent;
} }
a.settinglink {
color: #2f313a;
font-size: 13px;
margin: 15px 5px;
display: inline-block;
font-weight: 700;
}
.setting-view-image {
margin-bottom: 20px;
display: inline-block;
}
.setting-view-image img {
max-width: 330px;
}
.searchform {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-ms-flex-item-align: start;
align-self: flex-start;
text-align: center;
margin: 50px auto;
padding: 14px;
background: rgba(0, 0, 0, 0.2);
border-radius: 14px;
-webkit-box-shadow: inset 0px 1px 6px 0 rgba(0, 0, 0, 0.3);
box-shadow: inset 0px 1px 6px 0 rgba(0, 0, 0, 0.3);
border-top: 1px solid rgba(0, 0, 0, 0.5);
border-bottom: 1px solid rgba(255, 255, 255, 0.35);
position: relative;
width: 100%;
max-width: 500px;
}
.searchform form {
width: 100%;
}
.searchform .input-container {
background: white;
border-radius: 5px;
-webkit-box-shadow: 0px 0px 5px 0 rgba(0, 0, 0, 0.4);
box-shadow: 0px 0px 5px 0 rgba(0, 0, 0, 0.4);
overflow: hidden;
}
.searchform input {
padding: 17px 15px;
font-size: 15px;
border: 0 none;
width: 100%;
background: transparent;
}
.searchform button {
position: absolute;
right: 14px;
top: 14px;
border: none;
font-size: 16px;
padding: 7px 15px;
line-height: 37px;
font-weight: 500;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
color: white;
text-transform: uppercase;
background: #d64d55;
}
/*! Huebee v2.0.0 /*! Huebee v2.0.0
http://huebee.buzz http://huebee.buzz
---------------------------------------------- */ ---------------------------------------------- */

View file

@ -1,4 +1,4 @@
{ {
"/css/app.css": "/css/app.css?id=fff34714aa687ec711d3", "/css/app.css": "/css/app.css?id=d47acbf87c5ae533ddf5",
"/js/app.js": "/js/app.js?id=aa9e426dc7b92d42d3b2" "/js/app.js": "/js/app.js?id=a809f8ee6ee8636e0f2b"
} }

View file

@ -66,6 +66,9 @@ body {
} }
} }
main {
flex-direction: column;
}
main, #sortable { main, #sortable {
padding: 10px; padding: 10px;
display: flex; display: flex;
@ -387,7 +390,7 @@ div.create {
display: block; display: block;
font-weight: 300; font-weight: 300;
} }
input { input, select {
width: 100%; width: 100%;
border: 1px solid #dedfe2; border: 1px solid #dedfe2;
padding: 10px; padding: 10px;
@ -513,3 +516,65 @@ div.create {
appearance: none; appearance: none;
background: transparent; background: transparent;
} }
a.settinglink {
color: $app-text;
font-size: 13px;
margin: 15px 5px;
display: inline-block;
font-weight: 700;
}
.setting-view-image {
margin-bottom: 20px;
display: inline-block;
img {
max-width: 330px;
}
}
.searchform {
display: flex;
align-self: flex-start;
text-align: center;
margin: 50px auto;
padding: 14px;
background: rgba(0,0,0,0.2);
border-radius: 14px;
box-shadow: inset 0px 1px 6px 0 rgba(0,0,0,0.3);
border-top: 1px solid rgba(0,0,0,0.5);
border-bottom: 1px solid rgba(255,255,255,0.35);
position: relative;
width: 100%;
max-width: 500px;
form {
width: 100%;
}
.input-container {
background: white;
border-radius: 5px;
box-shadow: 0px 0px 5px 0 rgba(0,0,0,0.4);
overflow: hidden;
}
input {
padding: 17px 15px;
font-size: 15px;
border: 0 none;
width: 100%;
background: transparent;
}
button {
position: absolute;
right: 14px;
top: 14px;
border: none;
font-size: 16px;
padding: 7px 15px;
line-height: 37px;
font-weight: 500;
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
color: white;
text-transform: uppercase;
background: $app-red;
}
}

View file

@ -0,0 +1 @@
{!! App\Setting::search() !!}

View file

@ -14,20 +14,7 @@
</div>--> </div>-->
<div class="input"> <div class="input">
@php($type = explode('|', $setting->type)[0]) {!! $setting->edit_value !!}
{!! Form::label('value', 'Value') !!}
@if ($type == 'image')
{!! Form::file('value', ['class' => 'form-control']) !!}
@elseif ($type == 'select')
@php($options = explode('|', $setting->type)[1])
@php($options = explode(',', $options))
{!! Form::select('value', $options, null, ['class' => 'form-control']) !!}
@elseif ($type == 'textarea')
{!! Form::textarea('value', Request::get('value'), ['class' => 'form-control trumbowyg', 'placeholder' => 'FAQ contents']) !!}
@else
{!! Form::text('value', null, ['class' => 'form-control']) !!}
@endif
</div> </div>

View file

@ -25,22 +25,7 @@
<tr> <tr>
<td>{{ $setting->label }}</td> <td>{{ $setting->label }}</td>
<td> <td>
@php($type = explode('|', $setting->type)[0]) {!! $setting->list_value !!}
@if ($type == 'image')
@if(!empty($setting->value))
<a href="{{ asset('storage/'.$setting->value) }}" title="View" target="_blank">View</a>
@else
- not set -
@endif
@elseif ($type == 'select')
@if ($setting->value == 1)
YES
@else
NO
@endif
@else
{!! $setting->value !!}
@endif
</td> </td>
<td class="text-center"> <td class="text-center">
@if((bool)$setting->system !== true) @if((bool)$setting->system !== true)

View file

@ -1,6 +1,8 @@
@extends('app') @extends('app')
@section('content') @section('content')
@include('partials.search')
@if($apps->first()) @if($apps->first())
@include('sortable') @include('sortable')
@else @else

View file

@ -34,6 +34,8 @@ Route::group([
->name('index'); ->name('index');
Route::get('edit/{id}', 'SettingsController@edit') Route::get('edit/{id}', 'SettingsController@edit')
->name('edit'); ->name('edit');
Route::get('clear/{id}', 'SettingsController@clear')
->name('clear');
Route::patch('edit/{id}', 'SettingsController@update'); Route::patch('edit/{id}', 'SettingsController@update');