diff options
| author | Greg Roach <fisharebest@webtrees.net> | 2019-01-30 14:56:06 +0000 |
|---|---|---|
| committer | Greg Roach <fisharebest@webtrees.net> | 2019-01-30 14:56:06 +0000 |
| commit | 11eb858145c6c7c490e5c0cd7b0bd51e519264f0 (patch) | |
| tree | e83560c1cd1603a26124425359ae6293c77ebb7a | |
| parent | ade503dfba8365d48c21ef618291c1a94004c6e1 (diff) | |
| download | webtrees-11eb858145c6c7c490e5c0cd7b0bd51e519264f0.tar.gz webtrees-11eb858145c6c7c490e5c0cd7b0bd51e519264f0.tar.bz2 webtrees-11eb858145c6c7c490e5c0cd7b0bd51e519264f0.zip | |
Add themes to the control panel
| -rw-r--r-- | app/Http/Controllers/Admin/ModuleController.php | 55 | ||||
| -rw-r--r-- | app/Http/Controllers/AdminController.php | 7 | ||||
| -rw-r--r-- | app/Module/ModuleExternalUrlTrait.php | 2 | ||||
| -rw-r--r-- | app/Module/ModuleLanguageInterface.php | 45 | ||||
| -rw-r--r-- | app/Module/ModuleLanguageTrait.php | 31 | ||||
| -rw-r--r-- | resources/views/admin/control-panel.phtml | 14 | ||||
| -rw-r--r-- | resources/views/admin/modules.phtml | 17 | ||||
| -rw-r--r-- | resources/views/icons/language.phtml | 1 | ||||
| -rw-r--r-- | routes/web.php | 104 |
9 files changed, 222 insertions, 54 deletions
diff --git a/app/Http/Controllers/Admin/ModuleController.php b/app/Http/Controllers/Admin/ModuleController.php index c55ff90413..a3593370d3 100644 --- a/app/Http/Controllers/Admin/ModuleController.php +++ b/app/Http/Controllers/Admin/ModuleController.php @@ -26,10 +26,12 @@ use Fisharebest\Webtrees\Module\ModuleChartInterface; use Fisharebest\Webtrees\Module\ModuleFooterInterface; use Fisharebest\Webtrees\Module\ModuleHistoricEventsInterface; use Fisharebest\Webtrees\Module\ModuleInterface; +use Fisharebest\Webtrees\Module\ModuleLanguageInterface; 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\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Collection; @@ -157,6 +159,19 @@ class ModuleController extends AbstractAdminController /** * @return Response */ + public function listLanguages(): Response + { + return $this->listComponents( + ModuleLanguageInterface::class, + 'language', + I18N::translate('Languages'), + '' + ); + } + + /** + * @return Response + */ public function listMenus(): Response { return $this->listComponents( @@ -205,6 +220,18 @@ class ModuleController extends AbstractAdminController '' ); } + /** + * @return Response + */ + public function listThemes(): Response + { + return $this->listComponents( + ModuleThemeInterface::class, + 'theme', + I18N::translate('Themes'), + '' + ); + } /** * @param string $interface @@ -339,6 +366,20 @@ class ModuleController extends AbstractAdminController * * @return RedirectResponse */ + public function updateLanguages(Request $request): RedirectResponse + { + $modules = Module::findByInterface(ModuleLanguageInterface::class, true); + + $this->updateStatus($modules, $request); + + return new RedirectResponse(route('language')); + } + + /** + * @param Request $request + * + * @return RedirectResponse + */ public function updateMenus(Request $request): RedirectResponse { $modules = Module::findByInterface(ModuleMenuInterface::class, true); @@ -386,6 +427,20 @@ class ModuleController extends AbstractAdminController * * @return RedirectResponse */ + public function updateThemes(Request $request): RedirectResponse + { + $modules = Module::findByInterface(ModuleThemeInterface::class, true); + + $this->updateStatus($modules, $request); + + return new RedirectResponse(route('themes')); + } + + /** + * @param Request $request + * + * @return RedirectResponse + */ public function updateTabs(Request $request): RedirectResponse { $modules = Module::findByInterface(ModuleTabInterface::class, true); diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 0195fbe185..4591490eeb 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -38,10 +38,12 @@ use Fisharebest\Webtrees\Module\ModuleChartInterface; use Fisharebest\Webtrees\Module\ModuleConfigInterface; use Fisharebest\Webtrees\Module\ModuleFooterInterface; use Fisharebest\Webtrees\Module\ModuleHistoricEventsInterface; +use Fisharebest\Webtrees\Module\ModuleLanguageInterface; 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\Note; use Fisharebest\Webtrees\Repository; use Fisharebest\Webtrees\Services\DatatablesService; @@ -89,7 +91,8 @@ class AdminController extends AbstractBaseController HousekeepingService $housekeeping_service, UpgradeService $upgrade_service, Admin\ModuleController $module_controller - ): Response { + ): Response + { $filesystem = new Filesystem(new Local(WT_ROOT)); $files_to_delete = $housekeeping_service->deleteOldWebtreesFiles($filesystem); $deleted_modules = $module_controller->deletedModuleNames(); @@ -127,10 +130,12 @@ class AdminController extends AbstractBaseController 'config_modules' => $config_modules, 'footer_modules' => Module::findByInterface(ModuleFooterInterface::class, true), 'history_modules' => Module::findByInterface(ModuleHistoricEventsInterface::class, true), + 'language_modules' => Module::findByInterface(ModuleLanguageInterface::class, true), 'menu_modules' => Module::findByInterface(ModuleMenuInterface::class, true), 'report_modules' => Module::findByInterface(ModuleReportInterface::class, true), 'sidebar_modules' => Module::findByInterface(ModuleSidebarInterface::class, true), 'tab_modules' => Module::findByInterface(ModuleTabInterface::class, true), + 'theme_modules' => Module::findByInterface(ModuleThemeInterface::class, true), ]); } diff --git a/app/Module/ModuleExternalUrlTrait.php b/app/Module/ModuleExternalUrlTrait.php index 6da766152b..2fa9b40767 100644 --- a/app/Module/ModuleExternalUrlTrait.php +++ b/app/Module/ModuleExternalUrlTrait.php @@ -18,7 +18,7 @@ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; /** - * Trait ModuleExternalUrlITrait - default implementation of ModuleExternalUrlIInterface + * Trait ModuleExternalUrlITrait - default implementation of ModuleExternalUrlIInterface. */ trait ModuleExternalUrlTrait { diff --git a/app/Module/ModuleLanguageInterface.php b/app/Module/ModuleLanguageInterface.php new file mode 100644 index 0000000000..67f044d57b --- /dev/null +++ b/app/Module/ModuleLanguageInterface.php @@ -0,0 +1,45 @@ +<?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\Module; + +use Fisharebest\Webtrees\Individual; +use Illuminate\Support\Collection; + +/** + * Interface ModuleLanguageInterface - provide translation and localization. + */ +interface ModuleLanguageInterface extends ModuleInterface +{ + /** + * All events provided by this module. + * + * @param Individual $individual + * + * @return string[] + */ + public function historicEventsAll(): array; + + /** + * Which events should we show for an individual? + * + * @param Individual $individual + * + * @return Collection + */ + public function historicEventsForIndividual(Individual $individual): Collection; +} diff --git a/app/Module/ModuleLanguageTrait.php b/app/Module/ModuleLanguageTrait.php new file mode 100644 index 0000000000..0526952e0e --- /dev/null +++ b/app/Module/ModuleLanguageTrait.php @@ -0,0 +1,31 @@ +<?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\Module; + +use Fisharebest\Webtrees\Date; +use Fisharebest\Webtrees\Fact; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Individual; +use Illuminate\Support\Collection; + +/** + * Trait ModuleLanguageEventsTrait - default implementation of ModuleLanguageInterface. + */ +trait ModuleLanguageTrait +{ +} diff --git a/resources/views/admin/control-panel.phtml b/resources/views/admin/control-panel.phtml index d4dbe6313f..3ae0de1c4a 100644 --- a/resources/views/admin/control-panel.phtml +++ b/resources/views/admin/control-panel.phtml @@ -358,6 +358,20 @@ </a> <?= view('components/badge', ['count' => $history_modules->count()]) ?> </li> + <li> + <span class="fa-li"><?= view('icons/theme') ?></span> + <a href="<?= e(route('themes')) ?>"> + <?= I18N::translate('Themes') ?> + </a> + <?= view('components/badge', ['count' => $theme_modules->count()]) ?> + </li> + <li> + <span class="fa-li"><?= view('icons/language') ?></span> + <a href="<?= e(route('languages')) ?>"> + <?= I18N::translate('Languages') ?> + </a> + <?= view('components/badge', ['count' => $language_modules->count()]) ?> + </li> </ul> </div> <div class="col-sm-6"> diff --git a/resources/views/admin/modules.phtml b/resources/views/admin/modules.phtml index 1e87715d58..98e1f2a1dd 100644 --- a/resources/views/admin/modules.phtml +++ b/resources/views/admin/modules.phtml @@ -8,6 +8,7 @@ <?php use Fisharebest\Webtrees\Module\ModuleExternalUrlInterface; ?> <?php use Fisharebest\Webtrees\Module\ModuleFooterInterface; ?> <?php use Fisharebest\Webtrees\Module\ModuleHistoricEventsInterface; ?> +<?php use Fisharebest\Webtrees\Module\ModuleLanguageInterface; ?> <?php use Fisharebest\Webtrees\Module\ModuleMenuInterface; ?> <?php use Fisharebest\Webtrees\Module\ModuleReportInterface; ?> <?php use Fisharebest\Webtrees\Module\ModuleSidebarInterface; ?> @@ -90,10 +91,14 @@ <?= view('icons/history') ?> <span class="sr-only"><?= I18N::translate('Historic events') ?></span> </th> - <th class="d-none" title="<?= I18N::translate('Themes') ?>"> + <th title="<?= I18N::translate('Themes') ?>"> <?= view('icons/theme') ?> <span class="sr-only"><?= I18N::translate('Themes') ?></span> </th> + <th title="<?= I18N::translate('Languages') ?>"> + <?= view('icons/language') ?> + <span class="sr-only"><?= I18N::translate('Languages') ?></span> + </th> </tr> </thead> @@ -225,7 +230,7 @@ - <?php endif ?> </td> - <td class="text-center text-muted d-none" title="<?= I18N::translate('Theme') ?>"> + <td class="text-center text-muted" title="<?= I18N::translate('Theme') ?>"> <?php if ($module instanceof ModuleThemeInterface) : ?> <?= view('icons/theme') ?> <span class="sr-only"><?= I18N::translate('Theme') ?></span> @@ -233,6 +238,14 @@ - <?php endif ?> </td> + <td class="text-center text-muted" title="<?= I18N::translate('Language') ?>"> + <?php if ($module instanceof ModuleLanguageInterface) : ?> + <?= view('icons/language') ?> + <span class="sr-only"><?= I18N::translate('Language') ?></span> + <?php else : ?> + - + <?php endif ?> + </td> </tr> <?php endforeach ?> </tbody> diff --git a/resources/views/icons/language.phtml b/resources/views/icons/language.phtml new file mode 100644 index 0000000000..8dec9dc22e --- /dev/null +++ b/resources/views/icons/language.phtml @@ -0,0 +1 @@ +<i class="fas fa-language fa-fw wt-icon-language" aria-hidden="true"></i> diff --git a/routes/web.php b/routes/web.php index 9d4f58238c..7d1311c524 100644 --- a/routes/web.php +++ b/routes/web.php @@ -40,10 +40,14 @@ if (Auth::isAdmin()) { 'POST:history' => 'Admin\\ModuleController@updateHistory', 'GET:menus' => 'Admin\\ModuleController@listMenus', 'POST:menus' => 'Admin\\ModuleController@updateMenus', + 'GET:languages' => 'Admin\\ModuleController@listLanguages', + 'POST:languages' => 'Admin\\ModuleController@updateLanguages', 'GET:reports' => 'Admin\\ModuleController@listReports', 'POST:reports' => 'Admin\\ModuleController@updateReports', 'GET:sidebars' => 'Admin\\ModuleController@listSidebars', 'POST:sidebars' => 'Admin\\ModuleController@updateSidebars', + 'GET:themes' => 'Admin\\ModuleController@listThemes', + 'POST:themes' => 'Admin\\ModuleController@updateThemes', 'GET:tabs' => 'Admin\\ModuleController@listTabs', 'POST:tabs' => 'Admin\\ModuleController@updateTabs', 'POST:delete-module-settings' => 'Admin\\ModuleController@deleteModuleSettings', @@ -248,56 +252,56 @@ if ($tree instanceof Tree && $tree->getPreference('imported') === '1' && Auth::i // Public routes (that need a tree). if ($tree instanceof Tree && $tree->getPreference('imported') === '1') { $routes += [ - 'GET:autocomplete-folder' => 'AutocompleteController@folder', - 'GET:autocomplete-page' => 'AutocompleteController@page', - 'GET:autocomplete-place' => 'AutocompleteController@place', - 'GET:branches' => 'BranchesController@page', - 'GET:branches-list' => 'BranchesController@list', - 'GET:calendar' => 'CalendarController@page', - 'GET:calendar-events' => 'CalendarController@calendar', - 'POST:expand-chart-box' => 'IndividualController@expandChartBox', - 'GET:help-text' => 'HelpTextController@helpText', - 'GET:tree-page' => 'HomePageController@treePage', - 'GET:tree-page-block' => 'HomePageController@treePageBlock', - 'GET:media-thumbnail' => 'MediaFileController@mediaThumbnail', - 'GET:media-download' => 'MediaFileController@mediaDownload', - 'GET:family' => 'FamilyController@show', - 'GET:individual' => 'IndividualController@show', - 'GET:individual-tab' => 'IndividualController@tab', - 'GET:media' => 'MediaController@show', - 'GET:contact' => 'MessageController@contactPage', - 'POST:contact' => 'MessageController@contactAction', - 'GET:message' => 'MessageController@messagePage', - 'POST:message' => 'MessageController@messageAction', - 'GET:note' => 'NoteController@show', - 'GET:source' => 'SourceController@show', - 'GET:record' => 'GedcomRecordController@show', - 'GET:repository' => 'RepositoryController@show', - 'GET:report-list' => 'ReportEngineController@reportList', - 'GET:report-setup' => 'ReportEngineController@reportSetup', - 'GET:report-run' => 'ReportEngineController@reportRun', - 'GET:family-list' => 'ListController@familyList', - 'GET:individual-list' => 'ListController@individualList', - 'GET:media-list' => 'ListController@mediaList', - 'GET:note-list' => 'ListController@noteList', - 'GET:place-hierarchy' => 'PlaceHierarchyController@show', - 'GET:repository-list' => 'ListController@repositoryList', - 'GET:source-list' => 'ListController@sourceList', - 'POST:accept-changes' => 'PendingChangesController@acceptChanges', - 'POST:reject-changes' => 'PendingChangesController@rejectChanges', - 'POST:accept-all-changes' => 'PendingChangesController@acceptAllChanges', - 'POST:reject-all-changes' => 'PendingChangesController@rejectAllChanges', - 'POST:select2-family' => 'AutocompleteController@select2Family', - 'POST:select2-individual' => 'AutocompleteController@select2Individual', - 'POST:select2-media' => 'AutocompleteController@select2MediaObject', - 'POST:select2-note' => 'AutocompleteController@select2Note', - 'POST:select2-source' => 'AutocompleteController@select2Source', - 'POST:select2-submitter' => 'AutocompleteController@select2Submitter', - 'POST:select2-repository' => 'AutocompleteController@select2Repository', - 'GET:search-quick' => 'SearchController@quick', - 'GET:search-advanced' => 'SearchController@advanced', - 'GET:search-general' => 'SearchController@general', - 'GET:search-phonetic' => 'SearchController@phonetic', + 'GET:autocomplete-folder' => 'AutocompleteController@folder', + 'GET:autocomplete-page' => 'AutocompleteController@page', + 'GET:autocomplete-place' => 'AutocompleteController@place', + 'GET:branches' => 'BranchesController@page', + 'GET:branches-list' => 'BranchesController@list', + 'GET:calendar' => 'CalendarController@page', + 'GET:calendar-events' => 'CalendarController@calendar', + 'POST:expand-chart-box' => 'IndividualController@expandChartBox', + 'GET:help-text' => 'HelpTextController@helpText', + 'GET:tree-page' => 'HomePageController@treePage', + 'GET:tree-page-block' => 'HomePageController@treePageBlock', + 'GET:media-thumbnail' => 'MediaFileController@mediaThumbnail', + 'GET:media-download' => 'MediaFileController@mediaDownload', + 'GET:family' => 'FamilyController@show', + 'GET:individual' => 'IndividualController@show', + 'GET:individual-tab' => 'IndividualController@tab', + 'GET:media' => 'MediaController@show', + 'GET:contact' => 'MessageController@contactPage', + 'POST:contact' => 'MessageController@contactAction', + 'GET:message' => 'MessageController@messagePage', + 'POST:message' => 'MessageController@messageAction', + 'GET:note' => 'NoteController@show', + 'GET:source' => 'SourceController@show', + 'GET:record' => 'GedcomRecordController@show', + 'GET:repository' => 'RepositoryController@show', + 'GET:report-list' => 'ReportEngineController@reportList', + 'GET:report-setup' => 'ReportEngineController@reportSetup', + 'GET:report-run' => 'ReportEngineController@reportRun', + 'GET:family-list' => 'ListController@familyList', + 'GET:individual-list' => 'ListController@individualList', + 'GET:media-list' => 'ListController@mediaList', + 'GET:note-list' => 'ListController@noteList', + 'GET:place-hierarchy' => 'PlaceHierarchyController@show', + 'GET:repository-list' => 'ListController@repositoryList', + 'GET:source-list' => 'ListController@sourceList', + 'POST:accept-changes' => 'PendingChangesController@acceptChanges', + 'POST:reject-changes' => 'PendingChangesController@rejectChanges', + 'POST:accept-all-changes' => 'PendingChangesController@acceptAllChanges', + 'POST:reject-all-changes' => 'PendingChangesController@rejectAllChanges', + 'POST:select2-family' => 'AutocompleteController@select2Family', + 'POST:select2-individual' => 'AutocompleteController@select2Individual', + 'POST:select2-media' => 'AutocompleteController@select2MediaObject', + 'POST:select2-note' => 'AutocompleteController@select2Note', + 'POST:select2-source' => 'AutocompleteController@select2Source', + 'POST:select2-submitter' => 'AutocompleteController@select2Submitter', + 'POST:select2-repository' => 'AutocompleteController@select2Repository', + 'GET:search-quick' => 'SearchController@quick', + 'GET:search-advanced' => 'SearchController@advanced', + 'GET:search-general' => 'SearchController@general', + 'GET:search-phonetic' => 'SearchController@phonetic', ]; } |
