xref: /webtrees/app/Module/ColorsTheme.php (revision 59597b37d69e8147c3f4a27643e9c8edaa2a0592)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2019 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Module;
21
22use Fisharebest\Webtrees\Auth;
23use Fisharebest\Webtrees\I18N;
24use Fisharebest\Webtrees\Menu;
25use Fisharebest\Webtrees\Session;
26use Fisharebest\Webtrees\Site;
27use Fisharebest\Webtrees\Tree;
28use Psr\Http\Message\ServerRequestInterface;
29
30use function app;
31use function uasort;
32
33/**
34 * The colors theme.
35 */
36class ColorsTheme extends CloudsTheme
37{
38    /**
39     * How should this module be identified in the control panel, etc.?
40     *
41     * @return string
42     */
43    public function title(): string
44    {
45        /* I18N: Name of a theme. */
46        return I18N::translate('colors');
47    }
48
49    /**
50     * Generate a list of items for the user menu.
51     *
52     * @param Tree|null $tree
53     *
54     * @return Menu[]
55     */
56    public function userMenu(?Tree $tree): array
57    {
58        return array_filter([
59            $this->menuPendingChanges($tree),
60            $this->menuMyPages($tree),
61            $this->menuThemes(),
62            $this->menuPalette(),
63            $this->menuLanguages(),
64            $this->menuLogin(),
65            $this->menuLogout(),
66        ]);
67    }
68
69    /**
70     * Create a menu of palette options
71     *
72     * @return Menu
73     */
74    public function menuPalette(): Menu
75    {
76        $request = app(ServerRequestInterface::class);
77
78        /* I18N: A colour scheme */
79        $menu = new Menu(I18N::translate('Palette'), '#', 'menu-color');
80
81        foreach ($this->palettes() as $palette_id => $palette_name) {
82            $url = $request->getAttribute((string) $request->getUri());
83            $url = preg_replace('/&themecolor=[a-z]+/', '', $url);
84            $url .= '&themecolor=' . $palette_id;
85
86            $menu->addSubmenu(new Menu(
87                $palette_name,
88                '#',
89                'menu-color-' . $palette_id . ($this->palette() === $palette_id ? ' active' : ''),
90                [
91                    'onclick' => 'document.location=\'' . $url . '\'',
92                ]
93            ));
94        }
95
96        return $menu;
97    }
98
99    /**
100     * @return string[]
101     */
102    private function palettes(): array
103    {
104        $palettes = [
105            /* I18N: The name of a colour-scheme */
106            'aquamarine'       => I18N::translate('Aqua Marine'),
107            /* I18N: The name of a colour-scheme */
108            'ash'              => I18N::translate('Ash'),
109            /* I18N: The name of a colour-scheme */
110            'belgianchocolate' => I18N::translate('Belgian Chocolate'),
111            /* I18N: The name of a colour-scheme */
112            'bluelagoon'       => I18N::translate('Blue Lagoon'),
113            /* I18N: The name of a colour-scheme */
114            'bluemarine'       => I18N::translate('Blue Marine'),
115            /* I18N: The name of a colour-scheme */
116            'coffeeandcream'   => I18N::translate('Coffee and Cream'),
117            /* I18N: The name of a colour-scheme */
118            'coldday'          => I18N::translate('Cold Day'),
119            /* I18N: The name of a colour-scheme */
120            'greenbeam'        => I18N::translate('Green Beam'),
121            /* I18N: The name of a colour-scheme */
122            'mediterranio'     => I18N::translate('Mediterranio'),
123            /* I18N: The name of a colour-scheme */
124            'mercury'          => I18N::translate('Mercury'),
125            /* I18N: The name of a colour-scheme */
126            'nocturnal'        => I18N::translate('Nocturnal'),
127            /* I18N: The name of a colour-scheme */
128            'olivia'           => I18N::translate('Olivia'),
129            /* I18N: The name of a colour-scheme */
130            'pinkplastic'      => I18N::translate('Pink Plastic'),
131            /* I18N: The name of a colour-scheme */
132            'sage'             => I18N::translate('Sage'),
133            /* I18N: The name of a colour-scheme */
134            'shinytomato'      => I18N::translate('Shiny Tomato'),
135            /* I18N: The name of a colour-scheme */
136            'tealtop'          => I18N::translate('Teal Top'),
137        ];
138
139        uasort($palettes, '\Fisharebest\Webtrees\I18N::strcasecmp');
140
141        return $palettes;
142    }
143
144    /**
145     * @return string
146     */
147    private function palette(): string
148    {
149        $palettes = $this->palettes();
150
151        // If we've selected a new palette, and we are logged in, set this value as a default.
152        if (isset($_GET['themecolor'])) {
153            // Request to change color
154            $palette = $_GET['themecolor'];
155            Auth::user()->setPreference('themecolor', $palette);
156            if (Auth::isAdmin()) {
157                Site::setPreference('DEFAULT_COLOR_PALETTE', $palette);
158            }
159            unset($_GET['themecolor']);
160            // Rember that we have selected a value
161            Session::put('subColor', $palette);
162        }
163
164        // If we are logged in, use our preference
165        $palette = Auth::user()->getPreference('themecolor');
166
167        // If not logged in or no preference, use one we selected earlier in the session?
168        if (!$palette) {
169            $palette = Session::get('subColor');
170        }
171
172        // We haven't selected one this session? Use the site default
173        if (!$palette) {
174            $palette = Site::getPreference('DEFAULT_COLOR_PALETTE');
175        }
176
177        // Make sure our selected palette actually exists
178        if (!array_key_exists($palette, $palettes)) {
179            $palette = 'ash';
180        }
181
182        return $palette;
183    }
184
185    /**
186     * A list of CSS files to include for this page.
187     *
188     * @return string[]
189     */
190    public function stylesheets(): array
191    {
192        return [
193            asset('css/colors.min.css'),
194            asset('css/colors/' . $this->palette() . '.min.css'),
195        ];
196    }
197}
198