group(static::getNavigationGroup()) ->icon(static::getNavigationIcon()) ->activeIcon(static::getActiveNavigationIcon()) ->isActiveWhen(fn (): bool => request()->routeIs(static::getRouteName())) ->sort(static::getNavigationSort()) ->badge(static::getNavigationBadge(), color: static::getNavigationBadgeColor()) ->url(static::getNavigationUrl()), ]; } public static function getRouteName(): string { $slug = static::getSlug(); return "filament.pages.{$slug}"; } public static function getRoutes(): Closure { return function () { $slug = static::getSlug(); Route::get($slug, static::class) ->middleware(static::getMiddlewares()) ->withoutMiddleware(static::getWithoutRouteMiddleware()) ->name($slug); }; } public static function getMiddlewares(): string | array { return static::$middlewares; } public static function getWithoutRouteMiddleware(): string | array { return static::$withoutRouteMiddleware; } public static function getSlug(): string { return static::$slug ?? Str::of(static::$title ?? class_basename(static::class)) ->kebab() ->slug(); } public static function getUrl(array $parameters = [], bool $isAbsolute = true): string { return route(static::getRouteName(), $parameters, $isAbsolute); } public function render(): View { return view(static::$view, $this->getViewData()) ->layout(static::$layout, $this->getLayoutData()); } protected function getBreadcrumbs(): array { return []; } protected static function getNavigationGroup(): ?string { return static::$navigationGroup; } protected static function getNavigationIcon(): string { return static::$navigationIcon ?? 'heroicon-o-document-text'; } protected static function getActiveNavigationIcon(): string { return static::$activeNavigationIcon ?? static::getNavigationIcon(); } protected static function getNavigationLabel(): string { return static::$navigationLabel ?? static::$title ?? Str::of(class_basename(static::class)) ->kebab() ->replace('-', ' ') ->title(); } protected static function getNavigationBadge(): ?string { return null; } protected static function getNavigationBadgeColor(): ?string { return null; } protected static function getNavigationSort(): ?int { return static::$navigationSort; } protected static function getNavigationUrl(): string { return static::getUrl(); } protected function getActions(): array { return []; } protected function getFooter(): ?View { return null; } protected function getHeader(): ?View { return null; } protected function getHeaderWidgets(): array { return []; } protected function getVisibleHeaderWidgets(): array { return $this->filterVisibleWidgets($this->getHeaderWidgets()); } protected function getHeaderWidgetsColumns(): int | string | array { return 2; } protected function getFooterWidgets(): array { return []; } protected function getVisibleFooterWidgets(): array { return $this->filterVisibleWidgets($this->getFooterWidgets()); } protected function filterVisibleWidgets(array $widgets): array { return array_filter($widgets, fn (string $widget): bool => $widget::canView()); } protected function getFooterWidgetsColumns(): int | string | array { return 2; } protected function getHeading(): string | Htmlable { return $this->heading ?? $this->getTitle(); } protected function getSubheading(): string | Htmlable | null { return $this->subheading; } protected function getTitle(): string | Htmlable { return static::$title ?? (string) Str::of(class_basename(static::class)) ->kebab() ->replace('-', ' ') ->title(); } protected function getMaxContentWidth(): ?string { return $this->maxContentWidth; } protected function getLayoutData(): array { return [ 'breadcrumbs' => $this->getBreadcrumbs(), 'title' => $this->getTitle(), 'maxContentWidth' => $this->getMaxContentWidth(), ]; } protected function getViewData(): array { return []; } protected static function shouldRegisterNavigation(): bool { return static::$shouldRegisterNavigation; } protected function onValidationError(ValidationException $exception): void { if (! static::$reportValidationErrorUsing) { return; } (static::$reportValidationErrorUsing)($exception); } protected function halt(): void { throw new Halt(); } }