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