added settings page

it's time to get the setting api running so site options can be editied
so the first step is to get the settings page up and running.

the sorting class is getting a bit heavy, but it will hold the method
for gathering settings page info for now.
This commit is contained in:
ro 2024-03-19 13:19:27 -06:00
parent 2420ea193c
commit 0951005341
No known key found for this signature in database
GPG key ID: 29B551CDBD4D3B50
8 changed files with 198 additions and 7 deletions

View file

@ -5,6 +5,7 @@ namespace App\Http\Controllers\Dash;
use App\Interfaces\PageRepositoryInterface; use App\Interfaces\PageRepositoryInterface;
use App\Services\AuthService; use App\Services\AuthService;
use App\Services\ThemeService; use App\Services\ThemeService;
use App\Services\SortingService;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
class IndexController extends Controller class IndexController extends Controller
@ -12,15 +13,18 @@ class IndexController extends Controller
protected PageRepositoryInterface $pages; protected PageRepositoryInterface $pages;
protected AuthService $auth; protected AuthService $auth;
protected ThemeService $themes; protected ThemeService $themes;
protected SortingService $sort;
public function __construct( public function __construct(
PageRepositoryInterface $pageRepository, PageRepositoryInterface $pageRepository,
AuthService $authService, AuthService $authService,
ThemeService $themeService, ThemeService $themeService,
SortingService $sortingService
) { ) {
$this->pages = $pageRepository; $this->pages = $pageRepository;
$this->auth = $authService; $this->auth = $authService;
$this->themes = $themeService; $this->themes = $themeService;
$this->sort = $sortingService;
} }
public function login() public function login()
@ -79,4 +83,9 @@ class IndexController extends Controller
"title" => $title, "title" => $title,
]); ]);
} }
public function settings()
{
return view('back.settings', $this->sort->settings());
}
} }

View file

@ -63,6 +63,7 @@ class FipamoServiceProvider extends ServiceProvider
new SettingsService(new DocService()), new SettingsService(new DocService()),
new ContentService(), new ContentService(),
new StringService(), new StringService(),
new ThemeService(new SettingsService(new DocService()))
), ),
new SettingsService(new DocService()), new SettingsService(new DocService()),
new ContentService(), new ContentService(),
@ -74,6 +75,7 @@ class FipamoServiceProvider extends ServiceProvider
new SettingsService(new DocService()), new SettingsService(new DocService()),
new ContentService(), new ContentService(),
new StringService(), new StringService(),
new ThemeService(new SettingsService(new DocService()))
); );
}); });

View file

@ -32,6 +32,12 @@ class SettingsService
return $this->settings['global']; return $this->settings['global'];
} }
public function getEmail()
{
$this->settings = $this->loadSettings();
return $this->settings['email'];
}
public function getMenu() public function getMenu()
{ {
$this->settings = $this->loadSettings(); $this->settings = $this->loadSettings();

View file

@ -2,6 +2,8 @@
namespace App\Services; namespace App\Services;
use Carbon\Carbon;
use function _\find; use function _\find;
use function _\filter; use function _\filter;
@ -12,15 +14,18 @@ class SortingService
private $settings; private $settings;
private $contents; private $contents;
private $strings; private $strings;
private $themes;
public function __construct( public function __construct(
SettingsService $settingsService, SettingsService $settingsService,
ContentService $contentService, ContentService $contentService,
StringService $stringService StringService $stringService,
ThemeService $themeService,
) { ) {
$this->settings = $settingsService; $this->settings = $settingsService;
$this->contents = $contentService; $this->contents = $contentService;
$this->strings = $stringService; $this->strings = $stringService;
$this->themes = $themeService;
} }
public function tags() public function tags()
@ -177,13 +182,11 @@ class SortingService
]); ]);
} }
} }
$meta = [ $meta = [
'who' => $page['author'], 'who' => $page['author'],
'when' => $page['created'], 'when' => $page['created'],
'tags' => $tags, 'tags' => $tags,
]; ];
// if page feature isn't empty, find image from list and set it as background image // if page feature isn't empty, find image from list and set it as background image
// if it is empty, just use global background // if it is empty, just use global background
if ($page['feature'] != '' || $page['feature'] != null) { if ($page['feature'] != '' || $page['feature'] != null) {
@ -199,7 +202,6 @@ class SortingService
} }
} }
} }
//TODO: get rid of if statement and always return recent and featured
$recent = []; $recent = [];
$featured = []; $featured = [];
$limit = 4; $limit = 4;
@ -248,4 +250,32 @@ class SortingService
]; ];
return $pageOptions; return $pageOptions;
} }
public function settings()
{
$global = $this->settings->getGlobal();
$email = $this->settings->getEmail();
$updated = new Carbon($global['last_backup']);
$status = session('member') != '' ? true : false;
$pageOptions = [
'title' => 'Settings',
'private' => $global['private'],
'renderOnSave' => $global['renderOnSave'],
'background' => $global['background'],
'member' => session('member'),
'ftoken' => session('form_token'),
'siteTitle' => $global['title'],
'baseUrl' => $global['base_url'],
'desc' => $global['descriptions'],
'lastBackup' => $updated->format('Y M D d'),
'currentTheme' => $global['theme'],
'themes' => $this->themes->getThemes(),
'apiStatus' => isset($global['externalAPI']) ? $global['externalAPI'] : 'false',
'dynamicRenderStatus' => isset($global['dynamicRender']) ? $global['dynamicRender'] : 'false',
'mailOption' => $email['active'],
'mailConfig' => $email,
'status' => $status,
];
return $pageOptions;
}
} }

View file

@ -1,6 +1,6 @@
{ {
"name": "fipamo-default", "name": "fipamo-default-v2",
"display-name": "Fipamo Oh Won", "display-name": "Fipamo Oh Too",
"author": "Are0h", "author": "Are0h",
"description": "The most dangerous default theme in the known universe.", "description": "The most dangerous default theme in the known universe.",
"version": "1.0.0" "version": "1.0.0"

View file

@ -0,0 +1,112 @@
@extends('frame')
@section('title', 'The Dash | '. $title)
@section('main-content')
<article class="settings">
<section class="member-settings">
<div class="member-avatar">
<div class="avatar" style="background: url({{ $member['avatar'] }} ) no-repeat center center / cover"></div>
<input id="avatar-upload" type="file" name="avatar-upload"/>
</div>
<div class="site-background">
<div class="background" style="background: url({{ $background }} ) no-repeat center center / cover"></div>
<input id="background-upload" type="file" name="backgrond-upload"/>
</div>
<div>
<input type='text' name='handle' id='settings-handle' placeholder='handle' value="{{ $member['handle'] }}" autofocus/>
<input type='text' name='email' id='settings-email' placeholder='email' value="{{ $member['email'] }}" autofocus/>
<input type='text' name='base-url' id='settings-url' placeholder='url' value="{{ $baseUrl }}" autofocus/>
<input type='text' name='base-title' id='settings-title' placeholder='site title' value="{{ $siteTitle }}" autofocus/>
<textarea id="settings-desc" type='text' name='settings_desc' class='settings-dec' placeholder='description stuff' , autofocus>{{ $desc }}</textarea>
</div>
<div>
<button id="create-backup">
<i class="ti ti-disc"></i>
<span>BACK UP YOUR SITE</span>
</button><br/>
@if($lastBackup != '')
LAST BACK UP<br/>
<a href="/api/v1/files">{{ $lastBackup }}</a><br/>
@else
<span>span No back ups. Frowny face.</span>
@endif
</div>
<div class="features">
@if(isset($apiStatus) && $apiStatus == 'true')
<button id="api-access-toggle" title="allow external api" data-enabled="true">
<i class="ti ti-phone-incoming"></i>
<span id="api-status">API ACCESS ENABLED</span>
</button>
@else
<button id="api-access-toggle" title="allow external api" data-enabled="false">
<i class="ti ti-phone-incoming"></i>
<span id="api-status">API ACCESS NOT ENABLED</span>
</button>
@endif
@if(isset($dynamicRenderStatus) && $dynamicRenderStatus == 'true')
<button id="dynamic-render-toggle" title="allow external api" data-enabled="true">
<i class="ti ti-arrow-merge"></i>
<span id="dynamic-render-status">DYNAMIC PAGE RENDERING</span>
</button>
@else
<button id="dynamic-render-toggle" title="allow external api" data-enabled="false">
<i class="ti ti-arrow-merge"></i>
<span id="dynamic-render-status">STATIC PAGE RENDERING</span>
</button>
@endif
</div>
<div class="theme">
<label>Themes</label><br/>
@foreach($themes as $theme)
@if($theme['name'] == $currentTheme)
<button id="{{ $theme['name'] }}" class="theme-select" data-enabled="true">
<i class="ti ti-brush"></i>
<span>{{ $theme['display-name'] }}</span>
</button>
@else
<button href="#" id="{{ $theme['name'] }}" class="theme-select" data-enabled="false">
<i class="ti ti-brush-off"></i>
<span>{{ $theme['display-name'] }}</span>
</button>
@endif
@endforeach
</div>
<div class="mail">
<label>Email</label><br/>
@if($mailOption == "option-none" or $mailOption == "")
<a href="#" class="mail-option" id="option-none" data-enabled="true">NONE</a>
@else
<a href="#" class="mail-option" id="option-none" data-enabled="false">NONE</a>
@endif
@if($mailOption == "option-mg" or $mailOption == "")
<a href="#" class="mail-option" id="option-mg" data-enabled="true">MAILGUN</a>
@else
<a href="#" class="mail-option" id="option-mg" data-enabled="false">MAILGUN</a>
@endif
@if($mailOption == "option-smtp" or $mailOption == "")
<a href="#" class="mail-option" id="option-smtp" data-enabled="true">SMTP</a>
@else
<a href="#" class="mail-option" id="option-smtp" data-enabled="false">SMTP</a>
@endif
@include('forms.mailforms')
<button id="send-mail">
<i class="ti ti-mailbox"></i>
<span>TEST MAIL</span>
</button>
</div>
<div>
<label>API KEY</label>
<br/>
{{ $member['key'] }}
<br/>
<label>FORM TOKEN</label><br/>
{{ $ftoken }}
</div>
</section>
</article>
@endsection

View file

@ -0,0 +1,31 @@
@if($mailOption == "option-smtp")
<div id="mail-smtp" data-enabled='true'>
<input type='text' name='smtp-domain' id='smtp-domain' placeholder='domain'value="{{$mailConfig['smtp']['domain']}}"/>
<input type='text' name='smtp-email' id='smtp-email' placeholder='email' value="{{$mailConfig['smtp']['email']}}" />
<input type='text' name='smtp-pass' id='smtp-pass' placeholder='password' value="{{$mailConfig['smtp']['password']}}"/>
</div>
<div id="mail-mg" data-enabled='false'>
<input type='text' name='mg-domain' id='mg-domain' placeholder='domain' value="{{$mailConfig['mailgun']['domain']}}" />
<input type='text' name='mg-key' id='mg-key' placeholder='api key' value="{{$mailConfig['mailgun']['key']}}"/>
</div>
@elseif($mailOption == 'option-mg')
<div id="mail-smtp" data-enabled='false'>
<input type='text' name='smtp-domain' id='smtp-domain' placeholder='domain'value="{{$mailConfig['smtp']['domain']}}"/>
<input type='text' name='smtp-email' id='smtp-email' placeholder='email' value="{{$mailConfig['smtp']['email']}}" />
<input type='text' name='smtp-pass' id='smtp-pass' placeholder='password' value="{{$mailConfig['smtp']['password']}}"/>
</div>
<div id="mail-mg" data-enabled='true'>
<input type='text' name='mg-domain' id='mg-domain' placeholder='domain' value="{{$mailConfig['mailgun']['domain']}}" />
<input type='text' name='mg-key' id='mg-key' placeholder='api key' value="{{$mailConfig['mailgun']['key']}}"/>
</div>
@else
<div id="mail-smtp" data-enabled='false'>
<input type='text' name='smtp-domain' id='smtp-domain' placeholder='domain'value="{{$mailConfig['smtp']['domain']}}"/>
<input type='text' name='smtp-email' id='smtp-email' placeholder='email' value="{{$mailConfig['smtp']['email']}}" />
<input type='text' name='smtp-pass' id='smtp-pass' placeholder='password' value="{{$mailConfig['smtp']['password']}}"/>
</div>
<div id="mail-mg" data-enabled='false'>
<input type='text' name='mg-domain' id='mg-domain' placeholder='domain' value="{{$mailConfig['mailgun']['domain']}}" />
<input type='text' name='mg-key' id='mg-key' placeholder='api key' value="{{$mailConfig['mailgun']['key']}}"/>
</div>
@endif

View file

@ -30,6 +30,7 @@ Route::group(['prefix' => 'dashboard', 'middleware' => 'member.check'], function
Route::get("/start", [IndexController::class, 'start'])->name('start'); Route::get("/start", [IndexController::class, 'start'])->name('start');
Route::get("/pages/{pageFilter?}/{pageNum?}", [IndexController::class, 'book']); Route::get("/pages/{pageFilter?}/{pageNum?}", [IndexController::class, 'book']);
Route::get("/page/{mode}/{uuid}", [IndexController::class, 'page']); Route::get("/page/{mode}/{uuid}", [IndexController::class, 'page']);
Route::get("/settings", [IndexController::class, 'settings']);
Route::get("/logout", [AuthController::class, 'exit']); Route::get("/logout", [AuthController::class, 'exit']);
}); });