xref: /webtrees/resources/views/admin/trees.phtml (revision e252129f69fbec0af9c81ab88481e006f8a0c031)
1<?php use Fisharebest\Webtrees\Auth;
2use Fisharebest\Webtrees\I18N;
3use Fisharebest\Webtrees\Site;
4use Fisharebest\Webtrees\View;
5use Illuminate\Database\Capsule\Manager as DB; ?>
6<?php ?>
7<?php ?>
8<?php ?>
9<?php ?>
10
11<?php if (!empty($all_trees)): ?>
12    <?= view('components/breadcrumbs', ['links' => [route('admin-control-panel') => I18N::translate('Control panel'), $title]]) ?>
13<?php endif ?>
14
15<h1><?= $title ?></h1>
16
17<?php if (empty($all_trees)) : ?>
18    <div class="alert alert-info">
19        <?= I18N::translate('You need to create a family tree.') ?>
20    </div>
21<?php endif ?>
22
23<div id="accordion" role="tablist" aria-multiselectable="true">
24    <?php foreach ($all_trees as $managed_tree) : ?>
25        <?php if (Auth::isManager($managed_tree)) : ?>
26            <div class="card">
27                <div class="card-header" role="tab" id="card-tree-header-<?= $managed_tree->id() ?>">
28                    <h2 class="mb-0">
29                        <?= view('icons/tree') ?>
30                        <a data-toggle="collapse" data-parent="#accordion" href="#card-tree-content-<?= $managed_tree->id() ?>" <?= $managed_tree == $tree || $managed_tree->getPreference('imported') === '0' ? 'aria-expanded="true"' : '' ?> aria-controls="card-tree-content-<?= $managed_tree->id() ?>">
31                            <?= e($managed_tree->name()) ?><?= e($managed_tree->title()) ?>
32                        </a>
33                    </h2>
34                </div>
35                <div id="card-tree-content-<?= $managed_tree->id() ?>" class="collapse<?= $managed_tree == $tree || $managed_tree->getPreference('imported') === '0' ? ' show' : '' ?>" role="tabpanel" aria-labelledby="panel-tree-header-<?= $managed_tree->id() ?>">
36                    <div class="card-body">
37                        <?php $importing = DB::table('gedcom_chunk')->where('gedcom_id', '=', $managed_tree->id())->where('imported', '=', 0)->exists() ?>
38                        <?php if ($importing) : ?>
39                            <div id="import<?= $managed_tree->id() ?>" class="col-xs-12">
40                                <div class="progress">
41                                    <?= I18N::translate('Calculating…') ?>
42                                </div>
43                            </div>
44                            <?php View::push('javascript'); ?>
45                                <script>
46                                    $("#import<?= $managed_tree->id() ?>").load("<?= route('import', ['tree' => $managed_tree->name()]) ?>", {});
47                                </script>
48                                <?php View::endpush() ?>
49                            <?php endif ?>
50                        <div class="row<?= $importing ? ' d-none' : '' ?>" id="actions<?= $managed_tree->id() ?>">
51                            <div class="col-sm-6 col-md-3">
52                                <h3>
53                                    <a href="<?= e(route('tree-page', ['tree' => $managed_tree->name()])) ?>">
54                                        <?= I18N::translate('Family tree') ?>
55                                    </a>
56                                </h3>
57                                <ul class="fa-ul">
58                                    <!-- PREFERENCES -->
59                                    <li>
60                                        <span class="fa-li"><?= view('icons/preferences') ?></span>
61                                        <a href="<?= e(route('admin-trees-preferences', ['tree' => $managed_tree->name()])) ?>">
62                                            <?= I18N::translate('Preferences') ?>
63                                            <span class="sr-only">
64                                        <?= e($managed_tree->title()) ?>
65                                    </span>
66                                        </a>
67                                    </li>
68                                    <!-- PRIVACY -->
69                                    <li>
70                                        <span class="fa-li"><?= view('icons/lock') ?></span>
71                                        <a href="<?= e(route('tree-privacy', ['tree' => $managed_tree->name()])) ?>">
72                                            <?= I18N::translate('Privacy') ?>
73                                            <span class="sr-only">
74                                        <?= e($managed_tree->title()) ?>
75                                    </span>
76                                        </a>
77                                    </li>
78                                    <!-- HOME PAGE BLOCKS-->
79                                    <li>
80                                        <span class="fa-li"><?= view('icons/block') ?></span>
81                                        <a href="<?= e(route('tree-page-edit', ['tree' => $managed_tree->name()])) ?>">
82                                            <?= I18N::translate('Change the “Home page” blocks') ?>
83                                            <span class="sr-only">
84                                        <?= e($managed_tree->title()) ?>
85                                    </span>
86                                        </a>
87                                    </li>
88                                    <!-- DELETE -->
89                                    <?php if (count($all_trees) > 1 && Auth::isAdmin()) : ?>
90                                        <li>
91                                            <span class="fa-li"><?= view('icons/delete') ?></span>
92                                            <a href="#" data-confirm="<?= I18N::translate('Are you sure you want to delete “%s”?', e($managed_tree->title())) ?>" onclick="if (confirm(this.dataset.confirm)) { document.delete_form<?= $managed_tree->id() ?>.submit(); } return false;">
93                                                <?= I18N::translate('Delete') ?>
94                                                <span class="sr-only">
95                                                <?= e($managed_tree->title()) ?>
96                                            </span>
97                                            </a>
98                                            <form method="post" action="<?= route('admin-trees-delete', ['tree' => $managed_tree->name()]) ?>" name="delete_form<?= $managed_tree->id() ?>">
99                                                <?= csrf_field() ?>
100                                                <!-- A11Y - forms need submit buttons, but they look ugly here -->
101                                                <button class="sr-only" data-confirm="<?= I18N::translate('Are you sure you want to delete “%s”?', e($managed_tree->title())) ?>" onclick="return confirm(this.dataset.confirm)" type="submit">
102                                                    <?= I18N::translate('Delete') ?>
103                                                </button>
104                                            </form>
105                                        </li>
106                                    <?php endif ?>
107
108                                    <!-- SET AS DEFAULT -->
109                                    <?php if (count($all_trees) > 1 && Auth::isAdmin()) : ?>
110                                        <li>
111                                            <span class="fa-li"><?= view('icons/favorite') ?></span>
112                                            <?php if ($managed_tree->name() === Site::getPreference('DEFAULT_GEDCOM')) : ?>
113                                                <?= I18N::translate('Default family tree') ?>
114                                            <?php else : ?>
115                                                <a href="#" onclick="document.defaultform<?= $managed_tree->id() ?>.submit();">
116                                                    <?= I18N::translate('Set as default') ?>
117                                                    <span class="sr-only"><?= e($managed_tree->title()) ?></span>
118                                                </a>
119                                                <form method="post" action="<?= route('admin-trees-default', ['tree' => $managed_tree->name()]) ?>" name="defaultform<?= $managed_tree->id() ?>">
120                                                    <?= csrf_field() ?>
121                                                    <!-- A11Y - forms need submit buttons, but they look ugly here -->
122                                                    <button class="sr-only" type="submit">
123                                                        <?= I18N::translate('Set as default') ?>
124                                                    </button>
125                                                </form>
126                                            <?php endif ?>
127                                        </li>
128                                    <?php endif ?>
129                                </ul>
130                            </div>
131                            <div class="col-sm-6 col-md-3">
132                                <h3>
133                                    <?= /* I18N: Individuals, sources, dates, places, etc. */
134                                    I18N::translate('Genealogy data') ?>
135                                </h3>
136                                <ul class="fa-ul">
137                                    <!-- FIND DUPLICATES -->
138                                    <li>
139                                        <span class="fa-li"><?= view('icons/copy') ?></span>
140                                        <a href="<?= e(route('admin-trees-duplicates', ['tree' => $managed_tree->name()])) ?>">
141                                            <?= I18N::translate('Find duplicates') ?>
142                                            <span class="sr-only">
143                                              <?= e($managed_tree->title()) ?>
144                                            </span>
145                                        </a>
146                                    </li>
147                                    <!-- MERGE -->
148                                    <li>
149                                        <span class="fa-li"><?= view('icons/merge') ?></span>
150                                        <a href="<?= e(route('merge-records', ['tree' => $managed_tree->name()])) ?>">
151                                            <?= I18N::translate('Merge records') ?>
152                                            <span class="sr-only">
153                                                <?= e($managed_tree->title()) ?>
154                                          </span>
155                                        </a>
156                                    </li>
157                                    <!-- UPDATE PLACE NAMES -->
158                                    <li>
159                                        <span class="fa-li"><?= view('icons/location') ?></span>
160                                        <a href="<?= e(route('admin-trees-places', ['tree' => $managed_tree->name()])) ?>">
161                                            <?= I18N::translate('Update place names') ?>
162                                            <span class="sr-only">
163                                                <?= e($managed_tree->title()) ?>
164                                            </span>
165                                        </a>
166                                    </li>
167                                    <!-- CHECK FOR ERRORS -->
168                                    <li>
169                                        <span class="fa-li"><?= view('icons/warning') ?></span>
170                                        <a href="<?= e(route('admin-trees-check', ['tree' => $managed_tree->name()])) ?>">
171                                            <?= I18N::translate('Check for errors') ?>
172                                            <span class="sr-only">
173                                                <?= e($managed_tree->title()) ?>
174                                            </span>
175                                        </a>
176                                    </li>
177                                    <!-- UNCONNECTED INDIVIDUALS -->
178                                    <li>
179                                        <span class="fa-li"><?= view('icons/unlink') ?></span>
180                                        <a href="<?= e(route('admin-trees-unconnected', ['tree' => $managed_tree->name()])) ?>">
181                                            <?= I18N::translate('Find unrelated individuals') ?>
182                                            <span class="sr-only">
183                                                <?= e($managed_tree->title()) ?>
184                                            </span>
185                                        </a>
186                                    </li>
187                                    <!-- RENUMBER -->
188                                    <li>
189                                        <span class="fa-li"><?= view('icons/sort') ?></span>
190                                        <a href="<?= e(route('admin-trees-renumber', ['tree' => $managed_tree->name()])) ?>">
191                                            <?= I18N::translate('Renumber') ?>
192                                            <span class="sr-only">
193                                        <?= e($managed_tree->title()) ?>
194                                    </span>
195                                        </a>
196                                    </li>
197                                    <!-- CHANGES -->
198                                    <li>
199                                        <span class="fa-li"><?= view('icons/edit') ?></span>
200                                        <a href="<?= route('admin-changes-log', ['tree' => $managed_tree->name()]) ?>">
201                                            <?= I18N::translate('Changes log') ?>
202                                            <span class="sr-only">
203                                                <?= e($managed_tree->title()) ?>
204                                            </span>
205                                        </a>
206                                    </li>
207                                </ul>
208                            </div>
209                            <div class="clearfix visible-sm-block"></div>
210                            <div class="col-sm-6 col-md-3">
211                                <h3>
212                                    <?= I18N::translate('Add unlinked records') ?>
213                                </h3>
214                                <ul class="fa-ul">
215                                    <!-- UNLINKED INDIVIDUAL -->
216                                    <li>
217                                        <span class="fa-li"><?= view('icons/individual') ?></span>
218                                        <a href="<?= e(route('add-unlinked-individual', ['tree' => $managed_tree->name()])) ?>">
219                                            <?= I18N::translate('Individual') ?>
220                                            <span class="sr-only">
221                                                <?= e($managed_tree->title()) ?>
222                                            </span>
223                                        </a>
224                                    </li>
225                                    <!-- UNLINKED SOURCE -->
226                                    <li>
227                                        <span class="fa-li"><?= view('icons/source') ?></span>
228                                        <a href="#" data-href="<?= e(route('create-source', ['tree' => $managed_tree->name()])) ?>" data-target="#wt-ajax-modal" data-toggle="modal">
229                                            <?= I18N::translate('Source') ?>
230                                            <span class="sr-only">
231                                                <?= e($managed_tree->title()) ?>
232                                            </span>
233                                        </a>
234                                    </li>
235                                    <!-- UNLINKED REPOSITORY -->
236                                    <li>
237                                        <span class="fa-li"><?= view('icons/repository') ?></span>
238                                        <a href="#" data-href="<?= e(route('create-repository', ['tree' => $managed_tree->name()])) ?>" data-target="#wt-ajax-modal" data-toggle="modal">
239                                            <?= I18N::translate('Repository') ?>
240                                            <span class="sr-only">
241                                                <?= e($managed_tree->title()) ?>
242                                            </span>
243                                        </a>
244                                    </li>
245                                    <!-- UNLINKED MEDIA OBJECT -->
246                                    <li>
247                                        <span class="fa-li"><?= view('icons/media') ?></span>
248                                        <a href="#" data-href="<?= e(route('create-media-object', ['tree' => $managed_tree->name()])) ?>" data-target="#wt-ajax-modal" data-toggle="modal">
249
250                                            <?= I18N::translate('Media object') ?>
251                                            <span class="sr-only">
252                                                <?= e($managed_tree->title()) ?>
253                                            </span>
254                                        </a>
255                                    </li>
256                                    <!-- UNLINKED NOTE -->
257                                    <li>
258                                        <span class="fa-li"><?= view('icons/note') ?></span>
259                                        <a href="#" data-href="<?= e(route('create-note-object', ['tree' => $managed_tree->name()])) ?>" data-target="#wt-ajax-modal" data-toggle="modal">
260                                            <span class="sr-only">
261                                                <?= e($managed_tree->title()) ?>
262                                            </span>
263                                            <?= I18N::translate('Shared note') ?>
264                                        </a>
265                                    </li>
266                                    <!-- UNLINKED SUBMITTER -->
267                                    <li>
268                                        <span class="fa-li"><?= view('icons/submitter') ?></span>
269                                        <a href="#" data-href="<?= e(route('create-submitter', ['tree' => $managed_tree->name()])) ?>" data-target="#wt-ajax-modal" data-toggle="modal">
270                                            <span class="sr-only">
271                                                <?= e($managed_tree->title()) ?>
272                                            </span>
273                                            <?= I18N::translate('Submitter') ?>
274                                        </a>
275                                    </li>
276                                </ul>
277                            </div>
278                            <div class="col-sm-6 col-md-3">
279                                <h3>
280                                    <?= I18N::translate('GEDCOM file') ?>
281                                </h3>
282                                <ul class="fa-ul">
283                                    <!-- DOWNLOAD/Export -->
284                                    <li>
285                                        <span class="fa-li"><?= view('icons/download') ?></span>
286                                        <a href="<?= e(route('admin-trees-export', ['tree' => $managed_tree->name()])) ?>">
287                                            <?= I18N::translate('Export') ?>
288                                            <span class="sr-only">
289                                        <?= e($managed_tree->title()) ?>
290                                    </span>
291                                        </a>
292                                    </li>
293                                    <!-- UPLOAD/IMPORT -->
294                                    <li>
295                                        <span class="fa-li"><?= view('icons/upload') ?></span>
296                                        <a href="<?= e(route('admin-trees-import', ['tree' => $managed_tree->name()])) ?>">
297                                            <?= I18N::translate('Import') ?>
298                                            <span class="sr-only">
299                                        <?= e($managed_tree->title()) ?>
300                                    </span>
301                                        </a>
302                                    </li>
303                                </ul>
304                            </div>
305                        </div>
306                    </div>
307                </div>
308            </div>
309        <?php endif ?>
310    <?php endforeach ?>
311
312    <?php if (Auth::isAdmin()) : ?>
313        <div class="card">
314            <div class="card-header" id="card-tree-create-header">
315                <h2 class="mb-0">
316                    <?= view('icons/add') ?>
317                    <a data-toggle="collapse" data-parent="#accordion" href="#card-tree-create-content" aria-controls="card-tree-create-content">
318                        <?= I18N::translate('Create a family tree') ?>
319                    </a>
320                </h2>
321            </div>
322            <div id="card-tree-create-content" class="collapse<?= empty($all_trees) ? ' show' : '' ?>" role="tabpanel" aria-labelledby="card-tree-create-header">
323                <div class="card-body">
324                    <form method="post" action="<?= e(route('admin-trees-create')) ?>" class="form-horizontal">
325                        <?= csrf_field() ?>
326                        <div class="row form-group">
327                            <label for="tree_title" class="col-sm-2 col-form-label">
328                                <?= I18N::translate('Family tree title') ?>
329                            </label>
330                            <div class="col-sm-10">
331                                <input class="form-control" id="tree_title" maxlength="255" name="tree_title" required type="text" placeholder="<?= $default_tree_title ?>">
332                            </div>
333                        </div>
334                        <div class="row form-group">
335                            <label for="tree_name" class="col-sm-2 col-form-label">
336                                <?= I18N::translate('URL') ?>
337                            </label>
338                            <div class="col-sm-10">
339                                <div class="input-group" dir="ltr">
340                                    <div class="input-group-prepend">
341                    <span class="input-group-text" dir="ltr">
342                        <?= e(explode('{tree}', rawurldecode(route('example')))[0]) ?>
343                    </span>
344                                    </div>
345                                    <input class="form-control" id="tree_name" maxlength="31" name="tree_name" pattern="[^&lt;&gt;&amp;&quot;#^$*?{}()\[\]/\\]*" required type="text" value="<?= $default_tree_name ?>" dir="ltr">
346                                    <div class="input-group-append">
347                    <span class="input-group-text" dir="ltr">
348                        <?= e(explode('{tree}', rawurldecode(route('example')))[1]) ?>
349                    </span>
350                                    </div>
351                                </div>
352                                <p class="small text-muted">
353                                    <?= I18N::translate('Avoid spaces and punctuation. A family name might be a good choice.') ?>
354                                </p>
355                            </div>
356                        </div>
357                        <div class="row form-group">
358                            <div class="offset-sm-2 col-sm-10">
359                                <button type="submit" class="btn btn-primary">
360                                    <?= view('icons/save') ?>
361                                    <?= /* I18N: A button label. */
362                                    I18N::translate('create') ?>
363                                </button>
364                                <p class="small text-muted">
365                                    <?= I18N::translate('After creating the family tree, you will be able to import data from a GEDCOM file.') ?>
366                                </p>
367                            </div>
368                        </div>
369                    </form>
370                </div>
371            </div>
372        </div>
373    <?php endif ?>
374
375    <!-- BULK LOAD/SYNCHRONISE GEDCOM FILES -->
376    <?php if (count($gedcom_files) >= $multiple_tree_threshold) : ?>
377        <div class="card">
378            <div class="card-header" id="card-tree-create-header">
379                <h2 class="mb-0">
380                    <?= view('icons/sync') ?>
381                    <a data-toggle="collapse" data-parent="#accordion" href="#synchronize-gedcom-files">
382                        <?= I18N::translate('Synchronize family trees with GEDCOM files') ?>
383                    </a>
384                </h2>
385            </div>
386
387            <div id="synchronize-gedcom-files" class="panel-collapse collapse">
388                <div class="card-body">
389                    <p>
390                        <?= I18N::translate('Create, update, and delete a family tree for every GEDCOM file in the data folder.') ?>
391                    </p>
392                    <form method="post" action="<?= e(route('admin-trees-sync', ['tree' => $tree->name()])) ?>" class="form form-horizontal">
393                        <?= csrf_field() ?>
394                        <button type="submit" class="btn btn-danger">
395                            <?= view('icons/save') ?>
396                            <?= /* I18N: A button label. */
397                            I18N::translate('continue') ?>
398                        </button>
399                        <p class="small text-muted">
400                            <?= I18N::translate('Caution! This may take a long time. Be patient.') ?>
401                        </p>
402                    </form>
403                </div>
404            </div>
405        </div>
406    <?php endif ?>
407</div>
408
409<?= view('modals/ajax') ?>
410