103 lines
3.7 KiB
PHP

<?php
namespace App\Http\Controllers\SystemSettings;
use App\Models\Auth\User;
use App\Utilities\BusinessNavigation;
use App\Utilities\SidebarPermissions;
use App\Utilities\SystemAccess;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Validation\Rule;
class Sidebar extends Controller
{
public function __construct()
{
$this->middleware(function ($request, $next) {
abort_unless(SystemAccess::canOpenSettings(), 403);
return $next($request);
});
}
public function edit(Request $request)
{
$subjects = $this->subjects();
$subject = $request->string('subject')->toString() ?: array_key_first($subjects);
abort_unless(isset($subjects[$subject]), 404);
$settings = SidebarPermissions::settings();
$configured = in_array($subject, $settings['configured'] ?? [], true);
return view('system_settings.sidebar.edit', [
'navigation' => BusinessNavigation::all(),
'subjects' => $subjects,
'subject' => $subject,
'configured' => $configured,
'selected' => $configured ? (array) ($settings['subjects'][$subject] ?? []) : SidebarPermissions::allKeys(),
]);
}
public function update(Request $request)
{
$subjects = $this->subjects();
$subject = $request->input('subject');
$request->validate([
'subject' => ['required', Rule::in(array_keys($subjects))],
'permissions' => ['nullable', 'array'],
'permissions.*' => ['string', Rule::in(SidebarPermissions::allKeys())],
]);
$settings = SidebarPermissions::settings();
$settings['configured'] = array_values(array_unique(array_merge(
(array) ($settings['configured'] ?? []),
[$subject]
)));
$settings['subjects'][$subject] = array_values(array_unique((array) $request->input('permissions', [])));
setting()->set('system.sidebar_permissions', json_encode($settings, JSON_UNESCAPED_UNICODE));
setting()->save();
flash('保存成功,侧边栏权限已更新。')->success();
return redirect()->route('dashboard');
}
private function subjects(): array
{
$labels = SystemAccess::roleLabels();
if (SystemAccess::isSuperAdmin()) {
$subjects = [
'role_super_admin' => '用户类型:' . $labels[SystemAccess::SUPER_ADMIN],
'role_admin' => '用户类型:' . $labels[SystemAccess::ADMIN],
'role_user' => '用户类型:' . $labels[SystemAccess::USER],
];
$users = User::query()
->whereHas('companies', fn ($company) => $company->where('companies.id', company_id()))
->whereHas('roles', fn ($roles) => $roles->whereIn('roles.name', [SystemAccess::SUPER_ADMIN, SystemAccess::ADMIN, SystemAccess::USER]))
->with('roles')
->orderBy('name')
->get();
} else {
$subjects = ['role_user' => '用户类型:' . $labels[SystemAccess::USER]];
$users = User::query()
->whereHas('companies', fn ($company) => $company->where('companies.id', company_id()))
->whereHas('roles', fn ($roles) => $roles->where('roles.name', SystemAccess::USER))
->orderBy('name')
->get();
}
foreach ($users as $managedUser) {
$role = SystemAccess::roleName($managedUser);
$subjects['user_' . $managedUser->id] = '指定用户:' . $managedUser->name . ' - ' . ($labels[$role] ?? $role);
}
return $subjects;
}
}