100 lines
3.8 KiB
PHP
100 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\System;
|
|
|
|
use App\Services\SettingsService;
|
|
use Illuminate\Validation\Rule;
|
|
use Livewire\Attributes\Layout;
|
|
use Livewire\Component;
|
|
|
|
#[Layout('layouts.app')]
|
|
class SettingsPage extends Component
|
|
{
|
|
public string $companyName = '';
|
|
|
|
public string $timezone = 'Asia/Yekaterinburg';
|
|
|
|
public int $defaultSlaHours = 24;
|
|
|
|
public bool $maintenanceMode = false;
|
|
|
|
public bool $notifyAssigned = true;
|
|
|
|
public bool $notifyStatusChanged = true;
|
|
|
|
public bool $notifyCommentAdded = true;
|
|
|
|
public bool $notifyOverdue = true;
|
|
|
|
public bool $notifySlaWarning = true;
|
|
|
|
/**
|
|
* @var array<string, string>
|
|
*/
|
|
public array $russianTimezones = [
|
|
'Europe/Kaliningrad' => 'Калининград (UTC+2)',
|
|
'Europe/Moscow' => 'Москва (UTC+3)',
|
|
'Europe/Samara' => 'Самара (UTC+4)',
|
|
'Asia/Yekaterinburg' => 'Екатеринбург (UTC+5)',
|
|
'Asia/Omsk' => 'Омск (UTC+6)',
|
|
'Asia/Krasnoyarsk' => 'Красноярск (UTC+7)',
|
|
'Asia/Irkutsk' => 'Иркутск (UTC+8)',
|
|
'Asia/Yakutsk' => 'Якутск (UTC+9)',
|
|
'Asia/Vladivostok' => 'Владивосток (UTC+10)',
|
|
'Asia/Magadan' => 'Магадан (UTC+11)',
|
|
'Asia/Sakhalin' => 'Сахалин (UTC+11)',
|
|
'Asia/Kamchatka' => 'Камчатка (UTC+12)',
|
|
];
|
|
|
|
public function mount(SettingsService $settingsService): void
|
|
{
|
|
abort_unless(auth()->user()->isAdmin(), 403);
|
|
|
|
$this->companyName = (string) $settingsService->get('company_name', 'Computer Service');
|
|
$this->timezone = (string) $settingsService->get('timezone', 'Asia/Yekaterinburg');
|
|
$this->defaultSlaHours = (int) $settingsService->get('default_sla_hours', 24);
|
|
$this->maintenanceMode = (bool) $settingsService->get('maintenance_mode', false);
|
|
$notifications = $settingsService->emailNotifications();
|
|
$this->notifyAssigned = (bool) ($notifications['assigned'] ?? true);
|
|
$this->notifyStatusChanged = (bool) ($notifications['status_changed'] ?? true);
|
|
$this->notifyCommentAdded = (bool) ($notifications['comment_added'] ?? true);
|
|
$this->notifyOverdue = (bool) ($notifications['overdue'] ?? true);
|
|
$this->notifySlaWarning = (bool) ($notifications['sla_warning'] ?? true);
|
|
}
|
|
|
|
public function save(SettingsService $settingsService): void
|
|
{
|
|
$this->validate([
|
|
'companyName' => ['required', 'string', 'max:255'],
|
|
'timezone' => ['required', Rule::in(array_keys($this->russianTimezones))],
|
|
'defaultSlaHours' => ['required', 'integer', 'min:1', 'max:720'],
|
|
'maintenanceMode' => ['boolean'],
|
|
'notifyAssigned' => ['boolean'],
|
|
'notifyStatusChanged' => ['boolean'],
|
|
'notifyCommentAdded' => ['boolean'],
|
|
'notifyOverdue' => ['boolean'],
|
|
'notifySlaWarning' => ['boolean'],
|
|
]);
|
|
|
|
$settingsService->set('company_name', $this->companyName, 'string');
|
|
$settingsService->set('timezone', $this->timezone, 'string');
|
|
$settingsService->set('default_sla_hours', $this->defaultSlaHours, 'integer');
|
|
$settingsService->set('maintenance_mode', $this->maintenanceMode, 'boolean');
|
|
|
|
$settingsService->set('email_notifications', [
|
|
'assigned' => $this->notifyAssigned,
|
|
'status_changed' => $this->notifyStatusChanged,
|
|
'comment_added' => $this->notifyCommentAdded,
|
|
'overdue' => $this->notifyOverdue,
|
|
'sla_warning' => $this->notifySlaWarning,
|
|
], 'json');
|
|
|
|
session()->flash('success', 'Настройки сохранены.');
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.system.settings-page')->title('Системные настройки');
|
|
}
|
|
}
|