diff --git a/modules/backend/classes/WidgetManager.php b/modules/backend/classes/WidgetManager.php index 5027b2009..6dad9e913 100644 --- a/modules/backend/classes/WidgetManager.php +++ b/modules/backend/classes/WidgetManager.php @@ -2,6 +2,7 @@ use Str; use System\Classes\PluginManager; +use Event; /** * Widget manager @@ -188,6 +189,11 @@ class WidgetManager } } + /* + * Extensibility + */ + Event::fire('system.reportwidgets.extendItems', [$this]); + return $this->reportWidgets; } @@ -215,4 +221,19 @@ class WidgetManager { $this->reportWidgetCallbacks[] = $definitions; } + + /** + * Remove a registered ReportWidget. + * @param string $className Widget class name. + * @return void + */ + public function removeReportWidget($className) + { + if (!$this->reportWidgets) { + throw new SystemException('Unable to remove a widget before widgets are loaded.'); + } + + unset($this->reportWidgets[$className]); + } + } diff --git a/tests/unit/backend/classes/WidgetManagerTest.php b/tests/unit/backend/classes/WidgetManagerTest.php index 83c0d334e..5e88096ae 100644 --- a/tests/unit/backend/classes/WidgetManagerTest.php +++ b/tests/unit/backend/classes/WidgetManagerTest.php @@ -13,4 +13,36 @@ class WidgetManagerTest extends TestCase $this->assertArrayHasKey('TestVendor\Test\FormWidgets\Sample', $widgets); $this->assertArrayHasKey('October\Tester\FormWidgets\Preview', $widgets); } + + public function testIfWidgetsCanBeExtended() + { + $manager = WidgetManager::instance(); + $manager->registerReportWidget('Acme\Fake\ReportWidget\HelloWorld', [ + 'name' => 'Hello World Test', + 'context' => 'dashboard' + ]); + $widgets = $manager->listReportWidgets(); + + $this->assertArrayHasKey('Acme\Fake\ReportWidget\HelloWorld', $widgets); + } + + public function testIfWidgetsCanBeRemoved() + { + $manager = WidgetManager::instance(); + $manager->registerReportWidget('Acme\Fake\ReportWidget\HelloWorld', [ + 'name' => 'Hello World Test', + 'context' => 'dashboard' + ]); + $manager->registerReportWidget('Acme\Fake\ReportWidget\ByeWorld', [ + 'name' => 'Hello World Bye', + 'context' => 'dashboard' + ]); + + $manager->removeReportWidget('Acme\Fake\ReportWidget\ByeWorld'); + + $widgets = $manager->listReportWidgets(); + + $this->assertCount(1, $widgets); + } + }