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