44
55use Filament \Contracts \Plugin ;
66use Filament \Panel ;
7+ use Filament \Resources \Resource ;
8+ use InvalidArgumentException ;
79use Tapp \FilamentFormBuilder \FilamentFormBuilderPlugin ;
810use Tapp \FilamentLms \Pages \CreateRubric ;
911use 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}
0 commit comments