search functionality and settings fixes
This commit is contained in:
parent
ae3d27aca8
commit
ba273ffbcf
13 changed files with 314 additions and 39 deletions
|
@ -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!',
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
112
app/Setting.php
112
app/Setting.php
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
83
public/css/app.css
vendored
|
@ -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
|
||||||
---------------------------------------------- */
|
---------------------------------------------- */
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
67
resources/assets/sass/_app.scss
vendored
67
resources/assets/sass/_app.scss
vendored
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
1
resources/views/partials/search.blade.php
Normal file
1
resources/views/partials/search.blade.php
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{!! App\Setting::search() !!}
|
|
@ -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>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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');
|
||||||
|
|
Loading…
Reference in a new issue