summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Roach <fisharebest@webtrees.net>2019-01-30 14:56:06 +0000
committerGreg Roach <fisharebest@webtrees.net>2019-01-30 14:56:06 +0000
commit11eb858145c6c7c490e5c0cd7b0bd51e519264f0 (patch)
treee83560c1cd1603a26124425359ae6293c77ebb7a
parentade503dfba8365d48c21ef618291c1a94004c6e1 (diff)
downloadwebtrees-11eb858145c6c7c490e5c0cd7b0bd51e519264f0.tar.gz
webtrees-11eb858145c6c7c490e5c0cd7b0bd51e519264f0.tar.bz2
webtrees-11eb858145c6c7c490e5c0cd7b0bd51e519264f0.zip
Add themes to the control panel
-rw-r--r--app/Http/Controllers/Admin/ModuleController.php55
-rw-r--r--app/Http/Controllers/AdminController.php7
-rw-r--r--app/Module/ModuleExternalUrlTrait.php2
-rw-r--r--app/Module/ModuleLanguageInterface.php45
-rw-r--r--app/Module/ModuleLanguageTrait.php31
-rw-r--r--resources/views/admin/control-panel.phtml14
-rw-r--r--resources/views/admin/modules.phtml17
-rw-r--r--resources/views/icons/language.phtml1
-rw-r--r--routes/web.php104
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',
];
}