'login-settings', // unique identifier * 'plugin' => 'api', // plugin owning the blueprint * 'label' => 'Login & Security', // card title * 'description' => 'Authentication …', // optional sub-label * 'icon' => 'fa-shield-alt', // optional FA icon * 'blueprint' => 'login-settings', // blueprint file name * 'data_endpoint' => '/login-settings/data', // GET endpoint * 'save_endpoint' => '/login-settings/save', // PATCH endpoint * 'priority' => 0, // sort order (higher = earlier) * ] * * Panels are gated by the registering plugin — the user is passed in the * event so listeners can skip adding the panel when permissions aren't met. */ class SettingsController extends AbstractApiController { /** * GET /settings/panels — Collect admin-next settings panels from plugins. */ public function panels(ServerRequestInterface $request): ResponseInterface { $this->requirePermission($request, 'api.access'); $event = new Event(['panels' => [], 'user' => $this->getUser($request)]); $this->grav->fireEvent('onApiAdminSettingsPanels', $event); $panels = $event['panels'] ?? []; // Sort by priority descending (higher priority first), preserving // insertion order among equal-priority panels. usort($panels, fn($a, $b) => ($b['priority'] ?? 0) <=> ($a['priority'] ?? 0)); return ApiResponse::create($panels); } }