Skip to content

Commit 7fd0c30

Browse files
authored
Merge pull request #104 from TappNetwork/configurable_resource
Add configurable resources
2 parents 66b9793 + 7a805b7 commit 7fd0c30

4 files changed

Lines changed: 120 additions & 16 deletions

File tree

config/filament-lms.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,25 @@
133133
'material_select_limit' => 200,
134134
],
135135
],
136+
137+
/*
138+
|--------------------------------------------------------------------------
139+
| Filament resource class overrides
140+
|--------------------------------------------------------------------------
141+
|
142+
| Optional map of short keys to custom Filament Resource classes
143+
| Only keys listed below are recognized; each value must
144+
| be a class extending Filament\Resources\Resource.
145+
|
146+
| Example (in your app's config/filament-lms.php):
147+
|
148+
| 'resources' => [
149+
| 'CourseResource' => \App\Filament\Resources\Lms\CourseResource::class,
150+
| ],
151+
|
152+
| Keys: CourseResource, LessonResource, StepResource, VideoResource, DocumentResource,
153+
| LinkResource, TestResource, ImageResource, CreditCategoryResource (when credits_enabled).
154+
|
155+
*/
156+
'resources' => [],
136157
];

src/Lms.php

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use Filament\Contracts\Plugin;
66
use Filament\Panel;
7+
use Filament\Resources\Resource;
8+
use InvalidArgumentException;
79
use Tapp\FilamentFormBuilder\FilamentFormBuilderPlugin;
810
use Tapp\FilamentLms\Pages\CreateRubric;
911
use Tapp\FilamentLms\Pages\Reporting;
@@ -27,22 +29,7 @@ public function getId(): string
2729

2830
public function register(Panel $panel): void
2931
{
30-
$resources = [
31-
CourseResource::class,
32-
LessonResource::class,
33-
StepResource::class,
34-
VideoResource::class,
35-
DocumentResource::class,
36-
LinkResource::class,
37-
TestResource::class,
38-
ImageResource::class,
39-
];
40-
41-
if (config('filament-lms.credits_enabled', false)) {
42-
$resources[] = CreditCategoryResource::class;
43-
}
44-
45-
$panel->resources($resources);
32+
$panel->resources(self::registeredResourceClasses());
4633

4734
$panel->pages([
4835
Reporting::class,
@@ -68,4 +55,55 @@ public static function get(): static
6855
{
6956
return filament(app(static::class)->getId());
7057
}
58+
59+
/**
60+
* Filament resource classes registered by this plugin, after merging `filament-lms.resources` overrides.
61+
*
62+
* Class strings are unique so Filament does not register the same resource twice (duplicate nav, routes).
63+
*
64+
* @return list<class-string<resource>>
65+
*/
66+
public static function registeredResourceClasses(): array
67+
{
68+
$defaults = [
69+
'CourseResource' => CourseResource::class,
70+
'LessonResource' => LessonResource::class,
71+
'StepResource' => StepResource::class,
72+
'VideoResource' => VideoResource::class,
73+
'DocumentResource' => DocumentResource::class,
74+
'LinkResource' => LinkResource::class,
75+
'TestResource' => TestResource::class,
76+
'ImageResource' => ImageResource::class,
77+
'CreditCategoryResource' => CreditCategoryResource::class,
78+
];
79+
80+
/** @var array<string, mixed> $overrides */
81+
$overrides = config('filament-lms.resources', []);
82+
83+
$classes = [];
84+
85+
foreach ($defaults as $key => $defaultClass) {
86+
if ($key === 'CreditCategoryResource' && ! config('filament-lms.credits_enabled', false)) {
87+
continue;
88+
}
89+
90+
$class = array_key_exists($key, $overrides) ? $overrides[$key] : $defaultClass;
91+
92+
if (! is_string($class) || $class === '') {
93+
throw new InvalidArgumentException("filament-lms.resources.{$key} must be a non-empty class-string.");
94+
}
95+
96+
if (! class_exists($class)) {
97+
throw new InvalidArgumentException("filament-lms.resources.{$key} class [{$class}] does not exist.");
98+
}
99+
100+
if (! is_subclass_of($class, Resource::class)) {
101+
throw new InvalidArgumentException("filament-lms.resources.{$key} class [{$class}] must extend ".Resource::class.'.');
102+
}
103+
104+
$classes[] = $class;
105+
}
106+
107+
return array_values(array_unique($classes));
108+
}
71109
}

tests/Pest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515

1616
pest()->extend(TestCase::class)->in('Feature');
17+
pest()->extend(TestCase::class)->in('Unit');
1718

1819
/*
1920
|--------------------------------------------------------------------------
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Tapp\FilamentLms\Lms;
6+
use Tapp\FilamentLms\Resources\CourseResource;
7+
use Tapp\FilamentLms\Resources\CreditCategoryResource;
8+
use Tapp\FilamentLms\Resources\LessonResource;
9+
10+
test('registeredResourceClasses includes package CourseResource by default', function () {
11+
config(['filament-lms.resources' => []]);
12+
13+
expect(Lms::registeredResourceClasses())->toContain(CourseResource::class);
14+
});
15+
16+
test('registeredResourceClasses respects CourseResource override from config', function () {
17+
config(['filament-lms.resources' => [
18+
'CourseResource' => LessonResource::class,
19+
]]);
20+
21+
$classes = Lms::registeredResourceClasses();
22+
23+
expect($classes)->not->toContain(CourseResource::class);
24+
expect($classes)->toContain(LessonResource::class);
25+
expect(array_count_values($classes)[LessonResource::class] ?? 0)->toBe(1);
26+
});
27+
28+
test('registeredResourceClasses omits CreditCategoryResource when credits disabled', function () {
29+
config([
30+
'filament-lms.credits_enabled' => false,
31+
'filament-lms.resources' => [],
32+
]);
33+
34+
expect(Lms::registeredResourceClasses())->not->toContain(CreditCategoryResource::class);
35+
});
36+
37+
test('registeredResourceClasses includes CreditCategoryResource when credits enabled', function () {
38+
config([
39+
'filament-lms.credits_enabled' => true,
40+
'filament-lms.resources' => [],
41+
]);
42+
43+
expect(Lms::registeredResourceClasses())->toContain(CreditCategoryResource::class);
44+
});

0 commit comments

Comments
 (0)