summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/Http/Controllers/Admin/ModuleController.php701
-rw-r--r--app/Http/RequestHandlers/AbstractModuleComponentAction.php146
-rw-r--r--app/Http/RequestHandlers/AbstractModuleComponentPage.php96
-rw-r--r--app/Http/RequestHandlers/ModuleAction.php2
-rw-r--r--app/Http/RequestHandlers/ModuleDeleteSettings.php77
-rw-r--r--app/Http/RequestHandlers/ModulesAllAction.php79
-rw-r--r--app/Http/RequestHandlers/ModulesAllPage.php64
-rw-r--r--app/Http/RequestHandlers/ModulesAnalyticsAction.php49
-rw-r--r--app/Http/RequestHandlers/ModulesAnalyticsPage.php48
-rw-r--r--app/Http/RequestHandlers/ModulesBlocksAction.php50
-rw-r--r--app/Http/RequestHandlers/ModulesBlocksPage.php51
-rw-r--r--app/Http/RequestHandlers/ModulesChartsAction.php50
-rw-r--r--app/Http/RequestHandlers/ModulesChartsPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesDataFixesAction.php49
-rw-r--r--app/Http/RequestHandlers/ModulesDataFixesPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesFootersAction.php51
-rw-r--r--app/Http/RequestHandlers/ModulesFootersPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesHistoricEventsAction.php49
-rw-r--r--app/Http/RequestHandlers/ModulesHistoricEventsPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesLanguagesAction.php49
-rw-r--r--app/Http/RequestHandlers/ModulesLanguagesPage.php48
-rw-r--r--app/Http/RequestHandlers/ModulesListsAction.php50
-rw-r--r--app/Http/RequestHandlers/ModulesListsPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesMenusAction.php51
-rw-r--r--app/Http/RequestHandlers/ModulesMenusPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesReportsAction.php50
-rw-r--r--app/Http/RequestHandlers/ModulesReportsPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesSidebarsAction.php51
-rw-r--r--app/Http/RequestHandlers/ModulesSidebarsPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesTabsAction.php51
-rw-r--r--app/Http/RequestHandlers/ModulesTabsPage.php47
-rw-r--r--app/Http/RequestHandlers/ModulesThemesAction.php50
-rw-r--r--app/Http/RequestHandlers/ModulesThemesPage.php47
-rw-r--r--app/Http/Routes/WebRoutes.php87
-rw-r--r--app/Module/RelationshipsChartModule.php2
-rw-r--r--app/Services/ModuleService.php12
36 files changed, 1793 insertions, 740 deletions
diff --git a/app/Http/Controllers/Admin/ModuleController.php b/app/Http/Controllers/Admin/ModuleController.php
deleted file mode 100644
index e82b914da9..0000000000
--- a/app/Http/Controllers/Admin/ModuleController.php
+++ /dev/null
@@ -1,701 +0,0 @@
-<?php
-
-/**
- * webtrees: online genealogy
- * Copyright (C) 2019 webtrees development team
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-declare(strict_types=1);
-
-namespace Fisharebest\Webtrees\Http\Controllers\Admin;
-
-use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\FlashMessages;
-use Fisharebest\Webtrees\I18N;
-use Fisharebest\Webtrees\Module\ModuleAnalyticsInterface;
-use Fisharebest\Webtrees\Module\ModuleBlockInterface;
-use Fisharebest\Webtrees\Module\ModuleChartInterface;
-use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
-use Fisharebest\Webtrees\Module\ModuleFooterInterface;
-use Fisharebest\Webtrees\Module\ModuleHistoricEventsInterface;
-use Fisharebest\Webtrees\Module\ModuleInterface;
-use Fisharebest\Webtrees\Module\ModuleLanguageInterface;
-use Fisharebest\Webtrees\Module\ModuleListInterface;
-use Fisharebest\Webtrees\Module\ModuleMenuInterface;
-use Fisharebest\Webtrees\Module\ModuleReportInterface;
-use Fisharebest\Webtrees\Module\ModuleSidebarInterface;
-use Fisharebest\Webtrees\Module\ModuleTabInterface;
-use Fisharebest\Webtrees\Module\ModuleThemeInterface;
-use Fisharebest\Webtrees\Services\ModuleService;
-use Fisharebest\Webtrees\Services\TreeService;
-use Illuminate\Database\Capsule\Manager as DB;
-use Illuminate\Support\Collection;
-use Psr\Http\Message\ResponseInterface;
-use Psr\Http\Message\ServerRequestInterface;
-
-use function array_flip;
-use function in_array;
-use function redirect;
-use function route;
-use function view;
-
-/**
- * Controller for configuring the modules.
- */
-class ModuleController extends AbstractAdminController
-{
- /** @var ModuleService */
- private $module_service;
-
- /** @var TreeService */
- private $tree_service;
-
- /**
- * ModuleController constructor.
- *
- * @param ModuleService $module_service
- * @param TreeService $tree_service
- */
- public function __construct(ModuleService $module_service, TreeService $tree_service)
- {
- $this->module_service = $module_service;
- $this->tree_service = $tree_service;
- }
-
- /**
- * Show the administrator a list of modules.
- *
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function list(ServerRequestInterface $request): ResponseInterface
- {
- return $this->viewResponse('admin/modules', [
- 'title' => I18N::translate('All modules'),
- 'modules' => $this->module_service->all(true),
- 'deleted_modules' => $this->module_service->deletedModules(),
- ]);
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listAnalytics(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleAnalyticsInterface::class,
- I18N::translate('Tracking and analytics'),
- I18N::translate('If you use one of the following tracking and analytics services, webtrees can add the tracking codes automatically.')
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listBlocks(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleBlockInterface::class,
- view('icons/block') . I18N::translate('Blocks'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listCharts(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleChartInterface::class,
- view('icons/chart') . I18N::translate('Charts'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listDataFixes(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleDataFixInterface::class,
- view('icons/data-fix') . I18N::translate('Data fixes'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listFooters(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleFooterInterface::class,
- view('icons/footer') . I18N::translate('Footers'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listHistory(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleHistoricEventsInterface::class,
- view('icons/history') . I18N::translate('Historic events'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listLanguages(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleLanguageInterface::class,
- view('icons/language') . I18N::translate('Languages'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listLists(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleListInterface::class,
- view('icons/list') . I18N::translate('Lists'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listMenus(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleMenuInterface::class,
- view('icons/menu') . I18N::translate('Menus'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listReports(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleReportInterface::class,
- view('icons/report') . I18N::translate('Reports'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listSidebars(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleSidebarInterface::class,
- view('icons/sidebar') . I18N::translate('Sidebars'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listTabs(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleTabInterface::class,
- view('icons/tab') . I18N::translate('Tabs'),
- ''
- );
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function listThemes(ServerRequestInterface $request): ResponseInterface
- {
- return $this->listComponents(
- ModuleThemeInterface::class,
- view('icons/theme') . I18N::translate('Themes'),
- ''
- );
- }
-
- /**
- * @param string $interface
- * @param string $title
- * @param string $description
- *
- * @return ResponseInterface
- */
- private function listComponents(string $interface, string $title, string $description): ResponseInterface
- {
- $trees = $this->tree_service->all();
- $modules = $this->module_service->findByInterface($interface, true, true);
- $uses_access = in_array($interface, $this->module_service->componentsWithAccess(), true);
- $uses_sorting = in_array($interface, $this->module_service->componentsWithOrder(), true);
-
- $level_text = Auth::accessLevelNames();
-
- $access_summary = $modules
- ->mapWithKeys(static function (ModuleInterface $module) use ($interface, $level_text, $trees): array {
- $access_levels = $trees
- ->map(static function ($tree) use ($interface, $module): int {
- return $module->accessLevel($tree, $interface);
- })
- ->uniqueStrict()
- ->values()
- ->map(static function (int $level) use ($level_text): string {
- return $level_text[$level];
- })
- ->all();
-
- return [$module->name() => $access_levels];
- })
- ->all();
-
- return $this->viewResponse('admin/components', [
- 'description' => $description,
- 'interface' => $interface,
- 'modules' => $modules,
- 'title' => $title,
- 'trees' => $this->tree_service->all(),
- 'uses_access' => $uses_access,
- 'uses_sorting' => $uses_sorting,
- 'access_summary' => $access_summary,
- ]);
- }
-
- /**
- * Update the enabled/disabled status of the modules.
- *
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function update(ServerRequestInterface $request): ResponseInterface
- {
- $params = (array) $request->getParsedBody();
-
- $modules = $this->module_service->all(true);
-
- foreach ($modules as $module) {
- $new_status = (bool) ($params['status-' . $module->name()] ?? false);
- $old_status = $module->isEnabled();
-
- if ($new_status !== $old_status) {
- DB::table('module')
- ->where('module_name', '=', $module->name())
- ->update(['status' => $new_status ? 'enabled' : 'disabled']);
-
- if ($new_status) {
- FlashMessages::addMessage(I18N::translate('The module “%s” has been enabled.', $module->title()), 'success');
- } else {
- FlashMessages::addMessage(I18N::translate('The module “%s” has been disabled.', $module->title()), 'success');
- }
- }
- }
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('modules'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateAnalytics(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleAnalyticsInterface::class, true);
-
- $this->updateStatus($modules, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('analytics'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateBlocks(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleBlockInterface::class, true);
-
- $this->updateStatus($modules, $request);
- $this->updateAccessLevel($modules, ModuleBlockInterface::class, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('blocks'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateCharts(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleChartInterface::class, true);
-
- $this->updateStatus($modules, $request);
- $this->updateAccessLevel($modules, ModuleChartInterface::class, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('charts'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateDataFixes(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleDataFixInterface::class, true);
-
- $this->updateStatus($modules, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('languages'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateFooters(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleFooterInterface::class, true);
-
- $this->updateStatus($modules, $request);
- $this->updateOrder($modules, 'footer_order', $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('footers'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateHistory(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleHistoricEventsInterface::class, true);
-
- $this->updateStatus($modules, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('history'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateLanguages(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleLanguageInterface::class, true);
-
- $this->updateStatus($modules, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('languages'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateLists(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleListInterface::class, true);
-
- $this->updateStatus($modules, $request);
- $this->updateAccessLevel($modules, ModuleListInterface::class, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('lists'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateMenus(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleMenuInterface::class, true);
-
- $this->updateStatus($modules, $request);
- $this->updateOrder($modules, 'menu_order', $request);
- $this->updateAccessLevel($modules, ModuleMenuInterface::class, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('menus'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateReports(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleReportInterface::class, true);
-
- $this->updateStatus($modules, $request);
- $this->updateAccessLevel($modules, ModuleReportInterface::class, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('reports'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateSidebars(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleSidebarInterface::class, true);
-
- $this->updateStatus($modules, $request);
- $this->updateOrder($modules, 'sidebar_order', $request);
- $this->updateAccessLevel($modules, ModuleSidebarInterface::class, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('sidebars'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateTabs(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleTabInterface::class, true);
-
- $this->updateStatus($modules, $request);
- $this->updateOrder($modules, 'tab_order', $request);
- $this->updateAccessLevel($modules, ModuleTabInterface::class, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('tabs'));
- }
-
- /**
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function updateThemes(ServerRequestInterface $request): ResponseInterface
- {
- $modules = $this->module_service->findByInterface(ModuleThemeInterface::class, true);
-
- $this->updateStatus($modules, $request);
-
- FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
-
- return redirect(route('themes'));
- }
-
- /**
- * Update the access levels of the modules.
- *
- * @param Collection $modules
- * @param string $column
- * @param ServerRequestInterface $request
- *
- * @return void
- */
- private function updateOrder(Collection $modules, string $column, ServerRequestInterface $request): void
- {
- $params = (array) $request->getParsedBody();
-
- $order = (array) ($params['order'] ?? []);
- $order = array_flip($order);
-
- foreach ($modules as $module) {
- DB::table('module')
- ->where('module_name', '=', $module->name())
- ->update([
- $column => $order[$module->name()] ?? 0,
- ]);
- }
- }
-
- /**
- * Update the access levels of the modules.
- *
- * @param Collection $modules
- * @param ServerRequestInterface $request
- *
- * @return void
- */
- private function updateStatus(Collection $modules, ServerRequestInterface $request): void
- {
- $params = (array) $request->getParsedBody();
-
- foreach ($modules as $module) {
- $enabled = (bool) ($params['status-' . $module->name()] ?? false);
-
- if ($enabled !== $module->isEnabled()) {
- DB::table('module')
- ->where('module_name', '=', $module->name())
- ->update(['status' => $enabled ? 'enabled' : 'disabled']);
-
- if ($enabled) {
- $message = I18N::translate('The module “%s” has been enabled.', $module->title());
- } else {
- $message = I18N::translate('The module “%s” has been disabled.', $module->title());
- }
-
- FlashMessages::addMessage($message, 'success');
- }
- }
- }
-
- /**
- * Update the access levels of the modules.
- *
- * @param Collection $modules
- * @param string $interface
- * @param ServerRequestInterface $request
- *
- * @return void
- */
- private function updateAccessLevel(Collection $modules, string $interface, ServerRequestInterface $request): void
- {
- $params = (array) $request->getParsedBody();
-
- $trees = $this->tree_service->all();
-
- foreach ($modules as $module) {
- foreach ($trees as $tree) {
- $key = 'access-' . $module->name() . '-' . $tree->id();
- $access_level = (int) ($params[$key] ?? 0);
-
- if ($access_level !== $module->accessLevel($tree, $interface)) {
- DB::table('module_privacy')->updateOrInsert([
- 'module_name' => $module->name(),
- 'gedcom_id' => $tree->id(),
- 'interface' => $interface,
- ], [
- 'access_level' => $access_level,
- ]);
- }
- }
- }
- }
-
- /**
- * Delete the database settings for a deleted module.
- *
- * @param ServerRequestInterface $request
- *
- * @return ResponseInterface
- */
- public function deleteModuleSettings(ServerRequestInterface $request): ResponseInterface
- {
- $params = (array) $request->getParsedBody();
-
- $module_name = $params['module_name'];
-
- DB::table('block_setting')
- ->join('block', 'block_setting.block_id', '=', 'block.block_id')
- ->join('module', 'block.module_name', '=', 'module.module_name')
- ->where('module.module_name', '=', $module_name)
- ->delete();
-
- DB::table('block')
- ->join('module', 'block.module_name', '=', 'module.module_name')
- ->where('module.module_name', '=', $module_name)
- ->delete();
-
- DB::table('module_setting')
- ->where('module_name', '=', $module_name)
- ->delete();
-
- DB::table('module_privacy')
- ->where('module_name', '=', $module_name)
- ->delete();
-
- DB::table('module')
- ->where('module_name', '=', $module_name)
- ->delete();
-
- FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been deleted.', $module_name), 'success');
-
- return redirect(route('modules'));
- }
-}
diff --git a/app/Http/RequestHandlers/AbstractModuleComponentAction.php b/app/Http/RequestHandlers/AbstractModuleComponentAction.php
new file mode 100644
index 0000000000..c709fe7da1
--- /dev/null
+++ b/app/Http/RequestHandlers/AbstractModuleComponentAction.php
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Services\ModuleService;
+use Fisharebest\Webtrees\Services\TreeService;
+use Illuminate\Database\Capsule\Manager as DB;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+use function array_flip;
+
+/**
+ * Update a list of modules.
+ */
+abstract class AbstractModuleComponentAction implements RequestHandlerInterface
+{
+ /** @var ModuleService */
+ protected $module_service;
+
+ /** @var TreeService */
+ protected $tree_service;
+
+ /**
+ * @param ModuleService $module_service
+ * @param TreeService $tree_service
+ */
+ public function __construct(ModuleService $module_service, TreeService $tree_service)
+ {
+ $this->module_service = $module_service;
+ $this->tree_service = $tree_service;
+ }
+
+ /**
+ * Update the access levels of the modules.
+ *
+ * @param string $interface
+ * @param ServerRequestInterface $request
+ *
+ * @return void
+ */
+ protected function updateStatus(string $interface, ServerRequestInterface $request): void
+ {
+ $modules = $this->module_service->findByInterface($interface, true);
+
+ $params = (array) $request->getParsedBody();
+
+ foreach ($modules as $module) {
+ $enabled = (bool) ($params['status-' . $module->name()] ?? false);
+
+ if ($enabled !== $module->isEnabled()) {
+ DB::table('module')
+ ->where('module_name', '=', $module->name())
+ ->update(['status' => $enabled ? 'enabled' : 'disabled']);
+
+ if ($enabled) {
+ $message = I18N::translate('The module “%s” has been enabled.', $module->title());
+ } else {
+ $message = I18N::translate('The module “%s” has been disabled.', $module->title());
+ }
+
+ FlashMessages::addMessage($message, 'success');
+ }
+ }
+ }
+
+ /**
+ * Update the access levels of the modules.
+ *
+ * @param string $interface
+ * @param ServerRequestInterface $request
+ *
+ * @return void
+ */
+ protected function updateAccessLevel(string $interface, ServerRequestInterface $request): void
+ {
+ $modules = $this->module_service->findByInterface($interface, true);
+
+ $params = (array) $request->getParsedBody();
+
+ $trees = $this->tree_service->all();
+
+ foreach ($modules as $module) {
+ foreach ($trees as $tree) {
+ $key = 'access-' . $module->name() . '-' . $tree->id();
+ $access_level = (int) ($params[$key] ?? 0);
+
+ if ($access_level !== $module->accessLevel($tree, $interface)) {
+ DB::table('module_privacy')->updateOrInsert([
+ 'module_name' => $module->name(),
+ 'gedcom_id' => $tree->id(),
+ 'interface' => $interface,
+ ], [
+ 'access_level' => $access_level,
+ ]);
+ }
+ }
+ }
+ }
+
+ /**
+ * Update the access levels of the modules.
+ *
+ * @param string $interface
+ * @param string $column
+ * @param ServerRequestInterface $request
+ *
+ * @return void
+ */
+ protected function updateOrder(string $interface, string $column, ServerRequestInterface $request): void
+ {
+ $modules = $this->module_service->findByInterface($interface, true);
+
+ $params = (array) $request->getParsedBody();
+
+ $order = (array) ($params['order'] ?? []);
+ $order = array_flip($order);
+
+ foreach ($modules as $module) {
+ DB::table('module')
+ ->where('module_name', '=', $module->name())
+ ->update([
+ $column => $order[$module->name()] ?? 0,
+ ]);
+ }
+ }
+}
diff --git a/app/Http/RequestHandlers/AbstractModuleComponentPage.php b/app/Http/RequestHandlers/AbstractModuleComponentPage.php
new file mode 100644
index 0000000000..54b96f097e
--- /dev/null
+++ b/app/Http/RequestHandlers/AbstractModuleComponentPage.php
@@ -0,0 +1,96 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\Auth;
+use Fisharebest\Webtrees\Http\ViewResponseTrait;
+use Fisharebest\Webtrees\Module\ModuleInterface;
+use Fisharebest\Webtrees\Services\ModuleService;
+use Fisharebest\Webtrees\Services\TreeService;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+/**
+ * Show a list of modules.
+ */
+abstract class AbstractModuleComponentPage implements RequestHandlerInterface
+{
+ use ViewResponseTrait;
+
+ /** @var ModuleService */
+ private $module_service;
+
+ /** @var TreeService */
+ private $tree_service;
+
+ /**
+ * @param ModuleService $module_service
+ * @param TreeService $tree_service
+ */
+ public function __construct(ModuleService $module_service, TreeService $tree_service)
+ {
+ $this->module_service = $module_service;
+ $this->tree_service = $tree_service;
+ }
+
+ /**
+ * @param string $interface
+ * @param string $title
+ * @param string $description
+ *
+ * @return ResponseInterface
+ */
+ protected function listComponents(string $interface, string $title, string $description): ResponseInterface
+ {
+ $this->layout = 'layouts/administration';
+
+ $modules = $this->module_service->findByInterface($interface, true, true);
+ $uses_access = $this->module_service->componentsWithAccess()->containsStrict($interface);
+ $uses_sorting = $this->module_service->componentsWithOrder()->containsStrict($interface);
+
+ $access_summary = $modules
+ ->mapWithKeys(function (ModuleInterface $module) use ($interface): array {
+ $access_levels = $this->tree_service->all()
+ ->map(static function ($tree) use ($interface, $module): int {
+ return $module->accessLevel($tree, $interface);
+ })
+ ->uniqueStrict()
+ ->values()
+ ->map(static function (int $level): string {
+ return Auth::accessLevelNames()[$level];
+ })
+ ->all();
+
+ return [$module->name() => $access_levels];
+ })
+ ->all();
+
+ return $this->viewResponse('admin/components', [
+ 'description' => $description,
+ 'interface' => $interface,
+ 'modules' => $modules,
+ 'title' => $title,
+ 'trees' => $this->tree_service->all(),
+ 'uses_access' => $uses_access,
+ 'uses_sorting' => $uses_sorting,
+ 'access_summary' => $access_summary,
+ ]);
+ }
+}
diff --git a/app/Http/RequestHandlers/ModuleAction.php b/app/Http/RequestHandlers/ModuleAction.php
index 29d39f2521..d5969a86ba 100644
--- a/app/Http/RequestHandlers/ModuleAction.php
+++ b/app/Http/RequestHandlers/ModuleAction.php
@@ -42,8 +42,6 @@ class ModuleAction implements RequestHandlerInterface
private $module_service;
/**
- * ModuleController constructor.
- *
* @param ModuleService $module_service
*/
public function __construct(ModuleService $module_service)
diff --git a/app/Http/RequestHandlers/ModuleDeleteSettings.php b/app/Http/RequestHandlers/ModuleDeleteSettings.php
new file mode 100644
index 0000000000..6c0dbcc8cc
--- /dev/null
+++ b/app/Http/RequestHandlers/ModuleDeleteSettings.php
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Illuminate\Database\Capsule\Manager as DB;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Delete the database settings for a deleted module.
+ */
+class ModuleDeleteSettings implements RequestHandlerInterface
+{
+ /**
+ * Delete the database settings for a deleted module.
+ *
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $params = (array) $request->getParsedBody();
+
+ $module_name = $params['module_name'] ?? '';
+
+ DB::table('block_setting')
+ ->join('block', 'block_setting.block_id', '=', 'block.block_id')
+ ->join('module', 'block.module_name', '=', 'module.module_name')
+ ->where('module.module_name', '=', $module_name)
+ ->delete();
+
+ DB::table('block')
+ ->join('module', 'block.module_name', '=', 'module.module_name')
+ ->where('module.module_name', '=', $module_name)
+ ->delete();
+
+ DB::table('module_setting')
+ ->where('module_name', '=', $module_name)
+ ->delete();
+
+ DB::table('module_privacy')
+ ->where('module_name', '=', $module_name)
+ ->delete();
+
+ DB::table('module')
+ ->where('module_name', '=', $module_name)
+ ->delete();
+
+ FlashMessages::addMessage(I18N::translate('The preferences for the module “%s” have been deleted.', $module_name), 'success');
+
+ return redirect(route('modules'));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesAllAction.php b/app/Http/RequestHandlers/ModulesAllAction.php
new file mode 100644
index 0000000000..761dbec00a
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesAllAction.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Services\ModuleService;
+use Illuminate\Database\Capsule\Manager as DB;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesAllAction implements RequestHandlerInterface
+{
+ /** @var ModuleService */
+ private $module_service;
+
+ /**
+ * @param ModuleService $module_service
+ */
+ public function __construct(ModuleService $module_service)
+ {
+ $this->module_service = $module_service;
+ }
+
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $params = (array) $request->getParsedBody();
+
+ $modules = $this->module_service->all(true);
+
+ foreach ($modules as $module) {
+ $new_status = (bool) ($params['status-' . $module->name()] ?? false);
+ $old_status = $module->isEnabled();
+
+ if ($new_status !== $old_status) {
+ DB::table('module')
+ ->where('module_name', '=', $module->name())
+ ->update(['status' => $new_status ? 'enabled' : 'disabled']);
+
+ if ($new_status) {
+ FlashMessages::addMessage(I18N::translate('The module “%s” has been enabled.', $module->title()), 'success');
+ } else {
+ FlashMessages::addMessage(I18N::translate('The module “%s” has been disabled.', $module->title()), 'success');
+ }
+ }
+ }
+
+ return redirect(route(ModulesAllPage::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesAllPage.php b/app/Http/RequestHandlers/ModulesAllPage.php
new file mode 100644
index 0000000000..5f3806920d
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesAllPage.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\Http\ViewResponseTrait;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Services\ModuleService;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesAllPage implements RequestHandlerInterface
+{
+ use ViewResponseTrait;
+
+ /** @var ModuleService */
+ private $module_service;
+
+ /**
+ * @param ModuleService $module_service
+ */
+ public function __construct(ModuleService $module_service)
+ {
+ $this->module_service = $module_service;
+ }
+
+ /**
+ * Delete the database settings for a deleted module.
+ *
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->layout = 'layouts/administration';
+
+ return $this->viewResponse('admin/modules', [
+ 'title' => I18N::translate('All modules'),
+ 'modules' => $this->module_service->all(true),
+ 'deleted_modules' => $this->module_service->deletedModules(),
+ ]);
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesAnalyticsAction.php b/app/Http/RequestHandlers/ModulesAnalyticsAction.php
new file mode 100644
index 0000000000..f2eaf8c5a9
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesAnalyticsAction.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleAnalyticsInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesAnalyticsAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleAnalyticsInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesAnalyticsPage.php b/app/Http/RequestHandlers/ModulesAnalyticsPage.php
new file mode 100644
index 0000000000..ab4d5c191f
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesAnalyticsPage.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\Http\ViewResponseTrait;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleAnalyticsInterface;
+use Fisharebest\Webtrees\Services\ModuleService;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesAnalyticsPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleAnalyticsInterface::class,
+ I18N::translate('Tracking and analytics'),
+ I18N::translate('If you use one of the following tracking and analytics services, webtrees can add the tracking codes automatically.')
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesBlocksAction.php b/app/Http/RequestHandlers/ModulesBlocksAction.php
new file mode 100644
index 0000000000..ffb4616ec9
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesBlocksAction.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleBlockInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesBlocksAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleBlockInterface::class, $request);
+ $this->updateAccessLevel(ModuleBlockInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesBlocksPage.php b/app/Http/RequestHandlers/ModulesBlocksPage.php
new file mode 100644
index 0000000000..3fe8689a91
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesBlocksPage.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\Http\ViewResponseTrait;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleAnalyticsInterface;
+use Fisharebest\Webtrees\Module\ModuleBlockInterface;
+use Fisharebest\Webtrees\Services\ModuleService;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+use Psr\Http\Server\RequestHandlerInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesBlocksPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleBlockInterface::class,
+ view('icons/block') . I18N::translate('Blocks'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesChartsAction.php b/app/Http/RequestHandlers/ModulesChartsAction.php
new file mode 100644
index 0000000000..b47719cd52
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesChartsAction.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleChartInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesChartsAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleChartInterface::class, $request);
+ $this->updateAccessLevel(ModuleChartInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesChartsPage.php b/app/Http/RequestHandlers/ModulesChartsPage.php
new file mode 100644
index 0000000000..d07f2ecaad
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesChartsPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleChartInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesChartsPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleChartInterface::class,
+ view('icons/chart') . I18N::translate('Charts'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesDataFixesAction.php b/app/Http/RequestHandlers/ModulesDataFixesAction.php
new file mode 100644
index 0000000000..85fab2f800
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesDataFixesAction.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesDataFixesAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleDataFixInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesDataFixesPage.php b/app/Http/RequestHandlers/ModulesDataFixesPage.php
new file mode 100644
index 0000000000..4ed82cb8fc
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesDataFixesPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesDataFixesPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleDataFixInterface::class,
+ view('icons/data-fix') . I18N::translate('Data fixes'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesFootersAction.php b/app/Http/RequestHandlers/ModulesFootersAction.php
new file mode 100644
index 0000000000..a09b3f196d
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesFootersAction.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleDataFixInterface;
+use Fisharebest\Webtrees\Module\ModuleFooterInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesFootersAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleFooterInterface::class, $request);
+ $this->updateOrder(ModuleFooterInterface::class, 'footer_order', $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesFootersPage.php b/app/Http/RequestHandlers/ModulesFootersPage.php
new file mode 100644
index 0000000000..d2980759c0
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesFootersPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleFooterInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesFootersPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleFooterInterface::class,
+ view('icons/footer') . I18N::translate('Footers'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesHistoricEventsAction.php b/app/Http/RequestHandlers/ModulesHistoricEventsAction.php
new file mode 100644
index 0000000000..088a67ed67
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesHistoricEventsAction.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleHistoricEventsInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesHistoricEventsAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleHistoricEventsInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesHistoricEventsPage.php b/app/Http/RequestHandlers/ModulesHistoricEventsPage.php
new file mode 100644
index 0000000000..87894ac244
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesHistoricEventsPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleHistoricEventsInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesHistoricEventsPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleHistoricEventsInterface::class,
+ view('icons/history') . I18N::translate('Historic events'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesLanguagesAction.php b/app/Http/RequestHandlers/ModulesLanguagesAction.php
new file mode 100644
index 0000000000..52d57ec928
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesLanguagesAction.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleLanguageInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesLanguagesAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleLanguageInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesLanguagesPage.php b/app/Http/RequestHandlers/ModulesLanguagesPage.php
new file mode 100644
index 0000000000..f7a1c96381
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesLanguagesPage.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleHistoricEventsInterface;
+use Fisharebest\Webtrees\Module\ModuleLanguageInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesLanguagesPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleLanguageInterface::class,
+ view('icons/language') . I18N::translate('Languages'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesListsAction.php b/app/Http/RequestHandlers/ModulesListsAction.php
new file mode 100644
index 0000000000..7c0f1f19d7
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesListsAction.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleListInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesListsAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleListInterface::class, $request);
+ $this->updateAccessLevel(ModuleListInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesListsPage.php b/app/Http/RequestHandlers/ModulesListsPage.php
new file mode 100644
index 0000000000..e0c6e61906
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesListsPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleListInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesListsPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleListInterface::class,
+ view('icons/list') . I18N::translate('Lists'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesMenusAction.php b/app/Http/RequestHandlers/ModulesMenusAction.php
new file mode 100644
index 0000000000..2b3b0a939d
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesMenusAction.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleMenuInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesMenusAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleMenuInterface::class, $request);
+ $this->updateOrder(ModuleMenuInterface::class, 'menu_order', $request);
+ $this->updateAccessLevel(ModuleMenuInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesMenusPage.php b/app/Http/RequestHandlers/ModulesMenusPage.php
new file mode 100644
index 0000000000..46b9353b40
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesMenusPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleMenuInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesMenusPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleMenuInterface::class,
+ view('icons/menu') . I18N::translate('Menus'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesReportsAction.php b/app/Http/RequestHandlers/ModulesReportsAction.php
new file mode 100644
index 0000000000..6c716d6366
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesReportsAction.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleReportInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesReportsAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleReportInterface::class, $request);
+ $this->updateAccessLevel(ModuleReportInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesReportsPage.php b/app/Http/RequestHandlers/ModulesReportsPage.php
new file mode 100644
index 0000000000..6727c2e3f6
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesReportsPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleReportInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesReportsPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleReportInterface::class,
+ view('icons/report') . I18N::translate('Reports'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesSidebarsAction.php b/app/Http/RequestHandlers/ModulesSidebarsAction.php
new file mode 100644
index 0000000000..05f110cf2e
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesSidebarsAction.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleSidebarInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesSidebarsAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleSidebarInterface::class, $request);
+ $this->updateOrder(ModuleSidebarInterface::class, 'sidebar_order', $request);
+ $this->updateAccessLevel(ModuleSidebarInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesSidebarsPage.php b/app/Http/RequestHandlers/ModulesSidebarsPage.php
new file mode 100644
index 0000000000..757c732183
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesSidebarsPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleSidebarInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesSidebarsPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleSidebarInterface::class,
+ view('icons/sidebar') . I18N::translate('Sidebars'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesTabsAction.php b/app/Http/RequestHandlers/ModulesTabsAction.php
new file mode 100644
index 0000000000..d2ce64609e
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesTabsAction.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleTabInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesTabsAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleTabInterface::class, $request);
+ $this->updateOrder(ModuleTabInterface::class, 'tab_order', $request);
+ $this->updateAccessLevel(ModuleTabInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesTabsPage.php b/app/Http/RequestHandlers/ModulesTabsPage.php
new file mode 100644
index 0000000000..b9cda78e94
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesTabsPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleTabInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesTabsPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleTabInterface::class,
+ view('icons/tab') . I18N::translate('Tabs'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesThemesAction.php b/app/Http/RequestHandlers/ModulesThemesAction.php
new file mode 100644
index 0000000000..e93c015922
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesThemesAction.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 20 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\FlashMessages;
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleBlockInterface;
+use Fisharebest\Webtrees\Module\ModuleThemeInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function redirect;
+use function route;
+
+/**
+ * Update a list of modules.
+ */
+class ModulesThemesAction extends AbstractModuleComponentAction
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $this->updateStatus(ModuleThemeInterface::class, $request);
+
+ FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
+
+ return redirect(route(ControlPanel::class));
+ }
+}
diff --git a/app/Http/RequestHandlers/ModulesThemesPage.php b/app/Http/RequestHandlers/ModulesThemesPage.php
new file mode 100644
index 0000000000..0cef064cfd
--- /dev/null
+++ b/app/Http/RequestHandlers/ModulesThemesPage.php
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * webtrees: online genealogy
+ * Copyright (C) 2020 webtrees development team
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+declare(strict_types=1);
+
+namespace Fisharebest\Webtrees\Http\RequestHandlers;
+
+use Fisharebest\Webtrees\I18N;
+use Fisharebest\Webtrees\Module\ModuleThemeInterface;
+use Psr\Http\Message\ResponseInterface;
+use Psr\Http\Message\ServerRequestInterface;
+
+use function view;
+
+/**
+ * Show a list of modules.
+ */
+class ModulesThemesPage extends AbstractModuleComponentPage
+{
+ /**
+ * @param ServerRequestInterface $request
+ *
+ * @return ResponseInterface
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ return $this->listComponents(
+ ModuleThemeInterface::class,
+ view('icons/theme') . I18N::translate('Themes'),
+ ''
+ );
+ }
+}
diff --git a/app/Http/Routes/WebRoutes.php b/app/Http/Routes/WebRoutes.php
index 581d54c5d1..6b0cfa3f37 100644
--- a/app/Http/Routes/WebRoutes.php
+++ b/app/Http/Routes/WebRoutes.php
@@ -123,6 +123,35 @@ use Fisharebest\Webtrees\Http\RequestHandlers\MessageAction;
use Fisharebest\Webtrees\Http\RequestHandlers\MessagePage;
use Fisharebest\Webtrees\Http\RequestHandlers\MessageSelect;
use Fisharebest\Webtrees\Http\RequestHandlers\ModuleAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModuleDeleteSettings;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesAnalyticsAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesAnalyticsPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesBlocksAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesBlocksPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesChartsAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesChartsPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesDataFixesAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesDataFixesPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesFootersAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesFootersPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesHistoricEventsAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesHistoricEventsPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesLanguagesAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesLanguagesPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesAllAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesAllPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesListsAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesListsPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesMenusAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesMenusPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesReportsAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesReportsPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesSidebarsAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesSidebarsPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesTabsAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesTabsPage;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesThemesAction;
+use Fisharebest\Webtrees\Http\RequestHandlers\ModulesThemesPage;
use Fisharebest\Webtrees\Http\RequestHandlers\NotePage;
use Fisharebest\Webtrees\Http\RequestHandlers\PasswordRequestAction;
use Fisharebest\Webtrees\Http\RequestHandlers\PasswordRequestPage;
@@ -262,37 +291,8 @@ class WebRoutes
$router->get('admin-webtrees1-thumbs', '/webtrees1-thumbs', 'Admin\ImportThumbnailsController::webtrees1Thumbnails');
$router->post('admin-webtrees1-thumbs-action', '/webtrees1-thumbs', 'Admin\ImportThumbnailsController::webtrees1ThumbnailsAction');
$router->get('admin-webtrees1-thumbs-data', '/webtrees1-thumbs-data', 'Admin\ImportThumbnailsController::webtrees1ThumbnailsData');
- $router->get('modules', '/modules', 'Admin\ModuleController::list');
- $router->post('modules-update', '/modules', 'Admin\ModuleController::update');
- $router->get('analytics', '/analytics', 'Admin\ModuleController::listAnalytics');
- $router->post('analytics-update', '/analytics', 'Admin\ModuleController::updateAnalytics');
- $router->get('blocks', '/blocks', 'Admin\ModuleController::listBlocks');
- $router->post('blocks-update', '/blocks', 'Admin\ModuleController::updateBlocks');
- $router->get('charts', '/charts', 'Admin\ModuleController::listCharts');
- $router->post('charts-update', '/charts', 'Admin\ModuleController::updateCharts');
- $router->get('data-fixes', '/data-fixes', 'Admin\ModuleController::listDataFixes');
- $router->post('data-fixes-update', '/data-fixes', 'Admin\ModuleController::updateDataFixes');
- $router->get('lists', '/lists', 'Admin\ModuleController::listLists');
- $router->post('lists-update', '/lists', 'Admin\ModuleController::updateLists');
- $router->get('footers', '/footers', 'Admin\ModuleController::listFooters');
- $router->post('footers-update', '/footers', 'Admin\ModuleController::updateFooters');
- $router->get('history', '/history', 'Admin\ModuleController::listHistory');
- $router->post('history-update', '/history', 'Admin\ModuleController::updateHistory');
- $router->get('menus', '/menus', 'Admin\ModuleController::listMenus');
- $router->post('menus-update', '/menus', 'Admin\ModuleController::updateMenus');
- $router->get('languages', '/languages', 'Admin\ModuleController::listLanguages');
- $router->post('languages-update', '/languages', 'Admin\ModuleController::updateLanguages');
- $router->get('reports', '/reports', 'Admin\ModuleController::listReports');
- $router->post('reports-update', '/reports', 'Admin\ModuleController::updateReports');
- $router->get('sidebars', '/sidebars', 'Admin\ModuleController::listSidebars');
- $router->post('sidebars-update', '/sidebars', 'Admin\ModuleController::updateSidebars');
- $router->get('themes', '/themes', 'Admin\ModuleController::listThemes');
- $router->post('themes-update', '/themes', 'Admin\ModuleController::updateThemes');
- $router->get('tabs', '/tabs', 'Admin\ModuleController::listTabs');
- $router->post('tabs-update', '/tabs', 'Admin\ModuleController::updateTabs');
$router->get(UsersCleanupPage::class, '/users-cleanup');
$router->post(UsersCleanupAction::class, '/users-cleanup');
- $router->post('delete-module-settings', '/delete-module-settings', 'Admin\ModuleController::deleteModuleSettings');
$router->get(MapDataList::class, '/map-data');
$router->get('map-data-edit', '/map-data-edit', 'Admin\LocationController::mapDataEdit');
$router->post('map-data-update', '/map-data-edit', 'Admin\LocationController::mapDataSave');
@@ -302,6 +302,35 @@ class WebRoutes
$router->post('locations-import-action', '/locations-import', 'Admin\LocationController::importLocationsAction');
$router->get('map-provider', '/map-provider', 'Admin\MapProviderController::mapProviderEdit');
$router->post('map-provider-action', '/map-provider', 'Admin\MapProviderController::mapProviderSave');
+ $router->post(ModuleDeleteSettings::class, '/module-delete-settings');
+ $router->get(ModulesAllPage::class, '/modules');
+ $router->post(ModulesAllAction::class, '/modules');
+ $router->get(ModulesAnalyticsPage::class, '/analytics');
+ $router->post(ModulesAnalyticsAction::class, '/analytics');
+ $router->get(ModulesBlocksPage::class, '/blocks');
+ $router->post(ModulesBlocksAction::class, '/blocks');
+ $router->get(ModulesChartsPage::class, '/charts');
+ $router->post(ModulesChartsAction::class, '/charts');
+ $router->get(ModulesDataFixesPage::class, '/data-fixes');
+ $router->post(ModulesDataFixesAction::class, '/data-fixes');
+ $router->get(ModulesFootersPage::class, '/footers');
+ $router->post(ModulesFootersAction::class, '/footers');
+ $router->get(ModulesHistoricEventsPage::class, '/historic-events');
+ $router->post(ModulesHistoricEventsAction::class, '/historic-events');
+ $router->get(ModulesListsPage::class, '/lists');
+ $router->post(ModulesListsAction::class, '/lists');
+ $router->get(ModulesMenusPage::class, '/menus');
+ $router->post(ModulesMenusAction::class, '/menus');
+ $router->get(ModulesLanguagesPage::class, '/languages');
+ $router->post(ModulesLanguagesAction::class, '/languages');
+ $router->get(ModulesReportsPage::class, '/reports');
+ $router->post(ModulesReportsAction::class, '/reports');
+ $router->get(ModulesSidebarsPage::class, '/sidebars');
+ $router->post(ModulesSidebarsAction::class, '/sidebars');
+ $router->get(ModulesTabsPage::class, '/tabs');
+ $router->post(ModulesTabsAction::class, '/tabs');
+ $router->get(ModulesThemesPage::class, '/themes');
+ $router->post(ModulesThemesAction::class, '/themes');
$router->get('upgrade', '/upgrade', 'Admin\UpgradeController::wizard');
$router->post('upgrade-confirm', '/upgrade-confirm', 'Admin\UpgradeController::confirm');
$router->post('upgrade-action', '/upgrade', 'Admin\UpgradeController::step');
diff --git a/app/Module/RelationshipsChartModule.php b/app/Module/RelationshipsChartModule.php
index 683e50207d..21e5edc724 100644
--- a/app/Module/RelationshipsChartModule.php
+++ b/app/Module/RelationshipsChartModule.php
@@ -73,8 +73,6 @@ class RelationshipsChartModule extends AbstractModule implements ModuleChartInte
private $tree_service;
/**
- * ModuleController constructor.
- *
* @param TreeService $tree_service
*/
public function __construct(TreeService $tree_service)
diff --git a/app/Services/ModuleService.php b/app/Services/ModuleService.php
index a26891f75a..47780771ae 100644
--- a/app/Services/ModuleService.php
+++ b/app/Services/ModuleService.php
@@ -857,18 +857,18 @@ class ModuleService
}
/**
- * @return string[]
+ * @return Collection<string>
*/
- public function componentsWithAccess(): array
+ public function componentsWithAccess(): Collection
{
- return self::COMPONENTS_WITH_ACCESS;
+ return new Collection(self::COMPONENTS_WITH_ACCESS);
}
/**
- * @return string[]
+ * @return Collection<string>
*/
- public function componentsWithOrder(): array
+ public function componentsWithOrder(): Collection
{
- return self::COMPONENTS_WITH_SORT;
+ return new Collection(self::COMPONENTS_WITH_SORT);
}
}