WIP: Road to 1.0.0 #1
|
@ -22,11 +22,33 @@
|
|||
namespace App\Helpers;
|
||||
|
||||
use App\Options as Option;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
/**
|
||||
* The options class. A simple wrapper around the model. Could be a repository, but we're not using that design pattern just yet
|
||||
*/
|
||||
class Options
|
||||
{
|
||||
|
||||
/**
|
||||
* Returns an assortment of settings found in the mentioned category
|
||||
*
|
||||
* @param $category The category
|
||||
* @return Collection The settings in this category
|
||||
*/
|
||||
public function getCategory(string $category): Collection
|
||||
{
|
||||
$options = Option::where('option_category', $category)->get();
|
||||
if ($options->isEmpty())
|
||||
{
|
||||
throw new \Exception('There are no options in category ' . $category);
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
|
||||
public function getOption(string $option): string
|
||||
{
|
||||
$value = Cache::get($option);
|
||||
|
@ -47,12 +69,14 @@ class Options
|
|||
return $value;
|
||||
}
|
||||
|
||||
public function setOption(string $option, string $value, string $description)
|
||||
// Null categories are settings without categories and will appear ungrouped
|
||||
public function setOption(string $option, string $value, string $description, string $category = null)
|
||||
{
|
||||
Option::create([
|
||||
'option_name' => $option,
|
||||
'option_value' => $value,
|
||||
'friendly_name' => $description,
|
||||
'option_category' => $category
|
||||
]);
|
||||
|
||||
Cache::put($option, $value, now()->addDay());
|
||||
|
|
|
@ -36,17 +36,17 @@ class OptionsController extends Controller
|
|||
*/
|
||||
public function index()
|
||||
{
|
||||
// TODO: Obtain this from the facade
|
||||
$options = Option::all();
|
||||
|
||||
return view('dashboard.administration.settings')
|
||||
->with('options', $options)
|
||||
->with('security', [
|
||||
'secPolicy' => Options::getOption('pw_security_policy'),
|
||||
'graceperiod' => Options::getOption('graceperiod'),
|
||||
'pwExpiry' => Options::getOption('password_expiry'),
|
||||
'requiresPMC' => Options::getOption('requireGameLicense'),
|
||||
'enforce2fa' => Options::getOption('force2fa')
|
||||
->with([
|
||||
'options' => Options::getCategory('notifications'),
|
||||
'security' => [ // We could use the method above, but we need to set these names here for greater control in the template. This would nto be feasible for many options, we'd need to use a loop and the category method.
|
||||
'secPolicy' => Options::getOption('pw_security_policy'),
|
||||
'graceperiod' => Options::getOption('graceperiod'),
|
||||
'pwExpiry' => Options::getOption('password_expiry'),
|
||||
'requiresPMC' => Options::getOption('requireGameLicense'),
|
||||
'enforce2fa' => Options::getOption('force2fa')
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddCategoryToOptions extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('options', function (Blueprint $table) {
|
||||
$table->string('option_category')->after('friendly_name')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('options', function (Blueprint $table) {
|
||||
$table->dropColumn('option_category');
|
||||
});
|
||||
}
|
||||
}
|
|
@ -33,25 +33,25 @@ class DefaultOptionsSeeder extends Seeder
|
|||
*/
|
||||
public function run()
|
||||
{
|
||||
Options::setOption('notify_new_application_email', true, 'Notify when a new application comes through'); // done
|
||||
Options::setOption('notify_application_comment', false, 'Notify when someone comments on an application'); // done
|
||||
Options::setOption('notify_new_application_email', true, 'Notify when a new application comes through', 'notifications'); // done
|
||||
Options::setOption('notify_application_comment', false, 'Notify when someone comments on an application' , 'notifications'); // done
|
||||
Options::setOption('notify_new_user', true, 'Notify when someone signs up'); // done
|
||||
Options::setOption('notify_application_status_change', true, 'Notify when an application changes status'); // done
|
||||
Options::setOption('notify_applicant_approved', true, 'Notify when an applicant is approved'); // done
|
||||
Options::setOption('notify_vacancystatus_change', false, 'Notify when a vacancy\'s status changes'); // done
|
||||
Options::setOption('notify_application_status_change', true, 'Notify when an application changes status' , 'notifications'); // done
|
||||
Options::setOption('notify_applicant_approved', true, 'Notify when an applicant is approved' , 'notifications'); // done
|
||||
Options::setOption('notify_vacancystatus_change', false, 'Notify when a vacancy\'s status changes' , 'notifications'); // done
|
||||
|
||||
Options::setOption('enable_slack_notifications', true, 'Enable slack notifications');
|
||||
Options::setOption('enable_email_notifications', true, 'Enable e-mail notifications');
|
||||
Options::setOption('enable_slack_notifications', true, 'Enable slack notifications' , 'notifications');
|
||||
Options::setOption('enable_email_notifications', true, 'Enable e-mail notifications' , 'notifications');
|
||||
|
||||
// added in 0.6.2
|
||||
Options::setOption('pw_security_policy', 'low', 'Describes the current password security policy.');
|
||||
Options::setOption('graceperiod', 7, '2FA Grace Period');
|
||||
Options::setOption('password_expiry', 'disabled', 'Defines wether passwords must be reset after $value');
|
||||
Options::setOption('force2fa', false, 'Defines whether 2fa is forced upon users');
|
||||
Options::setOption('force2faRole', 'reviewer', 'Defines which role to force 2fa for');
|
||||
Options::setOption('requireGameLicense', true, 'Defines whether people need to validate their game license');
|
||||
Options::setOption('pw_security_policy', 'low', 'Describes the current password security policy.', 'app_security');
|
||||
Options::setOption('graceperiod', 7, '2FA Grace Period', 'app_security');
|
||||
Options::setOption('password_expiry', 'disabled', 'Defines wether passwords must be reset after $value', 'app_security');
|
||||
Options::setOption('force2fa', false, 'Defines whether 2fa is forced upon users', 'app_security');
|
||||
Options::setOption('force2faRole', 'reviewer', 'Defines which role to force 2fa for', 'app_security');
|
||||
Options::setOption('requireGameLicense', true, 'Defines whether people need to validate their game license', 'app_security');
|
||||
|
||||
Options::setOption('currentGame', 'MINECRAFT', 'Defines what game we\'re working with');
|
||||
Options::setOption('currentGame', 'MINECRAFT', 'Defines what game we\'re working with', 'app_integration');
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -108,13 +108,17 @@
|
|||
<form name="settings" id="settings" method="post" action="{{route('saveSettings')}}">
|
||||
@csrf
|
||||
@foreach($options as $option)
|
||||
<div class="form-group form-check">
|
||||
<!-- Unchecked checkbox hack: This only works for serverside languages that process the last duplicate element, since the browser sends both the hidden and checkbox values. -->
|
||||
<!-- This "hack" is necessary because browsers don't send, by default, unchecked checkboxes to the server, so we would have no way to know if X checkbox was unchecked. -->
|
||||
<input type="hidden" name="{{$option->option_name}}" value="0">
|
||||
<input type="checkbox" name="{{$option->option_name}}" value="1" id="{{$option->option_name}}" class="form-check-input" {{ ($option->option_value == 1) ? 'checked' : '' }}>
|
||||
<label for="{{$option->option_name}}">{{$option->friendly_name}}</label>
|
||||
</div>
|
||||
|
||||
@if(!in_array($option->option_name, $ignoreOptions))
|
||||
|
||||
<div class="form-group form-check">
|
||||
<input type="hidden" name="{{$option->option_name}}" value="0">
|
||||
<input type="checkbox" name="{{$option->option_name}}" value="1" id="{{$option->option_name}}" class="form-check-input" {{ ($option->option_value == 1) ? 'checked' : '' }}>
|
||||
<label for="{{$option->option_name}}">{{$option->friendly_name}}</label>
|
||||
</div>
|
||||
|
||||
@endif
|
||||
|
||||
@endforeach
|
||||
</form>
|
||||
</div>
|
||||
|
|
Loading…
Reference in New Issue