diff options
| -rw-r--r-- | app/Functions/FunctionsEdit.php | 2 | ||||
| -rw-r--r-- | app/Http/Controllers/EditGedcomRecordController.php | 2 | ||||
| -rw-r--r-- | app/Http/Controllers/HomePageController.php | 4 | ||||
| -rw-r--r-- | app/Module/ChartsBlockModule.php | 8 | ||||
| -rw-r--r-- | app/Module/CookieWarningModule.php | 2 | ||||
| -rw-r--r-- | app/Place.php | 2 | ||||
| -rw-r--r-- | app/Services/ModuleService.php | 73 | ||||
| -rw-r--r-- | app/Statistics/Repository/FavoritesRepository.php | 8 | ||||
| -rw-r--r-- | resources/views/media-page-menu.phtml | 2 | ||||
| -rw-r--r-- | resources/views/modules/ckeditor/ckeditor-js.phtml | 2 | ||||
| -rw-r--r-- | tests/app/Services/ModuleServiceTest.php | 32 |
11 files changed, 59 insertions, 78 deletions
diff --git a/app/Functions/FunctionsEdit.php b/app/Functions/FunctionsEdit.php index a06ba2efbd..b757b26286 100644 --- a/app/Functions/FunctionsEdit.php +++ b/app/Functions/FunctionsEdit.php @@ -582,7 +582,7 @@ class FunctionsEdit 'census_places' => Census::censusPlaces(WT_LOCALE), ]); - $census_assistant = app(ModuleService::class)->findByClass(CensusAssistantModule::class); + $census_assistant = app(ModuleService::class)->findByInterface(CensusAssistantModule::class); $record = Individual::getInstance($xref, $tree); if ($census_assistant instanceof CensusAssistantModule && $record instanceof Individual) { diff --git a/app/Http/Controllers/EditGedcomRecordController.php b/app/Http/Controllers/EditGedcomRecordController.php index ee776dfb4b..0a31b9d1b3 100644 --- a/app/Http/Controllers/EditGedcomRecordController.php +++ b/app/Http/Controllers/EditGedcomRecordController.php @@ -443,7 +443,7 @@ class EditGedcomRecordController extends AbstractEditController $newged = trim($newged); // Remove leading newline - $census_assistant = $this->module_service->findByClass(CensusAssistantModule::class); + $census_assistant = $this->module_service->findByInterface(CensusAssistantModule::class); if ($census_assistant instanceof CensusAssistantModule && $record instanceof Individual) { $newged = $census_assistant->updateCensusAssistant($request, $record, $fact_id, $newged, $keep_chan); } diff --git a/app/Http/Controllers/HomePageController.php b/app/Http/Controllers/HomePageController.php index 319311535e..b4bbf1a03d 100644 --- a/app/Http/Controllers/HomePageController.php +++ b/app/Http/Controllers/HomePageController.php @@ -722,7 +722,7 @@ class HomePageController extends AbstractBaseController if (!$has_blocks) { foreach (['main', 'side'] as $location) { foreach (self::DEFAULT_TREE_PAGE_BLOCKS[$location] as $block_order => $class) { - $module_name = $this->module_service->findByClass($class)->name(); + $module_name = $this->module_service->findByInterface($class)->name(); DB::table('block')->insert([ 'gedcom_id' => -1, @@ -769,7 +769,7 @@ class HomePageController extends AbstractBaseController if (!$has_blocks) { foreach (['main', 'side'] as $location) { foreach (self::DEFAULT_USER_PAGE_BLOCKS[$location] as $block_order => $class) { - $module_name = $this->module_service->findByClass($class)->name(); + $module_name = $this->module_service->findByInterface($class)->name(); DB::table('block')->insert([ 'user_id' => -1, diff --git a/app/Module/ChartsBlockModule.php b/app/Module/ChartsBlockModule.php index b48793bfe9..732283a893 100644 --- a/app/Module/ChartsBlockModule.php +++ b/app/Module/ChartsBlockModule.php @@ -103,7 +103,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleBlockInterface default: case 'pedigree': /** @var PedigreeChartModule $module */ - $module = $this->module_service->findByClass(PedigreeChartModule::class); + $module = $this->module_service->findByInterface(PedigreeChartModule::class); $title = $module->chartTitle($person); $chart_url = $module->chartUrl($person, [ 'ajax' => true, @@ -118,7 +118,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleBlockInterface case 'descendants': /** @var DescendancyChartModule $module */ - $module = $this->module_service->findByClass(DescendancyChartModule::class); + $module = $this->module_service->findByInterface(DescendancyChartModule::class); $title = $module->chartTitle($person); $chart_url = $module->chartUrl($person, [ 'ajax' => true, @@ -133,7 +133,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleBlockInterface case 'hourglass': /** @var HourglassChartModule $module */ - $module = $this->module_service->findByClass(HourglassChartModule::class); + $module = $this->module_service->findByInterface(HourglassChartModule::class); $title = $module->chartTitle($person); $chart_url = $module->chartUrl($person, [ 'ajax' => true, @@ -147,7 +147,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleBlockInterface case 'treenav': /** @var InteractiveTreeModule $module */ - $module = $this->module_service->findByClass(InteractiveTreeModule::class); + $module = $this->module_service->findByInterface(InteractiveTreeModule::class); $title = I18N::translate('Interactive tree of %s', $person->fullName()); $tv = new TreeView(); $content = '<script>$("head").append(\'<link rel="stylesheet" href="' . $module->css() . '" type="text/css" />\');</script>'; diff --git a/app/Module/CookieWarningModule.php b/app/Module/CookieWarningModule.php index 1242eda880..95a9e552fc 100644 --- a/app/Module/CookieWarningModule.php +++ b/app/Module/CookieWarningModule.php @@ -126,7 +126,7 @@ class CookieWarningModule extends AbstractModule implements ModuleFooterInterfac } foreach (self::TRACKING_MODULES as $class) { - $module = $this->module_service->findByClass($class); + $module = $this->module_service->findByInterface($class); if ($module instanceof ModuleAnalyticsInterface) { if ($module->analyticsCanShow()) { diff --git a/app/Place.php b/app/Place.php index 84f308d79b..a1487f02c9 100644 --- a/app/Place.php +++ b/app/Place.php @@ -47,7 +47,7 @@ class Place public function __construct(string $place_name, Tree $tree) { // Ignore any empty parts in place names such as "Village, , , Country". - $this->parts = (new Collection(preg_split(Gedcom::PLACE_SEPARATOR_REGEX, $place_name))) + $this->parts = Collection::make(preg_split(Gedcom::PLACE_SEPARATOR_REGEX, $place_name)) ->filter(); // Rebuild the placename in the correct format. diff --git a/app/Services/ModuleService.php b/app/Services/ModuleService.php index c278f634da..98b00cec18 100644 --- a/app/Services/ModuleService.php +++ b/app/Services/ModuleService.php @@ -273,15 +273,14 @@ class ModuleService */ private function coreModules(): Collection { - $modules = new Collection(self::CORE_MODULES); + return Collection::make(self::CORE_MODULES) + ->map(function (string $class, string $name): ModuleInterface { + $module = app()->make($class); - return $modules->map(function (string $class, string $name): ModuleInterface { - $module = app()->make($class); + $module->setName($name); - $module->setName($name); - - return $module; - }); + return $module; + }); } /** @@ -294,7 +293,7 @@ class ModuleService $pattern = WT_ROOT . Webtrees::MODULES_PATH . '*/module.php'; $filenames = glob($pattern); - return (new Collection($filenames)) + return Collection::make($filenames) ->filter(function (string $filename): bool { // Special characters will break PHP variable names. // This also allows us to ignore modules called "foo.example" and "foo.disable" @@ -452,6 +451,34 @@ class ModuleService } /** + * A function filter modules by type + * + * @param string $interface + * + * @return Closure + */ + private function interfaceFilter(string $interface): Closure + { + return function (ModuleInterface $module) use ($interface): bool { + return $module instanceof $interface; + }; + } + + /** + * A function filter modules by enabled/disabled + * + * @param bool $include_disabled + * + * @return Closure + */ + private function enabledFilter(bool $include_disabled): Closure + { + return function (ModuleInterface $module) use ($include_disabled): bool { + return $include_disabled || $module->isEnabled(); + }; + } + + /** * A function to convert modules into their titles - to create option lists, etc. * * @return Closure @@ -491,12 +518,8 @@ class ModuleService public function findByInterface(string $interface, $include_disabled = false): Collection { $modules = $this->all() - ->filter(function (ModuleInterface $module) use ($interface): bool { - return $module instanceof $interface; - }) - ->filter(function (ModuleInterface $module) use ($include_disabled): bool { - return $include_disabled || $module->isEnabled(); - }); + ->filter($this->interfaceFilter($interface)) + ->filter($this->enabledFilter($include_disabled)); switch ($interface) { case ModuleFooterInterface::class: @@ -519,30 +542,16 @@ class ModuleService * Find a specified module, if it is currently active. * * @param string $module_name + * @param bool $include_disabled * * @return ModuleInterface|null */ - public function findByName(string $module_name): ?ModuleInterface + public function findByName(string $module_name, bool $include_disabled = false): ?ModuleInterface { return $this->all() + ->filter($this->enabledFilter($include_disabled)) ->filter(function (ModuleInterface $module) use ($module_name): bool { - return $module->isEnabled() && $module->name() === $module_name; - }) - ->first(); - } - - /** - * Find a specified module, if it is currently active. - * - * @param string $class_name - * - * @return ModuleInterface|null - */ - public function findByClass(string $class_name): ?ModuleInterface - { - return $this->all() - ->filter(function (ModuleInterface $module) use ($class_name): bool { - return $module->isEnabled() && $module instanceof $class_name; + return $module->name() === $module_name; }) ->first(); } diff --git a/app/Statistics/Repository/FavoritesRepository.php b/app/Statistics/Repository/FavoritesRepository.php index 64b8bada5d..6151bbe7de 100644 --- a/app/Statistics/Repository/FavoritesRepository.php +++ b/app/Statistics/Repository/FavoritesRepository.php @@ -58,7 +58,7 @@ class FavoritesRepository implements FavoritesRepositoryInterface public function gedcomFavorites(): string { $module = $this->module_service - ->findByClass(FamilyTreeFavoritesModule::class); + ->findByInterface(FamilyTreeFavoritesModule::class); if ($module instanceof FamilyTreeFavoritesModule) { return $module->getBlock($this->tree, 0); @@ -73,7 +73,7 @@ class FavoritesRepository implements FavoritesRepositoryInterface public function userFavorites(): string { $module = $this->module_service - ->findByClass(UserFavoritesModule::class); + ->findByInterface(UserFavoritesModule::class); if ($module instanceof UserFavoritesModule) { return $module->getBlock($this->tree, 0); @@ -89,7 +89,7 @@ class FavoritesRepository implements FavoritesRepositoryInterface { $count = 0; $module = $this->module_service - ->findByClass(FamilyTreeFavoritesModule::class); + ->findByInterface(FamilyTreeFavoritesModule::class); if ($module instanceof FamilyTreeFavoritesModule) { $count = \count($module->getFavorites($this->tree)); @@ -105,7 +105,7 @@ class FavoritesRepository implements FavoritesRepositoryInterface { $count = 0; $module = $this->module_service - ->findByClass(UserFavoritesModule::class); + ->findByInterface(UserFavoritesModule::class); if ($module instanceof UserFavoritesModule) { $count = \count($module->getFavorites($this->tree, Auth::user())); diff --git a/resources/views/media-page-menu.phtml b/resources/views/media-page-menu.phtml index 44c91a0121..db15244f43 100644 --- a/resources/views/media-page-menu.phtml +++ b/resources/views/media-page-menu.phtml @@ -10,7 +10,7 @@ </button> <div class="dropdown-menu dropdown-menu-right wt-page-menu-items" aria-labelledby="page-menu"> - <?php if (false && app()->make(ModuleService::class)->findByClass(CensusAssistantModule::class)) : ?> + <?php if (false && app()->make(ModuleService::class)->findByInterface(CensusAssistantModule::class)) : ?> <a class="dropdown-item menu-obje-link" href="#" onclick="return ilinkitem('<?= e($record->xref()) ?>','manage','<?= e($record->tree()->name()) ?>');"> <?= I18N::translate('Manage the links') ?> </a> diff --git a/resources/views/modules/ckeditor/ckeditor-js.phtml b/resources/views/modules/ckeditor/ckeditor-js.phtml index 23c8af91e7..96d6dd3a6b 100644 --- a/resources/views/modules/ckeditor/ckeditor-js.phtml +++ b/resources/views/modules/ckeditor/ckeditor-js.phtml @@ -2,7 +2,7 @@ <?php use Fisharebest\Webtrees\Services\ModuleService; ?> <?php use Fisharebest\Webtrees\View; ?> -<?php if (app()->make(ModuleService::class)->findByClass(CkeditorModule::class)): ?> +<?php if (app()->make(ModuleService::class)->findByInterface(CkeditorModule::class)): ?> <?php View::push('javascript') ?> <script src="<?= e(CkeditorModule::CKEDITOR_PATH) ?>ckeditor.js"></script> <script src="<?= e(CkeditorModule::CKEDITOR_PATH) ?>adapters/jquery.js"></script> diff --git a/tests/app/Services/ModuleServiceTest.php b/tests/app/Services/ModuleServiceTest.php index eda133a668..d4588f3726 100644 --- a/tests/app/Services/ModuleServiceTest.php +++ b/tests/app/Services/ModuleServiceTest.php @@ -104,36 +104,8 @@ class ModuleServiceTest extends TestCase $this->assertNotEmpty($module_service->findByInterface(ModuleTabInterface::class)->all()); $this->assertNotEmpty($module_service->findByInterface(ModuleThemeInterface::class)->all()); - // THe core modules do not contain any of these. - $this->assertEmpty($module_service->findByInterface(ModuleHistoricEventsInterface::class)->all()); - } - - /** - * @covers \Fisharebest\Webtrees\Services\ModuleService::findByClass - * @return void - */ - public function testFindByClass(): void - { - app()->instance(Tree::class, Tree::create('name', 'title')); - - $module_service = new ModuleService(); - - $this->assertNull($module_service->findByClass('not-a-valid-class-name')); - $this->assertInstanceOf(TreesMenuModule::class, $module_service->findByClass(TreesMenuModule::class)); - } - - /** - * @covers \Fisharebest\Webtrees\Services\ModuleService::findByName - * @return void - */ - public function testFindByName(): void - { - app()->instance(Tree::class, Tree::create('name', 'title')); - - $module_service = new ModuleService(); - - $this->assertNull($module_service->findByName('not-a-valid-module-name')); - $this->assertInstanceOf(TreesMenuModule::class, $module_service->findByName('trees-menu')); + // Search for an invalid module type + $this->assertNull($module_service->findByInterface('not-a-valid-class-or-interface')); } /** |
