summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Functions/FunctionsEdit.php2
-rw-r--r--app/Http/Controllers/EditGedcomRecordController.php2
-rw-r--r--app/Http/Controllers/HomePageController.php4
-rw-r--r--app/Module/ChartsBlockModule.php8
-rw-r--r--app/Module/CookieWarningModule.php2
-rw-r--r--app/Place.php2
-rw-r--r--app/Services/ModuleService.php73
-rw-r--r--app/Statistics/Repository/FavoritesRepository.php8
-rw-r--r--resources/views/media-page-menu.phtml2
-rw-r--r--resources/views/modules/ckeditor/ckeditor-js.phtml2
-rw-r--r--tests/app/Services/ModuleServiceTest.php32
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'));
}
/**