Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions database/seeders/LibrarySeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.');
Expand Down Expand Up @@ -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...');
Expand Down
9 changes: 6 additions & 3 deletions src/FilamentLibraryPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
{
Expand Down Expand Up @@ -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);
});
}

Expand Down
3 changes: 2 additions & 1 deletion src/FilamentLibraryServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down
21 changes: 12 additions & 9 deletions src/Models/LibraryItem.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -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<int, LibraryItem> $children
* @property-read \Illuminate\Database\Eloquent\Model $creator
* @property-read \Illuminate\Database\Eloquent\Model|null $updater
* @property-read \Illuminate\Database\Eloquent\Collection<int, LibraryItemPermission> $permissions
* @property-read \Illuminate\Database\Eloquent\Collection<int, LibraryItemTag> $tags
* @property-read Collection<int, LibraryItem> $children
* @property-read Model $creator
* @property-read Model|null $updater
* @property-read Collection<int, LibraryItemPermission> $permissions
* @property-read Collection<int, LibraryItemTag> $tags
*/
class LibraryItem extends Model implements HasMedia
{
Expand Down Expand Up @@ -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;
}

Expand Down
7 changes: 4 additions & 3 deletions src/Models/LibraryItemPermission.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,18 @@
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;

/**
* @property int $id
* @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
{
Expand Down
9 changes: 6 additions & 3 deletions src/Models/Traits/BelongsToTenant.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

namespace Tapp\FilamentLibrary\Models\Traits;

use Filament\Facades\Filament;
use Illuminate\Database\Eloquent\Model;

trait BelongsToTenant
{
/**
Expand Down Expand Up @@ -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
Expand All @@ -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<Model> $parentItemClass */
$parentItem = $parentItemClass::find($parentItemId);

if ($parentItem) {
Expand Down
33 changes: 25 additions & 8 deletions src/Resources/LibraryItemResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -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',
Expand All @@ -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),
Expand All @@ -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)
Expand Down Expand Up @@ -167,6 +172,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;
Expand Down Expand Up @@ -347,7 +364,7 @@ public static function table(Table $table): Table
public static function getRelations(): array
{
return [
\Tapp\FilamentLibrary\Resources\RelationManagers\LibraryItemPermissionsRelationManager::class,
LibraryItemPermissionsRelationManager::class,
];
}

Expand Down
6 changes: 4 additions & 2 deletions src/Resources/Pages/CreatedByMe.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
31 changes: 20 additions & 11 deletions src/Resources/Pages/EditFile.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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) {
Expand Down
Loading