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