xref: /webtrees/resources/views/admin/control-panel.phtml (revision 30158ae76837ce51811d3e0fca2ea5852182f42e)
1<?php use Fisharebest\Webtrees\I18N; ?>
2
3<h1><?= $title ?></h1>
4
5<!-- WEBSITE / WEBTREES -->
6<div class="card mb-4">
7    <div class="card-header">
8        <h2 class="mb-0">
9            <?= I18N::translate('Website') ?>
10            <span class="badge badge-secondary">
11                <?= WT_VERSION ?>
12            </span>
13        </h2>
14    </div>
15    <div class="card-body">
16        <?php foreach ($server_warnings as $server_warning) : ?>
17            <p class="alert alert-warning"><?= $server_warning ?></p>
18        <?php endforeach ?>
19
20        <p class="card-text">
21            <?= /* I18N: %s is a URL/link to the project website */
22            I18N::translate('Support and documentation can be found at %s.', '<a href="https://webtrees.net/">webtrees.net</a>') ?>
23        </p>
24        <p class="card-text ">
25            <?php if ($latest_version === '') : ?>
26                <?= I18N::translate('No upgrade information is available.') ?>
27            <?php elseif (version_compare(WT_VERSION, $latest_version) < 0) : ?>
28                <?= I18N::translate('A new version of webtrees is available.') ?>
29                <a href="<?= e(route('upgrade')) ?>" class="error">
30                    <?= /* I18N: %s is a version number */
31                    I18N::translate('Upgrade to webtrees %s.', e($latest_version)) ?>
32                </a>
33            <?php else : ?>
34                <?= I18N::translate('This is the latest version of webtrees. No upgrade is available.') ?>
35            <?php endif ?>
36        </p>
37
38        <div class="row">
39            <div class="col-sm-6">
40                <ul class="fa-ul">
41                    <li>
42                        <span class="fa-li"><?= view('icons/preferences') ?></span>
43                        <a href="<?= e(route('admin-site-preferences')) ?>">
44                            <?= I18N::translate('Website preferences') ?>
45                        </a>
46                    </li>
47                    <li>
48                        <span class="fa-li"><?= view('icons/preferences') ?></span>
49                        <a href="<?= e(route('admin-site-mail')) ?>">
50                            <?= I18N::translate('Sending email') ?>
51                        </a>
52                    </li>
53                    <li>
54                        <span class="fa-li"><?= view('icons/preferences') ?></span>
55                        <a href="<?= e(route('admin-site-registration')) ?>">
56                            <?= I18N::translate('Sign-in and registration') ?>
57                        </a>
58                    </li>
59                    <li>
60                        <span class="fa-li"><?= view('icons/preferences') ?></span>
61                        <a href="<?= e(route('admin-site-languages')) ?>">
62                            <?= I18N::translate('Languages') ?>
63                        </a>
64                    </li>
65                    <li>
66                        <span class="fa-li"><?= view('icons/preferences') ?></span>
67                        <a href="<?= e(route('admin-site-analytics')) ?>">
68                            <?= I18N::translate('Tracking and analytics') ?>
69                        </a>
70                    </li>
71                </ul>
72            </div>
73            <div class="col-sm-6">
74                <ul class="fa-ul">
75                    <li>
76                        <span class="fa-li"><?= view('icons/preferences') ?></span>
77                        <a href="<?= e(route('admin-site-logs')) ?>">
78                            <?= I18N::translate('Website logs') ?>
79                        </a>
80                    </li>
81                    <li>
82                        <span class="fa-li"><?= view('icons/preferences') ?></span>
83                        <a href="<?= e(route('admin-clean-data')) ?>">
84                            <?= I18N::translate('Clean up data folder') ?>
85                        </a>
86                    </li>
87                    <li>
88                        <span class="fa-li"><?= view('icons/preferences') ?></span>
89                        <a href="<?= e(route('admin-site-information')) ?>">
90                            <?= I18N::translate('Server information') ?>
91                        </a>
92                    </li>
93                </ul>
94            </div>
95        </div>
96    </div>
97</div>
98
99<!-- FAMILY TREES -->
100<div class="card mb-4 <?= array_sum($changes) ? 'card-outline-danger' : '' ?>">
101    <div class="card-header">
102        <h2 class="mb-0">
103            <?= I18N::translate('Family trees') ?>
104            <span class="badge badge-secondary">
105                    <?= I18N::number(count($all_trees)) ?>
106                </span>
107        </h2>
108    </div>
109    <div class="card-body">
110        <table class="table table-sm">
111            <caption class="sr-only">
112                <?= I18N::translate('Family trees') ?>
113            </caption>
114            <thead>
115                <tr>
116                    <th><?= I18N::translate('Family tree') ?></th>
117                    <th><span class="sr-only"><?= I18N::translate('Manage family trees') ?></span></th>
118                    <th class="text-right"><?= I18N::translate('Pending changes') ?></th>
119                    <th class="d-none d-sm-table-cell text-right"><?= I18N::translate('Individuals') ?></th>
120                    <th class="d-none d-lg-table-cell text-right"><?= I18N::translate('Families') ?></th>
121                    <th class="d-none d-sm-table-cell text-right"><?= I18N::translate('Sources') ?></th>
122                    <th class="d-none d-lg-table-cell text-right"><?= I18N::translate('Repositories') ?></th>
123                    <th class="d-none d-sm-table-cell text-right"><?= I18N::translate('Media') ?></th>
124                    <th class="d-none d-lg-table-cell text-right"><?= I18N::translate('Notes') ?></th>
125                </tr>
126            </thead>
127            <tbody>
128                <?= view('admin/control-panel-tree-list', [
129                    'all_trees'    => $all_trees,
130                    'changes'      => $changes,
131                    'individuals'  => $individuals,
132                    'families'     => $families,
133                    'sources'      => $sources,
134                    'repositories' => $repositories,
135                    'media'        => $media,
136                    'notes'        => $notes,
137                ]); ?>
138            </tbody>
139            <tfoot>
140                <tr>
141                    <th scope="row">
142                        <?= I18N::translate('Total') ?>
143                    </th>
144                    <td></td>
145                    <td class="text-right">
146                        <?= I18N::number(array_sum($changes)) ?>
147                    </td>
148                    <td class="d-none d-sm-table-cell text-right">
149                        <?= I18N::number(array_sum($individuals)) ?>
150                    </td>
151                    <td class="d-none d-lg-table-cell text-right">
152                        <?= I18N::number(array_sum($families)) ?>
153                    </td>
154                    <td class="d-none d-sm-table-cell text-right">
155                        <?= I18N::number(array_sum($sources)) ?>
156                    </td>
157                    <td class="d-none d-lg-table-cell text-right">
158                        <?= I18N::number(array_sum($repositories)) ?>
159                    </td>
160                    <td class="d-none d-sm-table-cell text-right">
161                        <?= I18N::number(array_sum($media)) ?>
162                    </td>
163                    <td class="d-none d-lg-table-cell text-right">
164                        <?= I18N::number(array_sum($notes)) ?>
165                    </td>
166                </tr>
167            </tfoot>
168        </table>
169
170        <ul class="fa-ul">
171            <li>
172                <span class="fa-li"><?= view('icons/preferences') ?></span>
173                <a href="<?= e(route('admin-trees', ['ged' => $tree->name()])) ?>">
174                    <?= I18N::translate('Manage family trees') ?>
175                </a>
176            </li>
177            <li>
178                <span class="fa-li"><?= view('icons/preferences') ?></span>
179                <a href="<?= e(route('tree-page-default-edit')) ?>">
180                    <?= I18N::translate('Set the default blocks for new family trees') ?>
181                </a>
182            </li>
183            <?php if (count($all_trees) > 1) : ?>
184                <li>
185                    <span class="fa-li"><?= view('icons/preferences') ?></span>
186                    <a href="<?= e(route('admin-trees-merge')) ?>">
187                        <?= I18N::translate('Merge family trees') ?>
188                    </a>
189                </li>
190            <?php endif ?>
191        </ul>
192    </div>
193</div>
194
195<!-- USERS -->
196<div class="card mb-4 <?= $unapproved || $unverified ? 'card-outline-danger' : '' ?>">
197    <div class="card-header">
198        <h2 class="mb-0">
199            <?= I18N::translate('Users') ?>
200            <span class="badge badge-secondary">
201                    <?= I18N::number(count($all_users)) ?>
202                </span>
203        </h2>
204    </div>
205    <div class="card-body">
206        <dl class="row">
207            <?php foreach ([I18N::translate('Administrators') => $administrators, I18N::translate('Managers') => $managers, I18N::translate('Moderators') => $moderators, I18N::translate('Not verified by the user') => $unverified, I18N::translate('Not approved by an administrator') => $unapproved] as $label => $list) : ?>
208                <?php if (!empty($list)) : ?>
209                    <dt class="col-sm-3">
210                        <?= $label ?>
211                    </dt>
212                    <dd class="col-sm-9">
213                        <?php foreach ($list as $n => $user) : ?>
214                            <?= $n ? I18N::$list_separator : '' ?>
215                            <a href="<?= e(route('admin-users-edit', ['user_id' => $user->getUserId()])) ?>" dir="auto">
216                                <?= e($user->getRealName()) ?>
217                            </a>
218                        <?php endforeach ?>
219                    </dd>
220                <?php endif ?>
221            <?php endforeach ?>
222        </dl>
223
224        <div class="row">
225            <div class="col-sm-6">
226                <ul class="fa-ul">
227                    <li>
228                        <span class="fa-li"><?= view('icons/preferences') ?></span>
229                        <a href="<?= e(route('admin-users', ['ged' => $tree->name()])) ?>">
230                            <?= I18N::translate('User administration') ?>
231                        </a>
232                    </li>
233                    <li>
234                        <span class="fa-li"><?= view('icons/preferences') ?></span>
235                        <a href="<?= e(route('admin-users-create', ['ged' => $tree->name()])) ?>">
236                            <?= I18N::translate('Add a user') ?>
237                        </a>
238                    </li>
239                    <li>
240                        <span class="fa-li"><?= view('icons/preferences') ?></span>
241                        <a href="<?= e(route('admin-users-cleanup')) ?>">
242                            <?= I18N::translate('Delete inactive users') ?>
243                        </a>
244                    </li>
245                    <li>
246                        <span class="fa-li"><?= view('icons/preferences') ?></span>
247                        <a href="<?= e(route('user-page-default-edit')) ?>">
248                            <?= I18N::translate('Set the default blocks for new users') ?>
249                        </a>
250                    </li>
251                </ul>
252            </div>
253            <div class="col-sm-6">
254                <ul class="fa-ul">
255                    <li>
256                        <span class="fa-li"><?= view('icons/email') ?></span>
257                        <a href="<?= e(route('broadcast', ['to' => 'all'])) ?>">
258                            <?= I18N::translate('Send a message to all users') ?>
259                        </a>
260                    </li>
261                    <li>
262                        <span class="fa-li"><?= view('icons/email') ?></span>
263                        <a href="<?= e(route('broadcast', ['to' => 'never_logged'])) ?>">
264                            <?= I18N::translate('Send a message to users who have never signed in') ?>
265                        </a>
266                    </li>
267                    <li>
268                        <span class="fa-li"><?= view('icons/email') ?></span>
269                        <a href="<?= e(route('broadcast', ['to' => 'last_6mo'])) ?>">
270                            <?= I18N::translate('Send a message to users who have not signed in for 6 months') ?>
271                        </a>
272                    </li>
273                </ul>
274            </div>
275        </div>
276    </div>
277</div>
278
279<!-- MODULES -->
280<div class="card mb-4">
281    <div class="card-header">
282        <h2 class="mb-0">
283            <?= I18N::translate('Modules') ?>
284            <span class="badge badge-secondary">
285                <?= I18N::number(count($all_modules)) ?>
286            </span>
287        </h2>
288    </div>
289    <div class="card-body">
290        <div class="row">
291            <div class="col-sm-6">
292                <ul class="fa-ul">
293                    <li>
294                        <span class="fa-li"><?= view('icons/menu') ?></span>
295                        <a href="<?= e(route('admin-menus')) ?>">
296                            <?= I18N::translate('Menus') ?>
297                        </a>
298                    </li>
299                    <li>
300                        <span class="fa-li"><?= view('icons/tab') ?></span>
301                        <a href="<?= e(route('admin-tabs')) ?>">
302                            <?= I18N::translate('Tabs') ?>
303                        </a>
304                    </li>
305                    <li>
306                        <span class="fa-li"><?= view('icons/block') ?></span>
307                        <a href="<?= e(route('admin-blocks')) ?>">
308                            <?= I18N::translate('Blocks') ?>
309                        </a>
310                    </li>
311                    <li>
312                        <span class="fa-li"><?= view('icons/sidebar') ?></span>
313                        <a href="<?= e(route('admin-sidebars')) ?>">
314                            <?= I18N::translate('Sidebars') ?>
315                        </a>
316                    </li>
317                    <li>
318                        <span class="fa-li"><?= view('icons/chart') ?></span>
319                        <a href="<?= e(route('admin-charts')) ?>">
320                            <?= I18N::translate('Charts') ?>
321                        </a>
322                    </li>
323                    <li>
324                        <span class="fa-li"><?= view('icons/report') ?></span>
325                        <a href="<?= e(route('admin-reports')) ?>">
326                            <?= I18N::translate('Reports') ?>
327                        </a>
328                    </li>
329                </ul>
330            </div>
331            <div class="col-sm-6">
332                <ul class="fa-ul">
333                    <?php foreach ($config_modules as $module) : ?>
334                        <li>
335                            <span class="fa-li"><?= view('icons/preferences') ?></span>
336                            <a href="<?= e($module->getConfigLink()) ?>">
337                                <?= $module->getTitle() ?>
338                            </a>
339                        </li>
340                    <?php endforeach ?>
341                </ul>
342            </div>
343        </div>
344
345        <ul class="fa-ul">
346            <li>
347                <span class="fa-li"><?= view('icons/preferences') ?></span>
348                <a href="<?= e(route('admin-modules')) ?>">
349                    <?= I18N::translate('Module administration') ?>
350                </a>
351            </li>
352        </ul>
353    </div>
354</div>
355
356<!-- MEDIA -->
357<div class="card mb-4">
358    <div class="card-header">
359        <h2 class="mb-0">
360            <?= I18N::translate('Media') ?>
361        </h2>
362    </div>
363    <div class="card-body">
364        <ul class="fa-ul">
365            <li>
366                <span class="fa-li"><?= view('icons/preferences') ?></span>
367                <a href="<?= e(route('admin-media')) ?>">
368                    <?= I18N::translate('Manage media') ?>
369                </a>
370            </li>
371            <li>
372                <span class="fa-li"><?= view('icons/preferences') ?></span>
373                <a href="<?= e(route('admin-media-upload')) ?>">
374                    <?= I18N::translate('Upload media files') ?>
375                </a>
376            </li>
377            <li>
378                <span class="fa-li"><?= view('icons/preferences') ?></span>
379                <a href="<?= e(route('admin-fix-level-0-media')) ?>">
380                    <?= I18N::translate('Link media objects to facts and events') ?>
381                </a>
382            </li>
383            <li>
384                <span class="fa-li"><?= view('icons/preferences') ?></span>
385                <a href="<?= e(route('admin-webtrees1-thumbs')) ?>">
386                    <?= I18N::translate('Import custom thumbnails from webtrees version 1') ?>
387                </a>
388            </li>
389        </ul>
390    </div>
391</div>
392
393<!-- MAPS -->
394<div class="card mb-4">
395    <div class="card-header">
396        <h2 class="mb-0">
397            <?= I18N::translate('Map') ?>
398        </h2>
399    </div>
400    <div class="card-body">
401        <div class="row">
402            <div class="col-sm-6">
403                <ul class="fa-ul">
404                    <li>
405                        <span class="fa-li"><?= view('icons/location') ?></span>
406                        <a href="<?= e(route('map-data')) ?>">
407                            <?= I18N::translate('Geographic data') ?>
408                        </a>
409                    </li>
410                </ul>
411            </div>
412            <div class="col-sm-6">
413                <ul class="fa-ul">
414                    <li>
415                        <span class="fa-li"><?= view('icons/map') ?></span>
416                        <a href="<?= e(route('map-provider')) ?>">
417                            <?= I18N::translate('Map provider') ?>
418                        </a>
419                    </li>
420                </ul>
421            </div>
422        </div>
423    </div>
424</div>
425
426<!-- OLD FILES -->
427<?php if (!empty($files_to_delete)) : ?>
428    <div class="card mb-4 card-outline-danger">
429        <div class="card-header">
430            <h2 class="mb-0">
431                <?= I18N::translate('Old files found') ?>
432            </h2>
433        </div>
434        <div class="card-body">
435            <p>
436                <?= I18N::translate('Files have been found from a previous version of webtrees. Old files can sometimes be a security risk. You should delete them.') ?>
437            </p>
438            <ul class="list-unstyled">
439                <?php foreach ($files_to_delete as $file_to_delete) : ?>
440                    <li dir="ltr"><code><?= e($file_to_delete) ?></code></li>
441                <?php endforeach ?>
442            </ul>
443        </div>
444    </div>
445<?php endif ?>
446