From e64c5118828054315f819915578ef855c37bed28 Mon Sep 17 00:00:00 2001 From: Scott Grayson Date: Tue, 31 Mar 2026 12:17:22 -0400 Subject: [PATCH 1/2] feat: show shared items in main Library view Items explicitly shared with a user now appear in the Library root alongside public items, instead of only in "Shared with Me." Adds a "Shared with you" label on items shared with the current user. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Resources/LibraryItemResource.php | 12 ++++++++++++ src/Resources/Pages/ListLibraryItems.php | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/src/Resources/LibraryItemResource.php b/src/Resources/LibraryItemResource.php index 65de548..75bb309 100644 --- a/src/Resources/LibraryItemResource.php +++ b/src/Resources/LibraryItemResource.php @@ -167,6 +167,18 @@ public static function table(Table $table): Table }) ->icon(fn (?LibraryItem $record): string => $record?->getDisplayIcon() ?? 'heroicon-o-document') ->iconPosition('before') + ->description(function (?LibraryItem $record): ?string { + $user = auth()->user(); + if (! $user || ! $record) { + return null; + } + + if ($record->created_by !== $user->id && $record->permissions()->where('user_id', $user->id)->exists()) { + return 'Shared with you'; + } + + return null; + }) ->url(function (?LibraryItem $record): ?string { if (! $record) { return null; diff --git a/src/Resources/Pages/ListLibraryItems.php b/src/Resources/Pages/ListLibraryItems.php index ed9a1da..f3a15cd 100644 --- a/src/Resources/Pages/ListLibraryItems.php +++ b/src/Resources/Pages/ListLibraryItems.php @@ -240,6 +240,11 @@ protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder // Creators can see their own items (even if private) if ($user) { $q->orWhere('created_by', $user->id); + + // Users can see items explicitly shared with them + $q->orWhereHas('permissions', function ($pq) use ($user) { + $pq->where('user_id', $user->id); + }); } }) ->where('name', 'not like', "%'s Personal Folder"); From 0b5b80832a55fbd4edf3ab218bf8d752d9707193 Mon Sep 17 00:00:00 2001 From: scottgrayson <7796074+scottgrayson@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:17:45 +0000 Subject: [PATCH 2/2] Fix styling --- database/seeders/LibrarySeeder.php | 5 ++- src/FilamentLibraryPlugin.php | 9 +++-- src/FilamentLibraryServiceProvider.php | 3 +- src/Models/LibraryItem.php | 21 +++++----- src/Models/LibraryItemPermission.php | 7 ++-- src/Models/Traits/BelongsToTenant.php | 9 +++-- src/Resources/LibraryItemResource.php | 21 ++++++---- src/Resources/Pages/CreatedByMe.php | 6 ++- src/Resources/Pages/EditFile.php | 31 +++++++++------ src/Resources/Pages/EditFolder.php | 25 +++++++----- src/Resources/Pages/EditLibraryItemPage.php | 8 ++-- src/Resources/Pages/EditLink.php | 30 +++++++++------ src/Resources/Pages/Favorites.php | 3 +- src/Resources/Pages/ListLibraryItems.php | 14 ++++--- src/Resources/Pages/MyLibrary.php | 38 +++++++++++-------- src/Resources/Pages/PublicLibrary.php | 6 ++- src/Resources/Pages/SearchAll.php | 3 +- src/Resources/Pages/SharedWithMe.php | 3 +- src/Resources/Pages/ViewLibraryItem.php | 9 +++-- src/Rules/UniqueTagName.php | 6 ++- src/Services/PermissionService.php | 13 ++++--- .../Actions/BulkManagePermissionsAction.php | 3 +- 22 files changed, 170 insertions(+), 103 deletions(-) diff --git a/database/seeders/LibrarySeeder.php b/database/seeders/LibrarySeeder.php index 4e3b4af..d28622c 100644 --- a/database/seeders/LibrarySeeder.php +++ b/database/seeders/LibrarySeeder.php @@ -2,6 +2,7 @@ namespace Tapp\FilamentLibrary\Database\Seeders; +use App\Models\User; use Illuminate\Database\Seeder; use Tapp\FilamentLibrary\Models\LibraryItem; use Tapp\FilamentLibrary\Models\LibraryItemPermission; @@ -14,7 +15,7 @@ class LibrarySeeder extends Seeder public function run(): void { // Get the first user as the creator - $user = \App\Models\User::first(); + $user = User::first(); if (! $user) { $this->command->warn('No users found. Please create a user first.'); @@ -325,7 +326,7 @@ public function run(): void } // Create some sample permissions if there are other users - $otherUsers = \App\Models\User::where('id', '!=', $user->id)->take(2)->get(); + $otherUsers = User::where('id', '!=', $user->id)->take(2)->get(); if ($otherUsers->count() > 0) { $this->command->info('Creating sample permissions...'); diff --git a/src/FilamentLibraryPlugin.php b/src/FilamentLibraryPlugin.php index ef225cd..d882128 100644 --- a/src/FilamentLibraryPlugin.php +++ b/src/FilamentLibraryPlugin.php @@ -2,9 +2,12 @@ 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 @@ -29,7 +32,7 @@ public static function setLibraryAdminCallback(callable $callback): void /** * Check if a user is a library admin. * - * @param \Illuminate\Contracts\Auth\Authenticatable|null $user + * @param Authenticatable|null $user */ public static function isLibraryAdmin($user): bool { @@ -108,8 +111,8 @@ public function register(Panel $panel): void public function boot(Panel $panel): void { // Ensure users have personal folders when they access the library - \App\Models\User::created(function ($user) { - \Tapp\FilamentLibrary\Models\LibraryItem::ensurePersonalFolder($user); + User::created(function ($user) { + LibraryItem::ensurePersonalFolder($user); }); } diff --git a/src/FilamentLibraryServiceProvider.php b/src/FilamentLibraryServiceProvider.php index 943a8d2..18115e3 100644 --- a/src/FilamentLibraryServiceProvider.php +++ b/src/FilamentLibraryServiceProvider.php @@ -12,6 +12,7 @@ use Spatie\LaravelPackageTools\PackageServiceProvider; use Tapp\FilamentLibrary\Commands\FilamentLibraryCommand; use Tapp\FilamentLibrary\Commands\SeedLibraryCommand; +use Tapp\FilamentLibrary\Middleware\RedirectToCorrectEditPage; use Tapp\FilamentLibrary\Models\LibraryItem; use Tapp\FilamentLibrary\Policies\LibraryItemPolicy; @@ -75,7 +76,7 @@ public function packageBooted(): void FilamentIcon::register($this->getIcons()); // Register middleware - $this->app['router']->pushMiddlewareToGroup('web', \Tapp\FilamentLibrary\Middleware\RedirectToCorrectEditPage::class); + $this->app['router']->pushMiddlewareToGroup('web', RedirectToCorrectEditPage::class); // Register the policy $this->app['Illuminate\Contracts\Auth\Access\Gate']->policy(LibraryItem::class, LibraryItemPolicy::class); diff --git a/src/Models/LibraryItem.php b/src/Models/LibraryItem.php index 8bb235a..5ef3546 100644 --- a/src/Models/LibraryItem.php +++ b/src/Models/LibraryItem.php @@ -2,17 +2,20 @@ namespace Tapp\FilamentLibrary\Models; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Str; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Media; +use Tapp\FilamentLibrary\FilamentLibraryPlugin; use Tapp\FilamentLibrary\Models\Traits\BelongsToTenant; /** @@ -26,15 +29,15 @@ * @property string|null $external_url * @property string|null $link_description * @property string|null $general_access - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property \Illuminate\Support\Carbon|null $deleted_at + * @property Carbon|null $created_at + * @property Carbon|null $updated_at + * @property Carbon|null $deleted_at * @property-read LibraryItem|null $parent - * @property-read \Illuminate\Database\Eloquent\Collection $children - * @property-read \Illuminate\Database\Eloquent\Model $creator - * @property-read \Illuminate\Database\Eloquent\Model|null $updater - * @property-read \Illuminate\Database\Eloquent\Collection $permissions - * @property-read \Illuminate\Database\Eloquent\Collection $tags + * @property-read Collection $children + * @property-read Model $creator + * @property-read Model|null $updater + * @property-read Collection $permissions + * @property-read Collection $tags */ class LibraryItem extends Model implements HasMedia { @@ -414,7 +417,7 @@ public function getInheritedGeneralAccessDisplay(): ?string public function hasPermission($user, string $permission): bool { // Admin users always have all permissions - if ($user && \Tapp\FilamentLibrary\FilamentLibraryPlugin::isLibraryAdmin($user)) { + if ($user && FilamentLibraryPlugin::isLibraryAdmin($user)) { return true; } diff --git a/src/Models/LibraryItemPermission.php b/src/Models/LibraryItemPermission.php index 584c338..96d48fe 100644 --- a/src/Models/LibraryItemPermission.php +++ b/src/Models/LibraryItemPermission.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Carbon; use Tapp\FilamentLibrary\Models\Traits\BelongsToTenant; /** @@ -12,10 +13,10 @@ * @property int $library_item_id * @property int $user_id * @property string $role - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at + * @property Carbon|null $created_at + * @property Carbon|null $updated_at * @property-read LibraryItem $libraryItem - * @property-read \Illuminate\Database\Eloquent\Model $user + * @property-read Model $user */ class LibraryItemPermission extends Model { diff --git a/src/Models/Traits/BelongsToTenant.php b/src/Models/Traits/BelongsToTenant.php index 52e9293..d92cb2d 100644 --- a/src/Models/Traits/BelongsToTenant.php +++ b/src/Models/Traits/BelongsToTenant.php @@ -2,6 +2,9 @@ namespace Tapp\FilamentLibrary\Models\Traits; +use Filament\Facades\Filament; +use Illuminate\Database\Eloquent\Model; + trait BelongsToTenant { /** @@ -34,8 +37,8 @@ function ($model) { $tenantRelationshipName = static::getTenantRelationshipName(); // Try to get tenant from Filament context (Filament's standard method) - if (class_exists(\Filament\Facades\Filament::class)) { - $tenant = \Filament\Facades\Filament::getTenant(); + if (class_exists(Filament::class)) { + $tenant = Filament::getTenant(); if ($tenant) { // Use Laravel's associate() method on the BelongsTo relationship @@ -51,7 +54,7 @@ function ($model) { $parentItemId = $model->library_item_id; $parentItemClass = get_class($model->libraryItem()->getRelated()); - /** @var class-string<\Illuminate\Database\Eloquent\Model> $parentItemClass */ + /** @var class-string $parentItemClass */ $parentItem = $parentItemClass::find($parentItemId); if ($parentItem) { diff --git a/src/Resources/LibraryItemResource.php b/src/Resources/LibraryItemResource.php index 75bb309..3656200 100644 --- a/src/Resources/LibraryItemResource.php +++ b/src/Resources/LibraryItemResource.php @@ -12,11 +12,16 @@ use Filament\Actions\ForceDeleteBulkAction; use Filament\Actions\RestoreAction; use Filament\Actions\RestoreBulkAction; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\SpatieMediaLibraryFileUpload; +use Filament\Forms\Components\Textarea; +use Filament\Forms\Components\TextInput; use Filament\Resources\Resource; use Filament\Schemas\Schema; use Filament\Tables; use Filament\Tables\Table; use Tapp\FilamentLibrary\Models\LibraryItem; +use Tapp\FilamentLibrary\Resources\RelationManagers\LibraryItemPermissionsRelationManager; class LibraryItemResource extends Resource { @@ -91,11 +96,11 @@ public static function form(Schema $schema): Schema { return $schema ->schema([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->required() ->maxLength(255), - \Filament\Forms\Components\Select::make('type') + Select::make('type') ->options([ 'folder' => 'Folder', 'file' => 'File', @@ -106,26 +111,26 @@ public static function form(Schema $schema): Schema ->afterStateUpdated(fn (callable $set) => $set('external_url', null)), // Folder form fields - \Filament\Forms\Components\Textarea::make('link_description') + Textarea::make('link_description') ->label('Description') ->visible(fn (callable $get) => $get('type') === 'folder') ->rows(3), // File form fields - \Filament\Forms\Components\SpatieMediaLibraryFileUpload::make('files') + SpatieMediaLibraryFileUpload::make('files') ->label('File') ->visible(fn (callable $get) => $get('type') === 'file') ->required(fn (callable $get) => $get('type') === 'file') ->maxSize(512000), // 500MB // Link form fields - \Filament\Forms\Components\TextInput::make('external_url') + TextInput::make('external_url') ->label('URL') ->url() ->visible(fn (callable $get) => $get('type') === 'link') ->required(fn (callable $get) => $get('type') === 'link'), - \Filament\Forms\Components\Textarea::make('link_description') + Textarea::make('link_description') ->label('Description') ->visible(fn (callable $get) => $get('type') === 'link') ->rows(3), @@ -136,7 +141,7 @@ public static function folderForm(Schema $schema): Schema { return $schema ->schema([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->label('Folder Name') ->required() ->maxLength(255) @@ -359,7 +364,7 @@ public static function table(Table $table): Table public static function getRelations(): array { return [ - \Tapp\FilamentLibrary\Resources\RelationManagers\LibraryItemPermissionsRelationManager::class, + LibraryItemPermissionsRelationManager::class, ]; } diff --git a/src/Resources/Pages/CreatedByMe.php b/src/Resources/Pages/CreatedByMe.php index 927788e..ab0d021 100644 --- a/src/Resources/Pages/CreatedByMe.php +++ b/src/Resources/Pages/CreatedByMe.php @@ -3,6 +3,8 @@ namespace Tapp\FilamentLibrary\Resources\Pages; use Filament\Resources\Pages\ListRecords; +use Illuminate\Database\Eloquent\Builder; +use Tapp\FilamentLibrary\Models\LibraryItem; use Tapp\FilamentLibrary\Resources\LibraryItemResource; class CreatedByMe extends ListRecords @@ -11,13 +13,13 @@ class CreatedByMe extends ListRecords protected static ?string $title = 'Created by Me'; - protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder + protected function getTableQuery(): Builder { $query = parent::getTableQuery(); $user = auth()->user(); if ($user) { - $personalFolder = \Tapp\FilamentLibrary\Models\LibraryItem::getPersonalFolder($user); + $personalFolder = LibraryItem::getPersonalFolder($user); $query->where('created_by', $user->id); // Exclude personal folder if it exists diff --git a/src/Resources/Pages/EditFile.php b/src/Resources/Pages/EditFile.php index 90114e4..0099f9f 100644 --- a/src/Resources/Pages/EditFile.php +++ b/src/Resources/Pages/EditFile.php @@ -2,7 +2,16 @@ namespace Tapp\FilamentLibrary\Resources\Pages; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\SpatieMediaLibraryFileUpload; +use Filament\Forms\Components\Textarea; +use Filament\Forms\Components\TextInput; +use Filament\Schemas\Schema; +use Illuminate\Support\Str; +use Tapp\FilamentLibrary\Models\LibraryItem; +use Tapp\FilamentLibrary\Models\LibraryItemTag; use Tapp\FilamentLibrary\Resources\LibraryItemResource; +use Tapp\FilamentLibrary\Rules\UniqueTagName; class EditFile extends EditLibraryItemPage { @@ -28,49 +37,49 @@ protected function mutateFormDataBeforeFill(array $data): array return $data; } - public function form(\Filament\Schemas\Schema $schema): \Filament\Schemas\Schema + public function form(Schema $schema): Schema { return $schema ->schema([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->required() ->maxLength(255), - \Filament\Forms\Components\SpatieMediaLibraryFileUpload::make('files') + SpatieMediaLibraryFileUpload::make('files') ->label('File') ->maxSize(512000), // 500MB - \Filament\Forms\Components\Textarea::make('link_description') + Textarea::make('link_description') ->label('Description') ->rows(3), - \Filament\Forms\Components\Select::make('tags') + Select::make('tags') ->label('Tags') ->relationship('tags', 'name') ->multiple() ->searchable() ->preload() ->createOptionForm([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->required() ->maxLength(255) ->live(onBlur: true) - ->rules([new \Tapp\FilamentLibrary\Rules\UniqueTagName]) + ->rules([new UniqueTagName]) ->validationAttribute('tag name'), ]) ->createOptionUsing(function (array $data): int { - $tag = \Tapp\FilamentLibrary\Models\LibraryItemTag::create([ + $tag = LibraryItemTag::create([ 'name' => $data['name'], - 'slug' => \Illuminate\Support\Str::slug($data['name']), + 'slug' => Str::slug($data['name']), ]); return $tag->id; }), - \Filament\Forms\Components\Select::make('general_access') + Select::make('general_access') ->label('General Access') ->options(function () { - $options = \Tapp\FilamentLibrary\Models\LibraryItem::getGeneralAccessOptions(); + $options = LibraryItem::getGeneralAccessOptions(); // Remove inherit option if no parent folder if (! $this->getRecord()->parent_id) { diff --git a/src/Resources/Pages/EditFolder.php b/src/Resources/Pages/EditFolder.php index 97eb118..8fa43bc 100644 --- a/src/Resources/Pages/EditFolder.php +++ b/src/Resources/Pages/EditFolder.php @@ -3,7 +3,14 @@ namespace Tapp\FilamentLibrary\Resources\Pages; use Filament\Forms\Components\Select; +use Filament\Forms\Components\Textarea; +use Filament\Forms\Components\TextInput; +use Filament\Schemas\Schema; +use Illuminate\Support\Str; +use Tapp\FilamentLibrary\Models\LibraryItem; +use Tapp\FilamentLibrary\Models\LibraryItemTag; use Tapp\FilamentLibrary\Resources\LibraryItemResource; +use Tapp\FilamentLibrary\Rules\UniqueTagName; class EditFolder extends EditLibraryItemPage { @@ -16,36 +23,36 @@ public function getTitle(): string return 'Edit Folder'; } - public function form(\Filament\Schemas\Schema $schema): \Filament\Schemas\Schema + public function form(Schema $schema): Schema { return $schema ->schema([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->required() ->maxLength(255), - \Filament\Forms\Components\Textarea::make('link_description') + Textarea::make('link_description') ->label('Description') ->rows(3), - \Filament\Forms\Components\Select::make('tags') + Select::make('tags') ->label('Tags') ->relationship('tags', 'name') ->multiple() ->searchable() ->preload() ->createOptionForm([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->required() ->maxLength(255) ->live(onBlur: true) - ->rules([new \Tapp\FilamentLibrary\Rules\UniqueTagName]) + ->rules([new UniqueTagName]) ->validationAttribute('tag name'), ]) ->createOptionUsing(function (array $data): int { - $tag = \Tapp\FilamentLibrary\Models\LibraryItemTag::create([ + $tag = LibraryItemTag::create([ 'name' => $data['name'], - 'slug' => \Illuminate\Support\Str::slug($data['name']), + 'slug' => Str::slug($data['name']), ]); return $tag->id; @@ -54,7 +61,7 @@ public function form(\Filament\Schemas\Schema $schema): \Filament\Schemas\Schema Select::make('general_access') ->label('General Access') ->options(function () { - $options = \Tapp\FilamentLibrary\Models\LibraryItem::getGeneralAccessOptions(); + $options = LibraryItem::getGeneralAccessOptions(); // Remove inherit option if no parent folder if (! $this->getRecord()->parent_id) { diff --git a/src/Resources/Pages/EditLibraryItemPage.php b/src/Resources/Pages/EditLibraryItemPage.php index 006c858..e03901b 100644 --- a/src/Resources/Pages/EditLibraryItemPage.php +++ b/src/Resources/Pages/EditLibraryItemPage.php @@ -2,11 +2,13 @@ namespace Tapp\FilamentLibrary\Resources\Pages; +use App\Models\User; use Filament\Actions\Action; use Filament\Actions\DeleteAction; use Filament\Forms\Components\Select; use Filament\Resources\Pages\EditRecord; use Illuminate\Support\Facades\Schema; +use Tapp\FilamentLibrary\FilamentLibraryPlugin; abstract class EditLibraryItemPage extends EditRecord { @@ -86,7 +88,7 @@ protected function getCreatorSelectField(): Select ->label('Creator') ->searchable() ->getSearchResultsUsing(function (string $search) { - $query = \App\Models\User::query(); + $query = User::query(); // Check if 'name' field exists and has a value if (Schema::hasColumn('users', 'name')) { @@ -108,7 +110,7 @@ protected function getCreatorSelectField(): Select }); }) ->getOptionLabelUsing(function ($value) { - $user = \App\Models\User::find($value); + $user = User::find($value); return $user ? $this->getUserDisplayName($user) : ''; }) @@ -117,7 +119,7 @@ protected function getCreatorSelectField(): Select $record = $this->getRecord(); // Allow changes if user is library admin OR if user is the creator - return ! \Tapp\FilamentLibrary\FilamentLibraryPlugin::isLibraryAdmin($user) && + return ! FilamentLibraryPlugin::isLibraryAdmin($user) && $record->created_by !== $user->id; }) ->helperText('Creator receives owner permissions'); diff --git a/src/Resources/Pages/EditLink.php b/src/Resources/Pages/EditLink.php index 3a9f16a..e6728ba 100644 --- a/src/Resources/Pages/EditLink.php +++ b/src/Resources/Pages/EditLink.php @@ -2,7 +2,15 @@ namespace Tapp\FilamentLibrary\Resources\Pages; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\Textarea; +use Filament\Forms\Components\TextInput; +use Filament\Schemas\Schema; +use Illuminate\Support\Str; +use Tapp\FilamentLibrary\Models\LibraryItem; +use Tapp\FilamentLibrary\Models\LibraryItemTag; use Tapp\FilamentLibrary\Resources\LibraryItemResource; +use Tapp\FilamentLibrary\Rules\UniqueTagName; class EditLink extends EditLibraryItemPage { @@ -15,50 +23,50 @@ public function getTitle(): string return 'Edit External Link'; } - public function form(\Filament\Schemas\Schema $schema): \Filament\Schemas\Schema + public function form(Schema $schema): Schema { return $schema ->schema([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->required() ->maxLength(255), - \Filament\Forms\Components\TextInput::make('external_url') + TextInput::make('external_url') ->label('URL') ->url() ->required(), - \Filament\Forms\Components\Textarea::make('link_description') + Textarea::make('link_description') ->label('Description') ->rows(3), - \Filament\Forms\Components\Select::make('tags') + Select::make('tags') ->label('Tags') ->relationship('tags', 'name') ->multiple() ->searchable() ->preload() ->createOptionForm([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->required() ->maxLength(255) ->live(onBlur: true) - ->rules([new \Tapp\FilamentLibrary\Rules\UniqueTagName]) + ->rules([new UniqueTagName]) ->validationAttribute('tag name'), ]) ->createOptionUsing(function (array $data): int { - $tag = \Tapp\FilamentLibrary\Models\LibraryItemTag::create([ + $tag = LibraryItemTag::create([ 'name' => $data['name'], - 'slug' => \Illuminate\Support\Str::slug($data['name']), + 'slug' => Str::slug($data['name']), ]); return $tag->id; }), - \Filament\Forms\Components\Select::make('general_access') + Select::make('general_access') ->label('General Access') ->options(function () { - $options = \Tapp\FilamentLibrary\Models\LibraryItem::getGeneralAccessOptions(); + $options = LibraryItem::getGeneralAccessOptions(); // Remove inherit option if no parent folder if (! $this->getRecord()->parent_id) { diff --git a/src/Resources/Pages/Favorites.php b/src/Resources/Pages/Favorites.php index 75646bd..3e77ae1 100644 --- a/src/Resources/Pages/Favorites.php +++ b/src/Resources/Pages/Favorites.php @@ -3,6 +3,7 @@ namespace Tapp\FilamentLibrary\Resources\Pages; use Filament\Resources\Pages\ListRecords; +use Illuminate\Database\Eloquent\Builder; use Tapp\FilamentLibrary\Resources\LibraryItemResource; class Favorites extends ListRecords @@ -11,7 +12,7 @@ class Favorites extends ListRecords protected static ?string $title = 'Favorites'; - protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder + protected function getTableQuery(): Builder { $query = parent::getTableQuery(); diff --git a/src/Resources/Pages/ListLibraryItems.php b/src/Resources/Pages/ListLibraryItems.php index f3a15cd..9d0bee0 100644 --- a/src/Resources/Pages/ListLibraryItems.php +++ b/src/Resources/Pages/ListLibraryItems.php @@ -8,6 +8,8 @@ use Filament\Forms\Components\Textarea; use Filament\Forms\Components\TextInput; use Filament\Resources\Pages\ListRecords; +use Illuminate\Database\Eloquent\Builder; +use Tapp\FilamentLibrary\FilamentLibraryPlugin; use Tapp\FilamentLibrary\Models\LibraryItem; use Tapp\FilamentLibrary\Resources\LibraryItemResource; @@ -82,7 +84,7 @@ protected function getHeaderActions(): array } // At root level, only allow admins - return \Tapp\FilamentLibrary\FilamentLibraryPlugin::isLibraryAdmin($user); + return FilamentLibraryPlugin::isLibraryAdmin($user); }) ->schema([ TextInput::make('name') @@ -117,7 +119,7 @@ protected function getHeaderActions(): array } // At root level, only allow admins - return \Tapp\FilamentLibrary\FilamentLibraryPlugin::isLibraryAdmin($user); + return FilamentLibraryPlugin::isLibraryAdmin($user); }) ->schema([ FileUpload::make('file') @@ -167,7 +169,7 @@ protected function getHeaderActions(): array } // At root level, only allow admins - return \Tapp\FilamentLibrary\FilamentLibraryPlugin::isLibraryAdmin($user); + return FilamentLibraryPlugin::isLibraryAdmin($user); }) ->schema([ TextInput::make('name') @@ -211,13 +213,13 @@ protected function getHeaderActions(): array } // At root level, only allow admins - return \Tapp\FilamentLibrary\FilamentLibraryPlugin::isLibraryAdmin(auth()->user()); + return FilamentLibraryPlugin::isLibraryAdmin(auth()->user()); }); return $actions; } - protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder + protected function getTableQuery(): Builder { $query = parent::getTableQuery(); @@ -231,7 +233,7 @@ protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder $q->where('general_access', 'anyone_can_view'); // Admins can see all items (including private/inherit) - if ($user && \Tapp\FilamentLibrary\FilamentLibraryPlugin::isLibraryAdmin($user)) { + if ($user && FilamentLibraryPlugin::isLibraryAdmin($user)) { $q->orWhere(function ($adminQuery) { $adminQuery->whereIn('general_access', ['private', 'inherit']); }); diff --git a/src/Resources/Pages/MyLibrary.php b/src/Resources/Pages/MyLibrary.php index 86f8009..69b29b8 100644 --- a/src/Resources/Pages/MyLibrary.php +++ b/src/Resources/Pages/MyLibrary.php @@ -2,7 +2,13 @@ namespace Tapp\FilamentLibrary\Resources\Pages; +use Filament\Actions\Action; +use Filament\Actions\ActionGroup; +use Filament\Forms\Components\FileUpload; +use Filament\Forms\Components\TextInput; use Filament\Resources\Pages\ListRecords; +use Illuminate\Database\Eloquent\Builder; +use Tapp\FilamentLibrary\Models\LibraryItem; use Tapp\FilamentLibrary\Resources\LibraryItemResource; class MyLibrary extends ListRecords @@ -11,14 +17,14 @@ class MyLibrary extends ListRecords protected static ?string $title = 'My Library'; - protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder + protected function getTableQuery(): Builder { $query = parent::getTableQuery(); // Show only the current user's personal folder and its contents $user = auth()->user(); if ($user) { - $personalFolder = \Tapp\FilamentLibrary\Models\LibraryItem::getPersonalFolder($user); + $personalFolder = LibraryItem::getPersonalFolder($user); if ($personalFolder) { $query->where('parent_id', $personalFolder->id); @@ -56,12 +62,12 @@ protected function getHeaderActions(): array $actions = []; // Add "+ New" dropdown action group for personal library - $actions[] = \Filament\Actions\ActionGroup::make([ - \Filament\Actions\Action::make('create_folder') + $actions[] = ActionGroup::make([ + Action::make('create_folder') ->label('Create Folder') ->icon('heroicon-o-folder-plus') ->schema([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->label('Folder Name') ->required() ->maxLength(255) @@ -69,9 +75,9 @@ protected function getHeaderActions(): array ]) ->action(function (array $data): void { $user = auth()->user(); - $personalFolder = \Tapp\FilamentLibrary\Models\LibraryItem::ensurePersonalFolder($user); + $personalFolder = LibraryItem::ensurePersonalFolder($user); - \Tapp\FilamentLibrary\Models\LibraryItem::create([ + LibraryItem::create([ 'name' => $data['name'], 'type' => 'folder', 'parent_id' => $personalFolder->id, @@ -82,11 +88,11 @@ protected function getHeaderActions(): array $this->redirect(static::getResource()::getUrl('my-documents')); }), - \Filament\Actions\Action::make('upload_file') + Action::make('upload_file') ->label('Upload File') ->icon('heroicon-o-document-plus') ->schema([ - \Filament\Forms\Components\FileUpload::make('file') + FileUpload::make('file') ->label('Upload File') ->required() ->maxSize(512000) // 500MB @@ -97,11 +103,11 @@ protected function getHeaderActions(): array ]) ->action(function (array $data): void { $user = auth()->user(); - $personalFolder = \Tapp\FilamentLibrary\Models\LibraryItem::ensurePersonalFolder($user); + $personalFolder = LibraryItem::ensurePersonalFolder($user); $filePath = $data['file']; $fileName = basename($filePath); - $libraryItem = \Tapp\FilamentLibrary\Models\LibraryItem::create([ + $libraryItem = LibraryItem::create([ 'name' => $fileName, 'type' => 'file', 'parent_id' => $personalFolder->id, @@ -117,16 +123,16 @@ protected function getHeaderActions(): array $this->redirect(static::getResource()::getUrl('my-documents')); }), - \Filament\Actions\Action::make('create_link') + Action::make('create_link') ->label('Add External Link') ->icon('heroicon-o-link') ->schema([ - \Filament\Forms\Components\TextInput::make('name') + TextInput::make('name') ->label('Link Name') ->required() ->maxLength(255) ->placeholder('Enter link name'), - \Filament\Forms\Components\TextInput::make('url') + TextInput::make('url') ->label('URL') ->required() ->url() @@ -134,9 +140,9 @@ protected function getHeaderActions(): array ]) ->action(function (array $data): void { $user = auth()->user(); - $personalFolder = \Tapp\FilamentLibrary\Models\LibraryItem::ensurePersonalFolder($user); + $personalFolder = LibraryItem::ensurePersonalFolder($user); - \Tapp\FilamentLibrary\Models\LibraryItem::create([ + LibraryItem::create([ 'name' => $data['name'], 'type' => 'link', 'url' => $data['url'], diff --git a/src/Resources/Pages/PublicLibrary.php b/src/Resources/Pages/PublicLibrary.php index d2ca587..1227a00 100644 --- a/src/Resources/Pages/PublicLibrary.php +++ b/src/Resources/Pages/PublicLibrary.php @@ -3,6 +3,8 @@ namespace Tapp\FilamentLibrary\Resources\Pages; use Filament\Resources\Pages\ListRecords; +use Illuminate\Database\Eloquent\Builder; +use Tapp\FilamentLibrary\FilamentLibraryPlugin; use Tapp\FilamentLibrary\Resources\LibraryItemResource; class PublicLibrary extends ListRecords @@ -11,7 +13,7 @@ class PublicLibrary extends ListRecords protected static ?string $title = 'Public Library'; - protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder + protected function getTableQuery(): Builder { $query = parent::getTableQuery(); $user = auth()->user(); @@ -21,7 +23,7 @@ protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder $q->where('general_access', 'anyone_can_view'); // Admins can see all items (including private/inherit) - if ($user && \Tapp\FilamentLibrary\FilamentLibraryPlugin::isLibraryAdmin($user)) { + if ($user && FilamentLibraryPlugin::isLibraryAdmin($user)) { $q->orWhere(function ($adminQuery) { $adminQuery->whereIn('general_access', ['private', 'inherit']) ->whereNull('parent_id'); // Only root-level items diff --git a/src/Resources/Pages/SearchAll.php b/src/Resources/Pages/SearchAll.php index 4ac9574..219c14e 100644 --- a/src/Resources/Pages/SearchAll.php +++ b/src/Resources/Pages/SearchAll.php @@ -3,6 +3,7 @@ namespace Tapp\FilamentLibrary\Resources\Pages; use Filament\Resources\Pages\ListRecords; +use Illuminate\Database\Eloquent\Builder; use Tapp\FilamentLibrary\Resources\LibraryItemResource; class SearchAll extends ListRecords @@ -11,7 +12,7 @@ class SearchAll extends ListRecords protected static ?string $title = 'Search All'; - protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder + protected function getTableQuery(): Builder { $query = parent::getTableQuery(); diff --git a/src/Resources/Pages/SharedWithMe.php b/src/Resources/Pages/SharedWithMe.php index 5e3ae96..904572e 100644 --- a/src/Resources/Pages/SharedWithMe.php +++ b/src/Resources/Pages/SharedWithMe.php @@ -3,6 +3,7 @@ namespace Tapp\FilamentLibrary\Resources\Pages; use Filament\Resources\Pages\ListRecords; +use Illuminate\Database\Eloquent\Builder; use Tapp\FilamentLibrary\Resources\LibraryItemResource; class SharedWithMe extends ListRecords @@ -11,7 +12,7 @@ class SharedWithMe extends ListRecords protected static ?string $title = 'Shared with Me'; - protected function getTableQuery(): \Illuminate\Database\Eloquent\Builder + protected function getTableQuery(): Builder { $query = parent::getTableQuery(); diff --git a/src/Resources/Pages/ViewLibraryItem.php b/src/Resources/Pages/ViewLibraryItem.php index a7d742b..ab08d73 100644 --- a/src/Resources/Pages/ViewLibraryItem.php +++ b/src/Resources/Pages/ViewLibraryItem.php @@ -3,7 +3,10 @@ namespace Tapp\FilamentLibrary\Resources\Pages; use Filament\Actions\Action; +use Filament\Actions\DeleteAction; +use Filament\Actions\EditAction; use Filament\Infolists\Components\TextEntry; +use Filament\Infolists\Components\ViewEntry; use Filament\Resources\Pages\ViewRecord; use Filament\Schemas\Components\Grid; use Filament\Schemas\Components\Section; @@ -81,9 +84,9 @@ protected function getHeaderActions(): array ->openUrlInNewTab(); } - $actions[] = \Filament\Actions\EditAction::make() + $actions[] = EditAction::make() ->url(fn () => static::getResource()::getEditUrl($this->getRecord())); - $actions[] = \Filament\Actions\DeleteAction::make() + $actions[] = DeleteAction::make() ->before(function () { // Store parent_id before deletion $this->parentId = $this->getRecord()->parent_id; @@ -148,7 +151,7 @@ public function infolist(Schema $schema): Schema ->columnSpanFull(), // File preview for files - \Filament\Infolists\Components\ViewEntry::make('file_preview') + ViewEntry::make('file_preview') ->view('filament-library::infolists.components.file-preview') ->viewData(fn () => ['record' => $record]) ->visible(fn () => $record->type === 'file') diff --git a/src/Rules/UniqueTagName.php b/src/Rules/UniqueTagName.php index 5709148..ede38f5 100644 --- a/src/Rules/UniqueTagName.php +++ b/src/Rules/UniqueTagName.php @@ -3,6 +3,8 @@ namespace Tapp\FilamentLibrary\Rules; use Illuminate\Contracts\Validation\ValidationRule; +use Illuminate\Support\Str; +use Illuminate\Translation\PotentiallyTranslatedString; use Tapp\FilamentLibrary\Models\LibraryItemTag; class UniqueTagName implements ValidationRule @@ -10,7 +12,7 @@ class UniqueTagName implements ValidationRule /** * Run the validation rule. * - * @param \Closure(string, ?string=): \Illuminate\Translation\PotentiallyTranslatedString $fail + * @param \Closure(string, ?string=): PotentiallyTranslatedString $fail */ public function validate(string $attribute, mixed $value, \Closure $fail): void { @@ -18,7 +20,7 @@ public function validate(string $attribute, mixed $value, \Closure $fail): void return; } - $slug = \Illuminate\Support\Str::slug($value); + $slug = Str::slug($value); $existingTag = LibraryItemTag::where('slug', $slug)->first(); if ($existingTag) { diff --git a/src/Services/PermissionService.php b/src/Services/PermissionService.php index 899d69a..a88a5bc 100644 --- a/src/Services/PermissionService.php +++ b/src/Services/PermissionService.php @@ -2,8 +2,11 @@ namespace Tapp\FilamentLibrary\Services; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Cache; use Tapp\FilamentLibrary\Models\LibraryItem; +use Tapp\FilamentLibrary\Models\LibraryItemPermission; class PermissionService { @@ -50,7 +53,7 @@ public function assignPermission($user, LibraryItem $item, string $permission): default => 'viewer', }; - \Tapp\FilamentLibrary\Models\LibraryItemPermission::updateOrCreate( + LibraryItemPermission::updateOrCreate( [ 'library_item_id' => $item->id, 'user_id' => $user->id, @@ -70,7 +73,7 @@ public function assignPermission($user, LibraryItem $item, string $permission): */ public function removePermission($user, LibraryItem $item, string $permission): void { - \Tapp\FilamentLibrary\Models\LibraryItemPermission::where([ + LibraryItemPermission::where([ 'library_item_id' => $item->id, 'user_id' => $user->id, ])->delete(); @@ -96,7 +99,7 @@ public function bulkAssignPermissions($items, array $data): void // Assign permissions to users foreach ($userIds as $userId) { $userModel = $this->getUserModel(); - /** @var \Illuminate\Database\Eloquent\Model $user */ + /** @var Model $user */ $user = $userModel::find($userId); if ($user) { $this->assignPermission( @@ -119,7 +122,7 @@ public function cascadePermissionsToChildren(LibraryItem $folder, array $userIds foreach ($children as $child) { foreach ($userIds as $userId) { $userModel = $this->getUserModel(); - /** @var \Illuminate\Database\Eloquent\Model $user */ + /** @var Model $user */ $user = $userModel::find($userId); if ($user) { $this->assignPermission( @@ -140,7 +143,7 @@ public function cascadePermissionsToChildren(LibraryItem $folder, array $userIds /** * Get all users who have permissions on an item. */ - public function getUsersWithPermissions(LibraryItem $item): \Illuminate\Support\Collection + public function getUsersWithPermissions(LibraryItem $item): Collection { return $item->permissions() ->with('user') diff --git a/src/Tables/Actions/BulkManagePermissionsAction.php b/src/Tables/Actions/BulkManagePermissionsAction.php index 0c33c68..cf47b61 100644 --- a/src/Tables/Actions/BulkManagePermissionsAction.php +++ b/src/Tables/Actions/BulkManagePermissionsAction.php @@ -10,6 +10,7 @@ use Filament\Actions\BulkAction; use Filament\Forms\Components\Placeholder; use Filament\Forms\Components\Select; +use Filament\Notifications\Notification; use Illuminate\Database\Eloquent\Collection; use Tapp\FilamentLibrary\FilamentLibraryPlugin; use Tapp\FilamentLibrary\Forms\Components\UserSearchSelect; @@ -76,7 +77,7 @@ protected function setUp(): void public function success(): void { - \Filament\Notifications\Notification::make() + Notification::make() ->title('Permissions Updated') ->body('Permissions have been successfully updated for the selected items.') ->success()