guard(config('filament.auth.guard'));
}
public function navigation(Closure $builder): void
{
$this->navigationBuilder = $builder;
}
public function buildNavigation(): array
{
/** @var \Filament\Navigation\NavigationBuilder $builder */
$builder = app()->call($this->navigationBuilder);
return $builder->getNavigation();
}
public function globalSearchProvider(string $provider): void
{
if (! in_array(GlobalSearchProvider::class, class_implements($provider))) {
throw new Exception("Global search provider {$provider} does not implement the " . GlobalSearchProvider::class . ' interface.');
}
$this->globalSearchProvider = $provider;
}
public function mountNavigation(): void
{
foreach ($this->getPages() as $page) {
$page::registerNavigationItems();
}
foreach ($this->getResources() as $resource) {
$resource::registerNavigationItems();
}
$this->isNavigationMounted = true;
}
public function registerNavigationGroups(array $groups): void
{
$this->navigationGroups = array_merge($this->navigationGroups, $groups);
}
public function registerNavigationItems(array $items): void
{
$this->navigationItems = array_merge($this->navigationItems, $items);
}
public function registerPages(array $pages): void
{
$this->pages = array_merge($this->pages, $pages);
}
public function registerRenderHook(string $name, Closure $callback): void
{
$this->renderHooks[$name][] = $callback;
}
public function registerResources(array $resources): void
{
$this->resources = array_merge($this->resources, $resources);
}
public function registerScripts(array $scripts, bool $shouldBeLoadedBeforeCoreScripts = false): void
{
if ($shouldBeLoadedBeforeCoreScripts) {
$this->beforeCoreScripts = array_merge($this->beforeCoreScripts, $scripts);
} else {
$this->scripts = array_merge($this->scripts, $scripts);
}
}
public function registerScriptData(array $data): void
{
$this->scriptData = array_merge($this->scriptData, $data);
}
public function registerStyles(array $styles): void
{
$this->styles = array_merge($this->styles, $styles);
}
public function registerTheme(string | Htmlable | null $theme): void
{
$this->theme = $theme;
}
public function registerViteTheme(string | array $theme, ?string $buildDirectory = null): void
{
$this->theme = app(Vite::class)($theme, $buildDirectory);
}
public function registerUserMenuItems(array $items): void
{
$this->userMenuItems = array_merge($this->userMenuItems, $items);
}
public function registerWidgets(array $widgets): void
{
$this->widgets = array_merge($this->widgets, $widgets);
}
public function pushMeta(array $meta): void
{
$this->meta = array_merge($this->meta, $meta);
}
public function setServingStatus(bool $condition = true): void
{
$this->isServing = $condition;
}
public function serving(Closure $callback): void
{
Event::listen(ServingFilament::class, $callback);
}
/**
* @deprecated Use `\Filament\Notifications\Notification::send()` instead.
*/
public function notify(string $status, string $message, bool $isAfterRedirect = false): void
{
Notification::make()
->title($message)
->status($status)
->send();
}
public function getGlobalSearchProvider(): GlobalSearchProvider
{
return app($this->globalSearchProvider);
}
public function renderHook(string $name): Htmlable
{
$hooks = array_map(
fn (callable $hook): string => (string) app()->call($hook),
$this->renderHooks[$name] ?? [],
);
return new HtmlString(implode('', $hooks));
}
public function getNavigation(): array
{
if ($this->navigationBuilder !== null) {
return $this->buildNavigation();
}
if (! $this->isNavigationMounted) {
$this->mountNavigation();
}
return collect($this->getNavigationItems())
->sortBy(fn (Navigation\NavigationItem $item): int => $item->getSort())
->groupBy(fn (Navigation\NavigationItem $item): ?string => $item->getGroup())
->map(function (Collection $items, ?string $groupIndex): NavigationGroup {
if (blank($groupIndex)) {
return NavigationGroup::make()->items($items);
}
$registeredGroup = collect($this->getNavigationGroups())
->first(function (NavigationGroup | string $registeredGroup, string | int $registeredGroupIndex) use ($groupIndex) {
if ($registeredGroupIndex === $groupIndex) {
return true;
}
if ($registeredGroup === $groupIndex) {
return true;
}
if (! $registeredGroup instanceof NavigationGroup) {
return false;
}
return $registeredGroup->getLabel() === $groupIndex;
});
if ($registeredGroup instanceof NavigationGroup) {
return $registeredGroup->items($items);
}
return NavigationGroup::make($registeredGroup ?? $groupIndex)
->items($items);
})
->sortBy(function (NavigationGroup $group, ?string $groupIndex): int {
if (blank($group->getLabel())) {
return -1;
}
$registeredGroups = $this->getNavigationGroups();
$groupsToSearch = $registeredGroups;
if (Arr::first($registeredGroups) instanceof NavigationGroup) {
$groupsToSearch = array_merge(
array_keys($registeredGroups),
array_map(fn (NavigationGroup $registeredGroup): string => $registeredGroup->getLabel(), array_values($registeredGroups)),
);
}
$sort = array_search(
$groupIndex,
$groupsToSearch,
);
if ($sort === false) {
return count($registeredGroups);
}
return $sort;
})
->all();
}
public function getNavigationGroups(): array
{
return $this->navigationGroups;
}
public function getNavigationItems(): array
{
return $this->navigationItems;
}
public function getPages(): array
{
return array_unique($this->pages);
}
public function getResources(): array
{
return array_unique($this->resources);
}
public function getUserMenuItems(): array
{
return collect($this->userMenuItems)
->sort(fn (UserMenuItem $item): int => $item->getSort())
->all();
}
public function getModelResource(string | Model $model): ?string
{
if ($model instanceof Model) {
$model = $model::class;
}
foreach ($this->getResources() as $resource) {
if ($model !== $resource::getModel()) {
continue;
}
return $resource;
}
return null;
}
public function getScripts(): array
{
return $this->scripts;
}
public function getBeforeCoreScripts(): array
{
return $this->beforeCoreScripts;
}
public function getScriptData(): array
{
return $this->scriptData;
}
public function getStyles(): array
{
return $this->styles;
}
/**
* @deprecated Use `getThemeLink()` instead.
*/
public function getThemeUrl(): string
{
return $this->theme ?? route('filament.asset', [
'id' => get_asset_id('app.css'),
'file' => 'app.css',
]);
}
public function getThemeLink(): Htmlable
{
if (Str::of($this->theme)->contains('theme instanceof Htmlable ? $this->theme : new HtmlString($this->theme);
}
$url = $this->theme ?? route('filament.asset', [
'id' => get_asset_id('app.css'),
'file' => 'app.css',
]);
return new HtmlString("");
}
public function getUrl(): ?string
{
$firstGroup = Arr::first($this->getNavigation());
if (! $firstGroup) {
return null;
}
$firstItem = Arr::first($firstGroup->getItems());
if (! $firstItem) {
return null;
}
return $firstItem->getUrl();
}
public function getUserAvatarUrl(Model | Authenticatable $user): string
{
$avatar = null;
if ($user instanceof HasAvatar) {
$avatar = $user->getFilamentAvatarUrl();
}
if ($avatar) {
return $avatar;
}
$provider = config('filament.default_avatar_provider');
return app($provider)->get($user);
}
public function getUserName(Model | Authenticatable $user): string
{
if ($user instanceof HasName) {
return $user->getFilamentName();
}
return $user->getAttributeValue('name');
}
public function getWidgets(): array
{
return collect($this->widgets)
->unique()
->sortBy(fn (string $widget): int => $widget::getSort())
->all();
}
public function getMeta(): array
{
return array_unique($this->meta);
}
public function isServing(): bool
{
return $this->isServing;
}
}