getFilenameWithoutExtension(); $class = 'App\\Api\\Plugins\\' . $filename; if (class_exists($class) && in_array(ApiPluginInterface::class, class_implements($class))) { try { $apiProvider = ApiProvider::where('plugin', $filename)->first(); if(!$apiProvider) continue; $instance = new $class($apiProvider); $plugins->add(new Plugin([ 'id' => $instance->getIdentifier(), 'name' => $instance->getName(), 'identifier' => $instance->getIdentifier(), 'enabled' => $instance->isEnabled(), 'file_path' => $file->getPathname(), ])); } catch (\Exception $e) { // Log error or handle gracefully if a plugin cannot be instantiated // For now, we'll just skip it } } } } return $table ->query(Plugin::query()->setCollection($plugins)) ->columns([ TextColumn::make('name') ->label('Name') ->searchable() ->sortable(), TextColumn::make('identifier') ->label('Identifier'), IconColumn::make('enabled') ->label('Enabled') ->boolean(), TextColumn::make('file_path') ->label('File Path') ->toggleable(isToggledHiddenByDefault: true), ]) ->actions([ Action::make('toggle_enabled') ->label(fn ($record) => $record->enabled ? 'Disable' : 'Enable') ->icon(fn ($record) => $record->enabled ? 'heroicon-o-x-circle' : 'heroicon-o-check-circle') ->action(function ($record) { try { $apiProvider = ApiProvider::where('plugin', $record->identifier)->first(); if(!$apiProvider) throw new \Exception('ApiProvider not found'); $pluginClass = 'App\\Api\\Plugins\\' . $record->identifier; $plugin = new $pluginClass($apiProvider); if ($record->enabled) { $plugin->disable(); } else { $plugin->enable(); } Notification::make() ->title('Plugin status updated') ->success() ->send(); } catch (\Exception $e) { Notification::make() ->title('Error updating plugin status') ->body($e->getMessage()) ->danger() ->send(); } }), Action::make('delete') ->label('Delete') ->icon('heroicon-o-trash') ->color('danger') ->requiresConfirmation() ->action(function ($record) { try { File::delete($record->file_path); Notification::make() ->title('Plugin deleted successfully') ->success() ->send(); } catch (\Exception $e) { Notification::make() ->title('Error deleting plugin') ->body($e->getMessage()) ->danger() ->send(); } }), ]) ->bulkActions([ // No bulk actions for now ]); } // Removed getTableRecords() as data is now provided via query() }