$parameters */ public static function getUrl(array $parameters = [], bool $isAbsolute = true, ?string $panel = null, ?Model $tenant = null): string { $parameters['tenant'] ??= ($tenant ?? Filament::getTenant()); return route(static::getRouteName($panel), $parameters, $isAbsolute); } public static function registerNavigationItems(): void { if (! static::shouldRegisterNavigation()) { return; } Filament::getCurrentPanel() ->navigationItems(static::getNavigationItems()); } /** * @return array */ public static function getNavigationItems(): array { return [ NavigationItem::make(static::getNavigationLabel()) ->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 $panel = null): string { $panel ??= Filament::getCurrentPanel()->getId(); return (string) str(static::getSlug()) ->replace('/', '.') ->prepend("filament.{$panel}.pages."); } /** * @return array */ public function getBreadcrumbs(): array { return []; } public static function getNavigationGroup(): ?string { return static::$navigationGroup; } public static function getActiveNavigationIcon(): ?string { return static::$activeNavigationIcon ?? static::getNavigationIcon(); } public static function getNavigationIcon(): ?string { return static::$navigationIcon; } public static function getNavigationLabel(): string { return static::$navigationLabel ?? static::$title ?? str(class_basename(static::class)) ->kebab() ->replace('-', ' ') ->title(); } public static function getNavigationBadge(): ?string { return null; } /** * @return string | array{50: string, 100: string, 200: string, 300: string, 400: string, 500: string, 600: string, 700: string, 800: string, 900: string, 950: string} | null */ public static function getNavigationBadgeColor(): string | array | null { return null; } public static function getNavigationSort(): ?int { return static::$navigationSort; } public static function getNavigationUrl(): string { return static::getUrl(); } public function getFooter(): ?View { return null; } public function getHeader(): ?View { return null; } /** * @return array | WidgetConfiguration> */ protected function getHeaderWidgets(): array { return []; } /** * @return array | WidgetConfiguration> */ public function getVisibleHeaderWidgets(): array { return $this->filterVisibleWidgets($this->getHeaderWidgets()); } /** * @return int | string | array */ public function getHeaderWidgetsColumns(): int | string | array { return 2; } /** * @return array | WidgetConfiguration> */ protected function getFooterWidgets(): array { return []; } /** * @return array | WidgetConfiguration> */ public function getVisibleFooterWidgets(): array { return $this->filterVisibleWidgets($this->getFooterWidgets()); } /** * @param array | WidgetConfiguration> $widgets * @return array | WidgetConfiguration> */ protected function filterVisibleWidgets(array $widgets): array { return array_filter($widgets, fn (string | WidgetConfiguration $widget): bool => $this->normalizeWidgetClass($widget)::canView()); } /** * @param class-string | WidgetConfiguration $widget * @return class-string */ protected function normalizeWidgetClass(string | WidgetConfiguration $widget): string { if ($widget instanceof WidgetConfiguration) { return $widget->widget; } return $widget; } /** * @return int | string | array */ public function getFooterWidgetsColumns(): int | string | array { return 2; } /** * @return array */ public function getWidgetData(): array { return []; } public static function shouldRegisterNavigation(): bool { return static::$shouldRegisterNavigation; } public static function isDiscovered(): bool { return static::$isDiscovered; } }