-
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathFilamentLibraryPlugin.php
More file actions
131 lines (115 loc) · 4.61 KB
/
FilamentLibraryPlugin.php
File metadata and controls
131 lines (115 loc) · 4.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
namespace Tapp\FilamentLibrary;
use App\Models\User;
use Filament\Contracts\Plugin;
use Filament\Navigation\NavigationItem;
use Filament\Panel;
use Illuminate\Contracts\Auth\Authenticatable;
use Tapp\FilamentLibrary\Models\LibraryItem;
use Tapp\FilamentLibrary\Resources\LibraryItemResource;
class FilamentLibraryPlugin implements Plugin
{
protected static $libraryAdminCallback = null;
public function getId(): string
{
return 'filament-library';
}
/**
* Set a custom callback to determine if a user is a library admin.
*
* @param callable $callback Function that receives a user and returns bool
*/
public static function setLibraryAdminCallback(callable $callback): void
{
static::$libraryAdminCallback = $callback;
}
/**
* Check if a user is a library admin.
*
* @param Authenticatable|null $user
*/
public static function isLibraryAdmin($user): bool
{
if (! $user) {
return false;
}
// Use custom callback if set
if (static::$libraryAdminCallback) {
return call_user_func(static::$libraryAdminCallback, $user);
}
// Check for config-based callback
$configCallback = config('filament-library.admin_callback');
if ($configCallback && is_callable($configCallback)) {
return call_user_func($configCallback, $user);
}
// Default implementation - check for configured admin role
$adminRole = config('filament-library.admin_role', 'Admin');
if (method_exists($user, 'hasRole')) {
return $user->hasRole($adminRole);
}
return false;
}
public function register(Panel $panel): void
{
$panelId = $panel->getId();
$panel
->resources([
LibraryItemResource::class,
])
->navigationItems([
NavigationItem::make('Library')
->url(fn () => LibraryItemResource::getUrl('index'))
->icon('heroicon-o-building-library')
->group('Resource Library')
->sort(1)
->isActiveWhen(fn () => request()->routeIs("filament.{$panelId}.resources.library.index")),
NavigationItem::make('Search All')
->url(fn () => LibraryItemResource::getUrl('search-all'))
->icon('heroicon-o-magnifying-glass')
->group('Resource Library')
->sort(2)
->isActiveWhen(fn () => request()->routeIs("filament.{$panelId}.resources.library.search-all")),
NavigationItem::make('My Documents')
->url(fn () => LibraryItemResource::getUrl('my-documents'))
->icon('heroicon-o-folder')
->group('Resource Library')
->sort(3)
->isActiveWhen(fn () => request()->routeIs("filament.{$panelId}.resources.library.my-documents")),
NavigationItem::make('Shared with Me')
->url(fn () => LibraryItemResource::getUrl('shared-with-me'))
->icon('heroicon-o-share')
->group('Resource Library')
->sort(4)
->isActiveWhen(fn () => request()->routeIs("filament.{$panelId}.resources.library.shared-with-me")),
NavigationItem::make('Created by Me')
->url(fn () => LibraryItemResource::getUrl('created-by-me'))
->icon('heroicon-o-user')
->group('Resource Library')
->sort(5)
->isActiveWhen(fn () => request()->routeIs("filament.{$panelId}.resources.library.created-by-me")),
NavigationItem::make('Favorites')
->url(fn () => LibraryItemResource::getUrl('favorites'))
->icon('heroicon-o-star')
->group('Resource Library')
->sort(6)
->isActiveWhen(fn () => request()->routeIs("filament.{$panelId}.resources.library.favorites")),
]);
}
public function boot(Panel $panel): void
{
// Ensure users have personal folders when they access the library
User::created(function ($user) {
LibraryItem::ensurePersonalFolder($user);
});
}
public static function make(): static
{
return app(static::class);
}
public static function get(): static
{
/** @var static $plugin */
$plugin = filament(app(static::class)->getId());
return $plugin;
}
}