Add all files

This commit is contained in:
root
2025-11-30 11:57:22 +01:00
parent 2ee51cac4f
commit 044271db3d
1476 changed files with 142544 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
<?php
namespace App\Admin\Pages;
use Filament\Pages\Dashboard as BaseDashboard;
class Dashboard extends BaseDashboard
{
protected static ?string $navigationIcon = 'ri-function-line';
protected static ?string $activeNavigationIcon = 'ri-function-fill';
}

View File

@@ -0,0 +1,173 @@
<?php
namespace App\Admin\Pages;
use App\Classes\FilamentInput;
use App\Classes\Settings as ClassesSettings;
use App\Models\Setting;
use Filament\Forms\Components\Actions;
use Filament\Forms\Components\Group;
use Filament\Forms\Components\Tabs;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use Illuminate\Support\Facades\Gate;
class Settings extends Page implements HasForms
{
use InteractsWithForms;
protected static ?string $navigationGroup = 'System';
protected static ?string $title = 'Settings';
protected static ?string $navigationIcon = 'ri-settings-3-line';
protected static ?string $activeNavigationIcon = 'ri-settings-3-fill';
protected static string $view = 'admin.pages.settings';
public ?array $data = [];
public function mount(): void
{
$setting_values = [];
foreach (\App\Classes\Settings::settings() as $group => $settings) {
foreach ($settings as $setting) {
$setting_values[$setting['name']] = config("settings.{$setting['name']}", $setting['default'] ?? null);
}
}
$this->form->fill($setting_values);
}
public function form(Form $form): Form
{
$tabs = [];
foreach (ClassesSettings::settings() as $key => $categories) {
$tab = Tabs\Tab::make($key)
->label(ucwords(str_replace('-', ' ', $key)))
->schema(function () use ($categories, $key) {
$inputs = [];
foreach ($categories as $setting) {
$inputs[] = FilamentInput::convert($setting);
}
if ($key === 'theme') {
// Add a reset colors button if there are color settings
array_unshift($inputs, Actions::make([
Actions\Action::make('resetColors')
->label('Reset Colors')
->color('danger')
->requiresConfirmation()
->action(fn () => $this->resetColors()),
]));
// Wrap the first two inputs in a group if there are more than one
if (count($inputs) > 1) {
$inputs[0] = Group::make([
$inputs[1]->columnSpan(3),
$inputs[0],
])->columns(4)->columnSpanFull();
unset($inputs[1]);
}
}
return $inputs;
});
$tabs[] = $tab;
}
return $form
->schema([
Tabs::make('Tabs')
->tabs($tabs)
->persistTabInQueryString(),
])
->statePath('data');
}
public function save(): void
{
Gate::authorize('has-permission', 'admin.settings.update');
$data = $this->form->getState();
$settings = Setting::where('settingable_type', null)
->whereIn('key', array_keys($data))
->get()
->keyBy('key');
foreach ($data as $key => $value) {
// Get only the settings that have changed
$avSetting = (object) collect(\App\Classes\Settings::settings())->flatten(1)->firstWhere('name', $key);
$avSetting->value = $settings[$key]->value ?? $avSetting->default ?? null;
if ($value !== $avSetting->value || (($avSetting->database_type ?? 'string') === 'boolean' && (bool) $value !== (bool) $avSetting->value)) {
if ($setting = $settings[$key] ?? null) {
$setting->update([
'value' => $value,
'type' => $avSetting->database_type ?? 'string',
]);
} else {
Setting::create([
'key' => $key,
'value' => $value,
'settingable_type' => null,
'type' => $avSetting->database_type ?? 'string',
'encrypted' => $avSetting->encrypted ?? false,
]);
}
}
}
Notification::make()
->title('Saved successfully!')
->success()
->send();
}
public function resetColors(): void
{
Gate::authorize('has-permission', 'admin.settings.update');
$colorSettings = [];
foreach (\App\Classes\Settings::settings() as $group => $settings) {
foreach ($settings as $setting) {
if (($setting['type'] ?? '') === 'color') {
$colorSettings[$setting['name']] = $setting['default'] ?? '';
}
}
}
$currentData = $this->form->getState();
foreach ($colorSettings as $key => $defaultValue) {
$currentData[$key] = $defaultValue;
}
$this->form->fill($currentData);
Notification::make()
->title('Colors has been reset!')
->success()
->send();
}
public static function getFormActions(): array
{
return [
Actions\Action::make('save')
->submit('save')
->keyBindings(['mod+s']),
];
}
public static function canAccess(): bool
{
/** @var \App\Models\User */
$user = auth()->user();
return $user && $user->hasPermission('admin.settings.view');
}
}

View File

@@ -0,0 +1,65 @@
<?php
namespace App\Admin\Pages;
use App\Console\Commands\CheckForUpdates;
use App\Console\Commands\Upgrade;
use Filament\Actions\Action;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Pages\Page;
use Illuminate\Support\Facades\Artisan;
use Symfony\Component\Console\Output\BufferedOutput;
class Updates extends Page implements HasForms
{
use InteractsWithForms;
protected static ?string $navigationIcon = 'ri-loop-left-line';
protected static ?string $activeNavigationIcon = 'ri-loop-left-fill';
protected static string $view = 'admin.pages.updates';
protected static ?string $navigationGroup = 'System';
protected function getHeaderActions(): array
{
return [
Action::make('checkUpdates')
->action(function () {
Artisan::call(CheckForUpdates::class);
})
->label('Check for updates'),
];
}
public function update(): Action
{
return Action::make('update')
->requiresConfirmation()
->action(function () {
$output = new BufferedOutput;
// Check if current chdir is the root of the project
if (getcwd() !== base_path()) {
chdir(base_path());
}
if (config('app.version') == 'beta') {
Artisan::call(Upgrade::class, ['--no-interaction' => true, '--url' => 'https://api.paymenter.org/beta'], $output);
} else {
Artisan::call(Upgrade::class, ['--no-interaction' => true], $output);
}
$this->dispatch('update-completed', [
'output' => $output->fetch(),
]);
})
->label('Update');
}
public static function canAccess(): bool
{
return auth()->check() && auth()->user()->hasPermission('admin.updates.update');
}
}