diff options
62 files changed, 930 insertions, 287 deletions
diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 33feff4971..045d03f7bf 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -27,9 +27,12 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Controller to allow the user to edit their account details. @@ -65,6 +68,8 @@ class AccountController extends AbstractBaseController public function edit(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); $my_individual_record = Individual::getInstance($tree->getUserPreference(Auth::user(), 'gedcomid'), $tree); diff --git a/app/Http/Controllers/Admin/LocationController.php b/app/Http/Controllers/Admin/LocationController.php index 7b0f2b0d81..eeb0af9047 100644 --- a/app/Http/Controllers/Admin/LocationController.php +++ b/app/Http/Controllers/Admin/LocationController.php @@ -25,10 +25,12 @@ use Fisharebest\Webtrees\Http\RequestHandlers\ControlPanel; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Location; use Fisharebest\Webtrees\Services\GedcomService; +use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\JoinClause; use Illuminate\Database\QueryException; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\UploadedFileInterface; @@ -39,6 +41,7 @@ use function addcslashes; use function array_filter; use function array_pop; use function array_shift; +use function assert; use function count; use function explode; use function fclose; @@ -727,6 +730,7 @@ class LocationController extends AbstractAdminController public function importLocationsFromTree(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); // Get all the places from the places table ... $places = DB::table('places AS p0') diff --git a/app/Http/Controllers/Admin/UpgradeController.php b/app/Http/Controllers/Admin/UpgradeController.php index c1f50c2531..7222b78d9a 100644 --- a/app/Http/Controllers/Admin/UpgradeController.php +++ b/app/Http/Controllers/Admin/UpgradeController.php @@ -27,6 +27,7 @@ use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Webtrees; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Collection; +use InvalidArgumentException; use League\Flysystem\Adapter\Local; use League\Flysystem\Cached\CachedAdapter; use League\Flysystem\Cached\Storage\Memory; @@ -37,6 +38,7 @@ use Psr\Http\Message\ServerRequestInterface; use RuntimeException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Throwable; +use function assert; /** * Controller for upgrading to a new version of webtrees. diff --git a/app/Http/Controllers/AdminTreesController.php b/app/Http/Controllers/AdminTreesController.php index 4d14cd04ab..bde81f2151 100644 --- a/app/Http/Controllers/AdminTreesController.php +++ b/app/Http/Controllers/AdminTreesController.php @@ -48,6 +48,7 @@ use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; +use InvalidArgumentException; use League\Flysystem\Filesystem; use League\Flysystem\MountManager; use League\Flysystem\ZipArchive\ZipArchiveAdapter; @@ -61,6 +62,7 @@ use Throwable; use function addcslashes; use function app; +use function assert; use function fclose; use function fopen; use function is_dir; @@ -117,6 +119,7 @@ class AdminTreesController extends AbstractBaseController public function check(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); // We need to work with raw GEDCOM data, as we are looking for errors // which may prevent the GedcomRecord objects from working. @@ -1710,6 +1713,8 @@ class AdminTreesController extends AbstractBaseController public function setDefault(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + Site::setPreference('DEFAULT_GEDCOM', $tree->name()); /* I18N: %s is the name of a family tree */ @@ -1728,6 +1733,8 @@ class AdminTreesController extends AbstractBaseController public function synchronize(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $url = route('manage-trees', ['tree' => $tree->name()]); $gedcom_files = $this->gedcomFiles(WT_DATA_DIR); diff --git a/app/Http/Controllers/EditFamilyController.php b/app/Http/Controllers/EditFamilyController.php index 65912fb412..5c01737708 100644 --- a/app/Http/Controllers/EditFamilyController.php +++ b/app/Http/Controllers/EditFamilyController.php @@ -38,67 +38,6 @@ class EditFamilyController extends AbstractEditController * * @return ResponseInterface */ - public function reorderChildren(ServerRequestInterface $request): ResponseInterface - { - $tree = $request->getAttribute('tree'); - $xref = $request->getQueryParams()['xref']; - $family = Family::getInstance($xref, $tree); - - Auth::checkFamilyAccess($family, true); - - $title = $family->fullName() . ' — ' . I18N::translate('Re-order children'); - - return $this->viewResponse('edit/reorder-children', [ - 'title' => $title, - 'family' => $family, - ]); - } - - /** - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function reorderChildrenAction(ServerRequestInterface $request): ResponseInterface - { - $tree = $request->getAttribute('tree'); - $xref = $request->getParsedBody()['xref']; - $order = $request->getParsedBody()['order'] ?? []; - $family = Family::getInstance($xref, $tree); - - Auth::checkFamilyAccess($family, true); - - $dummy_facts = ['0 @' . $family->xref() . '@ FAM']; - $sort_facts = []; - $keep_facts = []; - - // Split facts into FAMS and other - foreach ($family->facts() as $fact) { - if ($fact->getTag() === 'CHIL') { - $sort_facts[$fact->id()] = $fact->gedcom(); - } else { - $keep_facts[] = $fact->gedcom(); - } - } - - // Sort the facts - uksort($sort_facts, static function ($x, $y) use ($order) { - return array_search($x, $order, true) - array_search($y, $order, true); - }); - - // Merge the facts - $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts)); - - $family->updateRecord($gedcom, false); - - return redirect($family->url()); - } - - /** - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ public function addChild(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); diff --git a/app/Http/Controllers/EditGedcomRecordController.php b/app/Http/Controllers/EditGedcomRecordController.php index a2075900b5..fabf83fe05 100644 --- a/app/Http/Controllers/EditGedcomRecordController.php +++ b/app/Http/Controllers/EditGedcomRecordController.php @@ -28,9 +28,12 @@ use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Module\CensusAssistantModule; use Fisharebest\Webtrees\Services\ClipboardService; use Fisharebest\Webtrees\Services\ModuleService; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use function assert; /** * Controller for edit forms and responses. @@ -306,6 +309,8 @@ class EditGedcomRecordController extends AbstractEditController public function addFact(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $fact = $request->getQueryParams()['fact']; diff --git a/app/Http/Controllers/EditIndividualController.php b/app/Http/Controllers/EditIndividualController.php index 2a87c60132..e708ac85a9 100644 --- a/app/Http/Controllers/EditIndividualController.php +++ b/app/Http/Controllers/EditIndividualController.php @@ -23,199 +23,20 @@ use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\GedcomCode\GedcomCodePedi; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use function assert; + /** * Controller for edit forms and responses. */ class EditIndividualController extends AbstractEditController { - /** - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function reorderMedia(ServerRequestInterface $request): ResponseInterface - { - $tree = $request->getAttribute('tree'); - $xref = $request->getQueryParams()['xref']; - $individual = Individual::getInstance($xref, $tree); - - Auth::checkIndividualAccess($individual, true); - - $title = $individual->fullName() . ' — ' . I18N::translate('Re-order media'); - - return $this->viewResponse('edit/reorder-media', [ - 'title' => $title, - 'individual' => $individual, - ]); - } - - /** - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function reorderMediaAction(ServerRequestInterface $request): ResponseInterface - { - $tree = $request->getAttribute('tree'); - $xref = $request->getParsedBody()['xref']; - $order = $request->getParsedBody()['order'] ?? []; - $individual = Individual::getInstance($xref, $tree); - - Auth::checkIndividualAccess($individual, true); - - $dummy_facts = ['0 @' . $individual->xref() . '@ INDI']; - $sort_facts = []; - $keep_facts = []; - - // Split facts into OBJE and other - foreach ($individual->facts() as $fact) { - if ($fact->getTag() === 'OBJE') { - $sort_facts[$fact->id()] = $fact->gedcom(); - } else { - $keep_facts[] = $fact->gedcom(); - } - } - - // Sort the facts - uksort($sort_facts, static function ($x, $y) use ($order) { - return array_search($x, $order, true) - array_search($y, $order, true); - }); - - // Merge the facts - $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts)); - - $individual->updateRecord($gedcom, false); - - return redirect($individual->url()); - } - - /** - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function reorderNames(ServerRequestInterface $request): ResponseInterface - { - $tree = $request->getAttribute('tree'); - $xref = $request->getQueryParams()['xref']; - $individual = Individual::getInstance($xref, $tree); - - Auth::checkIndividualAccess($individual, true); - - $title = $individual->fullName() . ' — ' . I18N::translate('Re-order names'); - - return $this->viewResponse('edit/reorder-names', [ - 'title' => $title, - 'individual' => $individual, - ]); - } - - /** - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function reorderNamesAction(ServerRequestInterface $request): ResponseInterface - { - $tree = $request->getAttribute('tree'); - $xref = $request->getParsedBody()['xref']; - $order = $request->getParsedBody()['order'] ?? []; - $individual = Individual::getInstance($xref, $tree); - - Auth::checkIndividualAccess($individual, true); - - $dummy_facts = ['0 @' . $individual->xref() . '@ INDI']; - $sort_facts = []; - $keep_facts = []; - - // Split facts into NAME and other - foreach ($individual->facts() as $fact) { - if ($fact->getTag() === 'NAME') { - $sort_facts[$fact->id()] = $fact->gedcom(); - } else { - $keep_facts[] = $fact->gedcom(); - } - } - - // Sort the facts - uksort($sort_facts, static function ($x, $y) use ($order) { - return array_search($x, $order, true) - array_search($y, $order, true); - }); - - // Merge the facts - $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts)); - - $individual->updateRecord($gedcom, false); - - return redirect($individual->url()); - } - - /** - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function reorderSpouses(ServerRequestInterface $request): ResponseInterface - { - $tree = $request->getAttribute('tree'); - $xref = $request->getQueryParams()['xref']; - $individual = Individual::getInstance($xref, $tree); - - Auth::checkIndividualAccess($individual, true); - - $title = $individual->fullName() . ' — ' . I18N::translate('Re-order families'); - - return $this->viewResponse('edit/reorder-spouses', [ - 'title' => $title, - 'individual' => $individual, - ]); - } - - /** - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function reorderSpousesAction(ServerRequestInterface $request): ResponseInterface - { - $tree = $request->getAttribute('tree'); - $xref = $request->getParsedBody()['xref']; - $order = $request->getParsedBody()['order'] ?? []; - $individual = Individual::getInstance($xref, $tree); - - Auth::checkIndividualAccess($individual, true); - - $dummy_facts = ['0 @' . $individual->xref() . '@ INDI']; - $sort_facts = []; - $keep_facts = []; - - // Split facts into FAMS and other - foreach ($individual->facts() as $fact) { - if ($fact->getTag() === 'FAMS') { - $sort_facts[$fact->id()] = $fact->gedcom(); - } else { - $keep_facts[] = $fact->gedcom(); - } - } - - // Sort the facts - uksort($sort_facts, static function ($x, $y) use ($order) { - return array_search($x, $order, true) - array_search($y, $order, true); - }); - - // Merge the facts - $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts)); - - $individual->updateRecord($gedcom, false); - - return redirect($individual->url()); - } - - /** + /** * Add a child to an existing individual (creating a one-parent family). * * @param ServerRequestInterface $request @@ -413,6 +234,8 @@ class EditIndividualController extends AbstractEditController public function addSpouse(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -518,6 +341,7 @@ class EditIndividualController extends AbstractEditController public function addUnlinked(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); return $this->viewResponse('edit/new-individual', [ 'next_action' => 'add-unlinked-individual-action', @@ -612,6 +436,8 @@ class EditIndividualController extends AbstractEditController public function editNameAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getParsedBody()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -632,6 +458,8 @@ class EditIndividualController extends AbstractEditController public function addName(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -660,6 +488,8 @@ class EditIndividualController extends AbstractEditController public function addNameAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getParsedBody()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -679,6 +509,8 @@ class EditIndividualController extends AbstractEditController public function linkChildToFamily(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -747,6 +579,8 @@ class EditIndividualController extends AbstractEditController public function linkSpouseToIndividual(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); diff --git a/app/Http/Controllers/EditMediaController.php b/app/Http/Controllers/EditMediaController.php index 576acb8c1d..81f64d9a9e 100644 --- a/app/Http/Controllers/EditMediaController.php +++ b/app/Http/Controllers/EditMediaController.php @@ -40,6 +40,7 @@ use Psr\Http\Message\UploadedFileInterface; use RuntimeException; use Symfony\Component\HttpFoundation\File\UploadedFile; +use function assert; use function pathinfo; use function strpos; @@ -280,6 +281,7 @@ class EditMediaController extends AbstractEditController public function createMediaObject(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); return response(view('modals/create-media-object', [ 'max_upload_size' => $this->maxUploadFilesize(), @@ -403,6 +405,8 @@ class EditMediaController extends AbstractEditController public function linkMediaToIndividual(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -421,6 +425,8 @@ class EditMediaController extends AbstractEditController public function linkMediaToFamily(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -439,6 +445,8 @@ class EditMediaController extends AbstractEditController public function linkMediaToSource(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); diff --git a/app/Http/Controllers/EditNoteController.php b/app/Http/Controllers/EditNoteController.php index 08f5011b0c..b2b21261c4 100644 --- a/app/Http/Controllers/EditNoteController.php +++ b/app/Http/Controllers/EditNoteController.php @@ -21,8 +21,11 @@ namespace Fisharebest\Webtrees\Http\Controllers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Note; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Controller for edit forms and responses. @@ -51,6 +54,8 @@ class EditNoteController extends AbstractEditController public function editNoteObject(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $note = Note::getInstance($xref, $tree); @@ -74,6 +79,8 @@ class EditNoteController extends AbstractEditController public function updateNoteObject(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $note = Note::getInstance($xref, $tree); diff --git a/app/Http/Controllers/GedcomFileController.php b/app/Http/Controllers/GedcomFileController.php index 71655100c9..6eaf309a83 100644 --- a/app/Http/Controllers/GedcomFileController.php +++ b/app/Http/Controllers/GedcomFileController.php @@ -24,11 +24,14 @@ use Fisharebest\Webtrees\Functions\FunctionsImport; use Fisharebest\Webtrees\Gedcom; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\TimeoutService; +use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; use Illuminate\Support\Str; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Controller for the processing GEDCOM files. @@ -61,6 +64,7 @@ class GedcomFileController extends AbstractBaseController public function import(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); try { // Only allow one process to import each gedcom at a time diff --git a/app/Http/Controllers/HomePageController.php b/app/Http/Controllers/HomePageController.php index 60f517793a..6ccea79e7b 100644 --- a/app/Http/Controllers/HomePageController.php +++ b/app/Http/Controllers/HomePageController.php @@ -43,10 +43,12 @@ use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\Expression; use Illuminate\Support\Collection; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use function assert; /** * Controller for the user/tree's home page. @@ -277,6 +279,7 @@ class HomePageController extends AbstractBaseController public function treePage(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); $has_blocks = DB::table('block') ->where('gedcom_id', '=', $tree->id()) @@ -390,6 +393,7 @@ class HomePageController extends AbstractBaseController public function treePageEdit(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); $main_blocks = $this->treeBlocks($tree->id(), self::MAIN_BLOCKS); $side_blocks = $this->treeBlocks($tree->id(), self::SIDE_BLOCKS); diff --git a/app/Http/Controllers/ListController.php b/app/Http/Controllers/ListController.php index 1fb069bcb4..429d806ec9 100644 --- a/app/Http/Controllers/ListController.php +++ b/app/Http/Controllers/ListController.php @@ -35,8 +35,10 @@ use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Controller for lists of GEDCOM records. @@ -98,6 +100,8 @@ class ListController extends AbstractBaseController public function individualOrFamilyList(ServerRequestInterface $request, bool $families, ?ModuleListInterface $moduleListInterface): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); // This action can show lists of both families and individuals. diff --git a/app/Http/Controllers/NoteController.php b/app/Http/Controllers/NoteController.php index df07646624..b39977e9e3 100644 --- a/app/Http/Controllers/NoteController.php +++ b/app/Http/Controllers/NoteController.php @@ -23,10 +23,13 @@ use Fisharebest\Webtrees\Fact; use Fisharebest\Webtrees\Filter; use Fisharebest\Webtrees\Note; use Fisharebest\Webtrees\Services\ClipboardService; +use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; use function redirect; /** @@ -56,9 +59,11 @@ class NoteController extends AbstractBaseController */ public function show(ServerRequestInterface $request): ResponseInterface { - $slug = $request->getAttribute('slug'); $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getAttribute('xref'); + $slug = $request->getAttribute('slug'); $note = Note::getInstance($xref, $tree); Auth::checkNoteAccess($note, false); diff --git a/app/Http/Controllers/PendingChangesController.php b/app/Http/Controllers/PendingChangesController.php index 191b339a63..d1609a4eab 100644 --- a/app/Http/Controllers/PendingChangesController.php +++ b/app/Http/Controllers/PendingChangesController.php @@ -34,9 +34,11 @@ use Fisharebest\Webtrees\Repository; use Fisharebest\Webtrees\Source; use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; use function route; /** @@ -54,6 +56,8 @@ class PendingChangesController extends AbstractBaseController public function acceptAllChanges(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $url = $request->getQueryParams()['url']; $changes = DB::table('change') @@ -168,6 +172,8 @@ class PendingChangesController extends AbstractBaseController public function rejectAllChanges(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $url = $request->getQueryParams()['url']; DB::table('change') diff --git a/app/Http/Middleware/AuthEditor.php b/app/Http/Middleware/AuthEditor.php index f9800ddd98..e9182cedd4 100644 --- a/app/Http/Middleware/AuthEditor.php +++ b/app/Http/Middleware/AuthEditor.php @@ -23,11 +23,13 @@ use Fisharebest\Webtrees\Http\RequestHandlers\HomePage; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; +use function assert; use function redirect; use function route; @@ -45,6 +47,8 @@ class AuthEditor implements MiddlewareInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); // Logged in with the correct role? diff --git a/app/Http/Middleware/AuthManager.php b/app/Http/Middleware/AuthManager.php index 9e4ca9c06e..3db5e8035e 100644 --- a/app/Http/Middleware/AuthManager.php +++ b/app/Http/Middleware/AuthManager.php @@ -23,11 +23,13 @@ use Fisharebest\Webtrees\Http\RequestHandlers\HomePage; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; +use function assert; use function redirect; use function route; @@ -45,6 +47,8 @@ class AuthManager implements MiddlewareInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); // Logged in with the correct role? diff --git a/app/Http/Middleware/AuthMember.php b/app/Http/Middleware/AuthMember.php index e3e6568c21..a897f255e6 100644 --- a/app/Http/Middleware/AuthMember.php +++ b/app/Http/Middleware/AuthMember.php @@ -23,12 +23,14 @@ use Fisharebest\Webtrees\Http\RequestHandlers\HomePage; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use function assert; use function redirect; use function route; @@ -46,6 +48,8 @@ class AuthMember implements MiddlewareInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); // Logged in with the correct role? diff --git a/app/Http/Middleware/AuthModerator.php b/app/Http/Middleware/AuthModerator.php index 43d6e9a19d..c6c80ac22d 100644 --- a/app/Http/Middleware/AuthModerator.php +++ b/app/Http/Middleware/AuthModerator.php @@ -23,12 +23,14 @@ use Fisharebest\Webtrees\Http\RequestHandlers\HomePage; use Fisharebest\Webtrees\Http\RequestHandlers\LoginPage; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use function assert; use function redirect; use function route; @@ -46,6 +48,8 @@ class AuthModerator implements MiddlewareInterface public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); // Logged in with the correct role? diff --git a/app/Http/Middleware/UseLocale.php b/app/Http/Middleware/UseLocale.php index 6350d00432..f112d47c78 100644 --- a/app/Http/Middleware/UseLocale.php +++ b/app/Http/Middleware/UseLocale.php @@ -22,10 +22,13 @@ use Fisharebest\Localization\Locale as WebtreesLocale; use Fisharebest\Localization\Locale\LocaleInterface; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; +use function assert; /** * Middleware to set a global theme. diff --git a/app/Http/RequestHandlers/DeleteTreeAction.php b/app/Http/RequestHandlers/DeleteTreeAction.php index 38fd673a92..d37db2e190 100644 --- a/app/Http/RequestHandlers/DeleteTreeAction.php +++ b/app/Http/RequestHandlers/DeleteTreeAction.php @@ -23,9 +23,12 @@ use Fisharebest\Webtrees\FlashMessages; use Fisharebest\Webtrees\Http\Controllers\AbstractBaseController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\TreeService; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; use function e; use function response; @@ -55,6 +58,7 @@ class DeleteTreeAction extends AbstractBaseController public function handle(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); $this->tree_service->delete($tree); diff --git a/app/Http/RequestHandlers/LoginPage.php b/app/Http/RequestHandlers/LoginPage.php index 825c7ccbe4..41cc301697 100644 --- a/app/Http/RequestHandlers/LoginPage.php +++ b/app/Http/RequestHandlers/LoginPage.php @@ -21,9 +21,12 @@ namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Http\Controllers\AbstractBaseController; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Site; +use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Show a login form. diff --git a/app/Http/RequestHandlers/Logout.php b/app/Http/RequestHandlers/Logout.php index 255ae7ec63..60a53779b8 100644 --- a/app/Http/RequestHandlers/Logout.php +++ b/app/Http/RequestHandlers/Logout.php @@ -24,10 +24,12 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Log; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; +use function assert; use function redirect; use function route; @@ -44,6 +46,8 @@ class Logout implements RequestHandlerInterface public function handle(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); if ($user instanceof User) { diff --git a/app/Http/RequestHandlers/RegisterAction.php b/app/Http/RequestHandlers/RegisterAction.php index 29eec1283d..315d152a29 100644 --- a/app/Http/RequestHandlers/RegisterAction.php +++ b/app/Http/RequestHandlers/RegisterAction.php @@ -31,10 +31,12 @@ use Fisharebest\Webtrees\SiteUser; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\TreeUser; use Illuminate\Database\Capsule\Manager as DB; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Ramsey\Uuid\Uuid; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use function assert; /** * Process a user registration. @@ -73,6 +75,7 @@ class RegisterAction extends AbstractBaseController public function handle(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); $this->checkRegistrationAllowed(); diff --git a/app/Http/RequestHandlers/ReorderChildrenAction.php b/app/Http/RequestHandlers/ReorderChildrenAction.php new file mode 100644 index 0000000000..88d4bc46ba --- /dev/null +++ b/app/Http/RequestHandlers/ReorderChildrenAction.php @@ -0,0 +1,88 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Family; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +use function array_merge; +use function array_search; +use function assert; +use function implode; +use function is_array; +use function redirect; +use function uksort; + +/** + * Reorder the children in a family. + */ +class ReorderChildrenAction implements RequestHandlerInterface +{ + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + + $xref = $request->getAttribute('xref'); + assert(is_string($xref), new InvalidArgumentException()); + + $family = Family::getInstance($xref, $tree); + assert($family instanceof Family, new InvalidArgumentException()); + + $order = $request->getParsedBody()['order']; + assert(is_array($order), new InvalidArgumentException()); + + Auth::checkFamilyAccess($family, true); + + $dummy_facts = ['0 @' . $family->xref() . '@ FAM']; + $sort_facts = []; + $keep_facts = []; + + // Split facts into FAMS and other + foreach ($family->facts() as $fact) { + if ($fact->getTag() === 'CHIL') { + $sort_facts[$fact->id()] = $fact->gedcom(); + } else { + $keep_facts[] = $fact->gedcom(); + } + } + + // Sort the facts + uksort($sort_facts, static function ($x, $y) use ($order) { + return array_search($x, $order, true) - array_search($y, $order, true); + }); + + // Merge the facts + $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts)); + + $family->updateRecord($gedcom, false); + + return redirect($family->url()); + } +} diff --git a/app/Http/RequestHandlers/ReorderChildrenPage.php b/app/Http/RequestHandlers/ReorderChildrenPage.php new file mode 100644 index 0000000000..941e95c251 --- /dev/null +++ b/app/Http/RequestHandlers/ReorderChildrenPage.php @@ -0,0 +1,67 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Family; +use Fisharebest\Webtrees\Http\ViewResponseTrait; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +use function assert; +use function is_string; + +/** + * Reorder the children in a family. + */ +class ReorderChildrenPage implements RequestHandlerInterface +{ + use ViewResponseTrait; + + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + + $xref = $request->getAttribute('xref'); + assert(is_string($xref), new InvalidArgumentException()); + + $family = Family::getInstance($xref, $tree); + assert($family instanceof Family, new InvalidArgumentException()); + + Auth::checkFamilyAccess($family, true); + + $title = $family->fullName() . ' — ' . I18N::translate('Re-order children'); + + return $this->viewResponse('edit/reorder-children', [ + 'family' => $family, + 'title' => $title, + 'tree' => $tree, + ]); + } +} diff --git a/app/Http/RequestHandlers/ReorderMediaAction.php b/app/Http/RequestHandlers/ReorderMediaAction.php new file mode 100644 index 0000000000..fda0dfd9f0 --- /dev/null +++ b/app/Http/RequestHandlers/ReorderMediaAction.php @@ -0,0 +1,89 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +use function array_merge; +use function array_search; +use function assert; +use function implode; +use function is_array; +use function is_string; +use function redirect; +use function uksort; + +/** + * Reorder the media of an individual. + */ +class ReorderMediaAction implements RequestHandlerInterface +{ + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + + $xref = $request->getParsedBody()['xref']; + assert(is_string($xref), new InvalidArgumentException()); + + $individual = Individual::getInstance($xref, $tree); + assert($individual instanceof Individual, new InvalidArgumentException()); + + $order = $request->getParsedBody()['order']; + assert(is_array($order), new InvalidArgumentException()); + + Auth::checkIndividualAccess($individual, true); + + $dummy_facts = ['0 @' . $individual->xref() . '@ INDI']; + $sort_facts = []; + $keep_facts = []; + + // Split facts into OBJE and other + foreach ($individual->facts() as $fact) { + if ($fact->getTag() === 'OBJE') { + $sort_facts[$fact->id()] = $fact->gedcom(); + } else { + $keep_facts[] = $fact->gedcom(); + } + } + + // Sort the facts + uksort($sort_facts, static function ($x, $y) use ($order) { + return array_search($x, $order, true) - array_search($y, $order, true); + }); + + // Merge the facts + $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts)); + + $individual->updateRecord($gedcom, false); + + return redirect($individual->url()); + } +} diff --git a/app/Http/RequestHandlers/ReorderMediaPage.php b/app/Http/RequestHandlers/ReorderMediaPage.php new file mode 100644 index 0000000000..09bce44ddc --- /dev/null +++ b/app/Http/RequestHandlers/ReorderMediaPage.php @@ -0,0 +1,67 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Http\ViewResponseTrait; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +use function assert; +use function is_string; + +/** + * Reorder the media of an individual. + */ +class ReorderMediaPage implements RequestHandlerInterface +{ + use ViewResponseTrait; + + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + + $xref = $request->getQueryParams()['xref']; + assert(is_string($xref), new InvalidArgumentException()); + + $individual = Individual::getInstance($xref, $tree); + assert($individual instanceof Individual, new InvalidArgumentException()); + + Auth::checkIndividualAccess($individual, true); + + $title = $individual->fullName() . ' — ' . I18N::translate('Re-order media'); + + return $this->viewResponse('edit/reorder-media', [ + 'individual' => $individual, + 'title' => $title, + 'tree' => $tree, + ]); + } +} diff --git a/app/Http/RequestHandlers/ReorderNamesAction.php b/app/Http/RequestHandlers/ReorderNamesAction.php new file mode 100644 index 0000000000..1a6b8d48b5 --- /dev/null +++ b/app/Http/RequestHandlers/ReorderNamesAction.php @@ -0,0 +1,89 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +use function array_merge; +use function array_search; +use function assert; +use function implode; +use function is_array; +use function is_string; +use function redirect; +use function uksort; + +/** + * Reorder the names of an individual. + */ +class ReorderNamesAction implements RequestHandlerInterface +{ + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + + $xref = $request->getParsedBody()['xref']; + assert(is_string($xref), new InvalidArgumentException()); + + $individual = Individual::getInstance($xref, $tree); + assert($individual instanceof Individual, new InvalidArgumentException()); + + $order = $request->getParsedBody()['order']; + assert(is_array($order), new InvalidArgumentException()); + + Auth::checkIndividualAccess($individual, true); + + $dummy_facts = ['0 @' . $individual->xref() . '@ INDI']; + $sort_facts = []; + $keep_facts = []; + + // Split facts into NAME and other + foreach ($individual->facts() as $fact) { + if ($fact->getTag() === 'NAME') { + $sort_facts[$fact->id()] = $fact->gedcom(); + } else { + $keep_facts[] = $fact->gedcom(); + } + } + + // Sort the facts + uksort($sort_facts, static function ($x, $y) use ($order) { + return array_search($x, $order, true) - array_search($y, $order, true); + }); + + // Merge the facts + $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts)); + + $individual->updateRecord($gedcom, false); + + return redirect($individual->url()); + } +} diff --git a/app/Http/RequestHandlers/ReorderNamesPage.php b/app/Http/RequestHandlers/ReorderNamesPage.php new file mode 100644 index 0000000000..fa46c0a086 --- /dev/null +++ b/app/Http/RequestHandlers/ReorderNamesPage.php @@ -0,0 +1,67 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Http\ViewResponseTrait; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +use function assert; +use function is_string; + +/** + * Reorder the names of an individual. + */ +class ReorderNamesPage implements RequestHandlerInterface +{ + use ViewResponseTrait; + + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + + $xref = $request->getQueryParams()['xref']; + assert(is_string($xref), new InvalidArgumentException()); + + $individual = Individual::getInstance($xref, $tree); + assert($individual instanceof InvalidArgumentException, new InvalidArgumentException()); + + Auth::checkIndividualAccess($individual, true); + + $title = $individual->fullName() . ' — ' . I18N::translate('Re-order names'); + + return $this->viewResponse('edit/reorder-names', [ + 'individual' => $individual, + 'title' => $title, + 'tree' => $tree, + ]); + } +} diff --git a/app/Http/RequestHandlers/ReorderSpousesAction.php b/app/Http/RequestHandlers/ReorderSpousesAction.php new file mode 100644 index 0000000000..034b6edafd --- /dev/null +++ b/app/Http/RequestHandlers/ReorderSpousesAction.php @@ -0,0 +1,89 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +use function array_merge; +use function array_search; +use function assert; +use function implode; +use function is_array; +use function is_string; +use function redirect; +use function uksort; + +/** + * Reorder the spouses of an individual. + */ +class ReorderSpousesAction implements RequestHandlerInterface +{ + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + + $xref = $request->getAttribute('xref'); + assert(is_string($xref), new InvalidArgumentException()); + + $individual = Individual::getInstance($xref, $tree); + assert($individual instanceof Individual, new InvalidArgumentException()); + + $order = $request->getParsedBody()['order']; + assert(is_array($order), new InvalidArgumentException()); + + Auth::checkIndividualAccess($individual, true); + + $dummy_facts = ['0 @' . $individual->xref() . '@ INDI']; + $sort_facts = []; + $keep_facts = []; + + // Split facts into FAMS and other + foreach ($individual->facts() as $fact) { + if ($fact->getTag() === 'FAMS') { + $sort_facts[$fact->id()] = $fact->gedcom(); + } else { + $keep_facts[] = $fact->gedcom(); + } + } + + // Sort the facts + uksort($sort_facts, static function ($x, $y) use ($order) { + return array_search($x, $order, true) - array_search($y, $order, true); + }); + + // Merge the facts + $gedcom = implode("\n", array_merge($dummy_facts, $sort_facts, $keep_facts)); + + $individual->updateRecord($gedcom, false); + + return redirect($individual->url()); + } +} diff --git a/app/Http/RequestHandlers/ReorderSpousesPage.php b/app/Http/RequestHandlers/ReorderSpousesPage.php new file mode 100644 index 0000000000..f0538ae599 --- /dev/null +++ b/app/Http/RequestHandlers/ReorderSpousesPage.php @@ -0,0 +1,67 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Http\ViewResponseTrait; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +use function assert; +use function is_string; + +/** + * Reorder the spouses of an individual. + */ +class ReorderSpousesPage implements RequestHandlerInterface +{ + use ViewResponseTrait; + + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + + $xref = $request->getAttribute('xref'); + assert(is_string($xref), new InvalidArgumentException()); + + $individual = Individual::getInstance($xref, $tree); + assert($individual instanceof Individual, new InvalidArgumentException()); + + Auth::checkIndividualAccess($individual, true); + + $title = $individual->fullName() . ' — ' . I18N::translate('Re-order families'); + + return $this->viewResponse('edit/reorder-spouses', [ + 'individual' => $individual, + 'title' => $title, + 'tree' => $tree, + ]); + } +} diff --git a/app/Module/BatchUpdateModule.php b/app/Module/BatchUpdateModule.php index d8c34ef8c7..d9705743af 100644 --- a/app/Module/BatchUpdateModule.php +++ b/app/Module/BatchUpdateModule.php @@ -31,6 +31,7 @@ use Fisharebest\Webtrees\Source; use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Expression; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use stdClass; @@ -38,6 +39,7 @@ use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use function array_key_exists; +use function assert; /** * Class BatchUpdateModule @@ -80,6 +82,8 @@ class BatchUpdateModule extends AbstractModule implements ModuleConfigInterface public function getAdminAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); // We need a tree to work with. @@ -330,6 +334,8 @@ class BatchUpdateModule extends AbstractModule implements ModuleConfigInterface public function postAdminAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); // We need a tree to work with. diff --git a/app/Module/BranchesListModule.php b/app/Module/BranchesListModule.php index 8d1692e369..f8b6edfca8 100644 --- a/app/Module/BranchesListModule.php +++ b/app/Module/BranchesListModule.php @@ -23,8 +23,10 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\ModuleService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class BranchesListModule @@ -88,6 +90,8 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface public function getPageAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); @@ -104,6 +108,8 @@ class BranchesListModule extends AbstractModule implements ModuleListInterface public function getListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/ClippingsCartModule.php b/app/Module/ClippingsCartModule.php index 0038491ace..16a8fc9f0a 100644 --- a/app/Module/ClippingsCartModule.php +++ b/app/Module/ClippingsCartModule.php @@ -39,6 +39,7 @@ use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\Session; use Fisharebest\Webtrees\Source; use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use League\Flysystem\Filesystem; use League\Flysystem\MountManager; use League\Flysystem\ZipArchive\ZipArchiveAdapter; @@ -51,6 +52,7 @@ use function app; use function array_filter; use function array_keys; use function array_map; +use function assert; use function in_array; use function key; use function preg_match_all; @@ -360,6 +362,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function postRemoveAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $cart = Session::get('cart', []); @@ -383,6 +387,7 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function getShowAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); return $this->viewResponse('modules/clippings/show', [ 'records' => $this->allRecordsInCart($tree), @@ -399,6 +404,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function getAddFamilyAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $family = Family::getInstance($xref, $tree); @@ -532,6 +539,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function getAddIndividualAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); @@ -675,6 +684,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function getAddMediaAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -719,6 +730,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function postAddMediaAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $media = Media::getInstance($xref, $tree); @@ -740,6 +753,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function getAddNoteAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $note = Note::getInstance($xref, $tree); @@ -784,6 +799,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function postAddNoteAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $note = Note::getInstance($xref, $tree); @@ -805,6 +822,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function getAddRepositoryAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $repository = Repository::getInstance($xref, $tree); @@ -849,6 +868,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function postAddRepositoryAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $repository = Repository::getInstance($xref, $tree); @@ -870,6 +891,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function getAddSourceAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $source = Source::getInstance($xref, $tree); @@ -915,6 +938,8 @@ class ClippingsCartModule extends AbstractModule implements ModuleMenuInterface public function postAddSourceAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $option = $request->getParsedBody()['option']; diff --git a/app/Module/ContactsFooterModule.php b/app/Module/ContactsFooterModule.php index 3cab220b54..6adb888b02 100644 --- a/app/Module/ContactsFooterModule.php +++ b/app/Module/ContactsFooterModule.php @@ -20,8 +20,11 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\UserService; +use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; +use InvalidArgumentException; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class ContactsFooterModule - provide a link to the site owner. diff --git a/app/Module/DescendancyModule.php b/app/Module/DescendancyModule.php index 8fa4a4b05e..c189e507b4 100644 --- a/app/Module/DescendancyModule.php +++ b/app/Module/DescendancyModule.php @@ -22,9 +22,12 @@ use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Services\SearchService; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; use function view; /** @@ -87,6 +90,8 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface public function getSearchAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $search = $request->getQueryParams()['search']; $html = ''; @@ -115,6 +120,8 @@ class DescendancyModule extends AbstractModule implements ModuleSidebarInterface public function getDescendantsAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref']; $individual = Individual::getInstance($xref, $tree); diff --git a/app/Module/FamilyListModule.php b/app/Module/FamilyListModule.php index ffc76ac21b..56fe3f156b 100644 --- a/app/Module/FamilyListModule.php +++ b/app/Module/FamilyListModule.php @@ -23,8 +23,11 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\IndividualListService; use Fisharebest\Webtrees\Services\LocalizationService; use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class FamilyListModule @@ -73,6 +76,8 @@ class FamilyListModule extends AbstractModule implements ModuleListInterface public function getListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/FamilyTreeNewsModule.php b/app/Module/FamilyTreeNewsModule.php index 8a51791f4d..33e4adce84 100644 --- a/app/Module/FamilyTreeNewsModule.php +++ b/app/Module/FamilyTreeNewsModule.php @@ -25,10 +25,12 @@ use Fisharebest\Webtrees\Services\HtmlService; use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Str; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use stdClass; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use function assert; /** * Class FamilyTreeNewsModule @@ -153,6 +155,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac public function getEditNewsAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); if (!Auth::isManager($tree)) { throw new AccessDeniedHttpException(); @@ -190,6 +193,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleBlockInterfac public function postEditNewsAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); if (!Auth::isManager($tree)) { throw new AccessDeniedHttpException(); diff --git a/app/Module/FrequentlyAskedQuestionsModule.php b/app/Module/FrequentlyAskedQuestionsModule.php index 07c9083b60..e3fcc34a10 100644 --- a/app/Module/FrequentlyAskedQuestionsModule.php +++ b/app/Module/FrequentlyAskedQuestionsModule.php @@ -25,9 +25,11 @@ use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\Builder; use Illuminate\Support\Collection; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use stdClass; +use function assert; /** * Class FrequentlyAskedQuestionsModule @@ -112,6 +114,8 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon $this->layout = 'layouts/administration'; $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $faqs = $this->faqsForTree($tree); $min_block_order = DB::table('block') @@ -378,6 +382,7 @@ class FrequentlyAskedQuestionsModule extends AbstractModule implements ModuleCon public function getShowAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); // Filter foreign languages. $faqs = $this->faqsForTree($tree) diff --git a/app/Module/GoogleAnalyticsModule.php b/app/Module/GoogleAnalyticsModule.php index aad6987776..147f6db4ea 100644 --- a/app/Module/GoogleAnalyticsModule.php +++ b/app/Module/GoogleAnalyticsModule.php @@ -21,7 +21,9 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class GoogleAnalyticsModule - add support for Google analytics. @@ -98,6 +100,8 @@ class GoogleAnalyticsModule extends AbstractModule implements ModuleAnalyticsInt // Add extra dimensions (i.e. filtering categories) $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); $parameters['dimensions'] = (object) [ diff --git a/app/Module/HourglassChartModule.php b/app/Module/HourglassChartModule.php index 0ae55af543..f094a0bae7 100644 --- a/app/Module/HourglassChartModule.php +++ b/app/Module/HourglassChartModule.php @@ -25,11 +25,14 @@ use Fisharebest\Webtrees\Family; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; +use Fisharebest\Webtrees\Tree; use Illuminate\Support\Collection; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; +use function assert; use function response; use function view; @@ -213,6 +216,8 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac public function getAncestorsAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref'] ?? ''; $family = Family::getInstance($xref, $tree); @@ -234,6 +239,8 @@ class HourglassChartModule extends AbstractModule implements ModuleChartInterfac public function getDescendantsAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $xref = $request->getQueryParams()['xref'] ?? ''; $spouses = (bool) ($request->getQueryParams()['spouses'] ?? false); diff --git a/app/Module/IndividualListModule.php b/app/Module/IndividualListModule.php index a0c32a4f30..d81f8a4bdc 100644 --- a/app/Module/IndividualListModule.php +++ b/app/Module/IndividualListModule.php @@ -23,8 +23,11 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Services\IndividualListService; use Fisharebest\Webtrees\Services\LocalizationService; use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class IndividualListModule @@ -73,6 +76,8 @@ class IndividualListModule extends AbstractModule implements ModuleListInterface public function getListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/InteractiveTreeModule.php b/app/Module/InteractiveTreeModule.php index bc979df225..4ddb19b011 100644 --- a/app/Module/InteractiveTreeModule.php +++ b/app/Module/InteractiveTreeModule.php @@ -25,8 +25,11 @@ use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Module\InteractiveTree\TreeView; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class InteractiveTreeModule @@ -184,6 +187,8 @@ class InteractiveTreeModule extends AbstractModule implements ModuleChartInterfa public function getChartAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); $xref = $request->getQueryParams()['xref']; diff --git a/app/Module/MediaListModule.php b/app/Module/MediaListModule.php index b422da18e3..7637d77bf7 100644 --- a/app/Module/MediaListModule.php +++ b/app/Module/MediaListModule.php @@ -25,8 +25,10 @@ use Fisharebest\Webtrees\Services\LocalizationService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Illuminate\Database\Capsule\Manager as DB; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class MediaListModule @@ -75,6 +77,8 @@ class MediaListModule extends AbstractModule implements ModuleListInterface public function getListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/NoteListModule.php b/app/Module/NoteListModule.php index 73ad7a12e0..7f2e1cf21f 100644 --- a/app/Module/NoteListModule.php +++ b/app/Module/NoteListModule.php @@ -25,8 +25,10 @@ use Fisharebest\Webtrees\Services\LocalizationService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Illuminate\Database\Capsule\Manager as DB; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class IndividualListModule @@ -75,6 +77,8 @@ class NoteListModule extends AbstractModule implements ModuleListInterface public function getListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/PlaceHierarchyListModule.php b/app/Module/PlaceHierarchyListModule.php index 9f6ca492ee..f05fcd97fd 100644 --- a/app/Module/PlaceHierarchyListModule.php +++ b/app/Module/PlaceHierarchyListModule.php @@ -21,8 +21,11 @@ namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Http\Controllers\PlaceHierarchyController; use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class IndividualListModule @@ -71,6 +74,8 @@ class PlaceHierarchyListModule extends AbstractModule implements ModuleListInter public function getListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/RepositoryListModule.php b/app/Module/RepositoryListModule.php index 921ab8080f..cba2da2589 100644 --- a/app/Module/RepositoryListModule.php +++ b/app/Module/RepositoryListModule.php @@ -25,8 +25,10 @@ use Fisharebest\Webtrees\Services\LocalizationService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Illuminate\Database\Capsule\Manager as DB; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class RepositoryListModule @@ -75,6 +77,8 @@ class RepositoryListModule extends AbstractModule implements ModuleListInterface public function getListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/SourceListModule.php b/app/Module/SourceListModule.php index 7e72086e75..1d95dc8db3 100644 --- a/app/Module/SourceListModule.php +++ b/app/Module/SourceListModule.php @@ -25,8 +25,10 @@ use Fisharebest\Webtrees\Services\LocalizationService; use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\Auth; use Illuminate\Database\Capsule\Manager as DB; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use function assert; /** * Class RepositoryListModule @@ -75,6 +77,8 @@ class SourceListModule extends AbstractModule implements ModuleListInterface public function getListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, ModuleListInterface::class, $tree, $user); diff --git a/app/Module/StatisticsChartModule.php b/app/Module/StatisticsChartModule.php index a089e4200d..c1c8bc5228 100644 --- a/app/Module/StatisticsChartModule.php +++ b/app/Module/StatisticsChartModule.php @@ -23,6 +23,8 @@ use Fisharebest\Webtrees\Date; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Statistics; +use Fisharebest\Webtrees\Tree; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -35,6 +37,7 @@ use function array_merge; use function array_sum; use function array_values; use function array_walk; +use function assert; use function count; use function explode; use function in_array; @@ -140,6 +143,8 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa public function getChartAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); Auth::checkComponentAccess($this, 'chart', $tree, $user); @@ -227,6 +232,7 @@ class StatisticsChartModule extends AbstractModule implements ModuleChartInterfa $this->layout = 'layouts/ajax'; $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); return $this->viewResponse('modules/statistics-chart/custom', [ 'module' => $this, diff --git a/app/Module/StoriesModule.php b/app/Module/StoriesModule.php index 9cbddfaba6..9c1426d816 100644 --- a/app/Module/StoriesModule.php +++ b/app/Module/StoriesModule.php @@ -25,9 +25,11 @@ use Fisharebest\Webtrees\Menu; use Fisharebest\Webtrees\Services\HtmlService; use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use stdClass; +use function assert; /** * Class StoriesModule @@ -206,6 +208,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod $this->layout = 'layouts/administration'; $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); $stories = DB::table('block') ->where('module_name', '=', $this->name()) @@ -361,6 +364,7 @@ class StoriesModule extends AbstractModule implements ModuleConfigInterface, Mod public function getShowListAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); $stories = DB::table('block') ->where('module_name', '=', $this->name()) diff --git a/app/Module/UserJournalModule.php b/app/Module/UserJournalModule.php index 9120a39b16..ac8b503fbc 100644 --- a/app/Module/UserJournalModule.php +++ b/app/Module/UserJournalModule.php @@ -25,10 +25,12 @@ use Fisharebest\Webtrees\Services\HtmlService; use Fisharebest\Webtrees\Tree; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Support\Str; +use InvalidArgumentException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use stdClass; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use function assert; /** * Class UserJournalModule @@ -188,6 +190,7 @@ class UserJournalModule extends AbstractModule implements ModuleBlockInterface public function postEditJournalAction(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); if (!Auth::check()) { throw new AccessDeniedHttpException(); diff --git a/app/Services/UserService.php b/app/Services/UserService.php index 727a3b676e..b777acf329 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -21,13 +21,16 @@ namespace Fisharebest\Webtrees\Services; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Carbon; use Fisharebest\Webtrees\Individual; +use Fisharebest\Webtrees\Tree; use Fisharebest\Webtrees\User; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; +use InvalidArgumentException; use Psr\Http\Message\ServerRequestInterface; use function app; +use function assert; /** * Functions for managing users. @@ -350,6 +353,8 @@ class UserService public function contactLink(User $contact_user, ServerRequestInterface $request): string { $tree = $request->getAttribute('tree'); + assert($tree instanceof Tree, new InvalidArgumentException()); + $user = $request->getAttribute('user'); if ($contact_user->getPreference('contactmethod') === 'mailto') { diff --git a/resources/views/edit/reorder-children.phtml b/resources/views/edit/reorder-children.phtml index 27df60489b..77129cffb1 100644 --- a/resources/views/edit/reorder-children.phtml +++ b/resources/views/edit/reorder-children.phtml @@ -1,13 +1,16 @@ -<?php use Fisharebest\Webtrees\Gedcom; ?> -<?php use Fisharebest\Webtrees\I18N; ?> -<?php use Fisharebest\Webtrees\View; ?> +<?php + +use Fisharebest\Webtrees\Gedcom; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenAction; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\View; + +?> <h2 class="wt-page-title"><?= $title ?></h2> -<form method="post" action="<?= e(route('reorder-children-action', ['tree' => $tree->name()])) ?>" class="wt-page-content"> +<form method="post" action="<?= e(route(ReorderChildrenAction::class, ['tree' => $tree->name(), 'xref' => $family->xref()])) ?>" class="wt-page-content"> <?= csrf_field() ?> - <input type="hidden" name="tree" value="<?= e($family->tree()->name()) ?>"> - <input type="hidden" name="xref" value="<?= e($family->xref()) ?>"> <div class="wt-sortable-list"> <?php foreach ($family->facts(['CHIL']) as $fact) : ?> diff --git a/resources/views/edit/reorder-media.phtml b/resources/views/edit/reorder-media.phtml index 345891621e..48e5723e5d 100644 --- a/resources/views/edit/reorder-media.phtml +++ b/resources/views/edit/reorder-media.phtml @@ -1,9 +1,14 @@ -<?php use Fisharebest\Webtrees\I18N; ?> -<?php use Fisharebest\Webtrees\View; ?> +<?php + +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaAction; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\View; + +?> <h2 class="wt-page-title"><?= $title ?></h2> -<form method="post" action="<?= e(route('reorder-media-action', ['tree' => $tree->name()])) ?>" class="wt-page-content"> +<form method="post" action="<?= e(route(ReorderMediaAction::class, ['tree' => $tree->name()])) ?>" class="wt-page-content"> <?= csrf_field() ?> <input type="hidden" name="tree" value="<?= e($individual->tree()->name()) ?>"> <input type="hidden" name="xref" value="<?= e($individual->xref()) ?>"> diff --git a/resources/views/edit/reorder-names.phtml b/resources/views/edit/reorder-names.phtml index 558082707b..a11b992cdb 100644 --- a/resources/views/edit/reorder-names.phtml +++ b/resources/views/edit/reorder-names.phtml @@ -1,14 +1,16 @@ -<?php use Fisharebest\Webtrees\GedcomCode\GedcomCodeName; +<?php + +use Fisharebest\Webtrees\GedcomCode\GedcomCodeName; use Fisharebest\Webtrees\GedcomTag; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderNamesAction; use Fisharebest\Webtrees\I18N; -use Fisharebest\Webtrees\View; ?> -<?php ?> -<?php ?> -<?php ?> +use Fisharebest\Webtrees\View; + +?> <h2 class="wt-page-title"><?= $title ?></h2> -<form method="post" action="<?= e(route('reorder-names-action', ['tree' => $tree->name()])) ?>" class="wt-page-content"> +<form method="post" action="<?= e(route(ReorderNamesAction::class, ['tree' => $tree->name()])) ?>" class="wt-page-content"> <?= csrf_field() ?> <input type="hidden" name="tree" value="<?= e($individual->tree()->name()) ?>"> <input type="hidden" name="xref" value="<?= e($individual->xref()) ?>"> diff --git a/resources/views/edit/reorder-spouses.phtml b/resources/views/edit/reorder-spouses.phtml index eff6bd3b76..7cfa19857c 100644 --- a/resources/views/edit/reorder-spouses.phtml +++ b/resources/views/edit/reorder-spouses.phtml @@ -1,13 +1,16 @@ -<?php use Fisharebest\Webtrees\Gedcom; ?> -<?php use Fisharebest\Webtrees\I18N; ?> -<?php use Fisharebest\Webtrees\View; ?> +<?php + +use Fisharebest\Webtrees\Gedcom; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderSpousesAction; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\View; + +?> <h2 class="wt-page-title"><?= $title ?></h2> -<form method="post" action="<?= e(route('reorder-spouses-action', ['tree' => $tree->name()])) ?>" class="wt-page-content"> +<form method="post" action="<?= e(route(ReorderSpousesAction::class, ['tree' => $tree->name(), 'xref' => $individual->xref()])) ?>" class="wt-page-content"> <?= csrf_field() ?> - <input type="hidden" name="tree" value="<?= e($individual->tree()->name()) ?>"> - <input type="hidden" name="xref" value="<?= e($individual->xref()) ?>"> <div class="wt-sortable-list"> <?php foreach ($individual->facts(['FAMS']) as $fact) : ?> diff --git a/resources/views/family-page-children.phtml b/resources/views/family-page-children.phtml index a56f315ae5..73aeb2e35a 100644 --- a/resources/views/family-page-children.phtml +++ b/resources/views/family-page-children.phtml @@ -1,5 +1,6 @@ <?php +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenPage; use Fisharebest\Webtrees\I18N; ?> @@ -35,7 +36,7 @@ use Fisharebest\Webtrees\I18N; </a> <br> <?php if ($family->numberOfChildren() > 1) : ?> - <a class="btn btn-link" href="<?= e(route('reorder-children', ['tree' => $family->tree()->name(), 'xref' => $family->xref()])) ?>"> + <a class="btn btn-link" href="<?= e(route(ReorderChildrenPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref()])) ?>"> <?= I18N::translate('Re-order children') ?> </a> <?php endif ?> diff --git a/resources/views/family-page-menu.phtml b/resources/views/family-page-menu.phtml index 1c1b82886d..9c58628f3e 100644 --- a/resources/views/family-page-menu.phtml +++ b/resources/views/family-page-menu.phtml @@ -1,5 +1,6 @@ <?php use Fisharebest\Webtrees\Auth; ?> -<?php use Fisharebest\Webtrees\I18N; ?> +<?php use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenPage; +use Fisharebest\Webtrees\I18N; ?> <div class="dropdown wt-page-menu"> <button class="btn btn-primary dropdown-toggle wt-page-menu-button" type="button" id="page-menu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> @@ -33,7 +34,7 @@ </a> <?php if ($record->numberOfChildren() > 1) : ?> - <a class="dropdown-item" href="<?= e(route('reorder-children', ['tree' => $record->tree()->name(), 'xref' => $record->xref()])) ?>"> + <a class="dropdown-item" href="<?= e(route(ReorderChildrenPage::class, ['tree' => $record->tree()->name(), 'xref' => $record->xref()])) ?>"> <?= view('icons/reorder') ?> <?= I18N::translate('Re-order children') ?> </a> diff --git a/resources/views/individual-page-menu.phtml b/resources/views/individual-page-menu.phtml index b10c5d111d..fd545479a6 100644 --- a/resources/views/individual-page-menu.phtml +++ b/resources/views/individual-page-menu.phtml @@ -1,5 +1,12 @@ -<?php use Fisharebest\Webtrees\Auth; ?> -<?php use Fisharebest\Webtrees\I18N; ?> +<?php + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaPage; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderNamesPage; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderSpousesPage; +use Fisharebest\Webtrees\I18N; + +?> <div class="dropdown wt-page-menu"> <button class="btn btn-primary dropdown-toggle wt-page-menu-button" type="button" id="page-menu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> @@ -14,7 +21,7 @@ </a> <?php if ($count_names > 1) : ?> - <a class="dropdown-item" href="<?= e(route('reorder-names', ['tree' => $individual->tree()->name(), 'xref' => $individual->xref()])) ?>"> + <a class="dropdown-item" href="<?= e(route(ReorderNamesPage::class, ['tree' => $tree->name(), 'xref' => $individual->xref()])) ?>"> <?= view('icons/reorder') ?> <?= I18N::translate('Re-order names') ?> </a> @@ -46,7 +53,7 @@ <div class="dropdown-divider"></div> <?php if ($individual->spouseFamilies()->count() > 1) : ?> - <a class="dropdown-item" href="<?= e(route('reorder-spouses', ['tree' => $individual->tree()->name(), 'xref' => $individual->xref()])) ?>"> + <a class="dropdown-item" href="<?= e(route(ReorderSpousesPage::class, ['tree' => $individual->tree()->name(), 'xref' => $individual->xref()])) ?>"> <?= view('icons/reorder') ?> <?= I18N::translate('Re-order families') ?> </a> @@ -65,7 +72,7 @@ </a> <?php if ($individual->facts(['OBJE'])->count() > 1) : ?> - <a class="dropdown-item" href="<?= e(route('reorder-media', ['tree' => $individual->tree()->name(), 'xref' => $individual->xref()])) ?>"> + <a class="dropdown-item" href="<?= e(route(ReorderMediaPage::class, ['tree' => $tree->name(), 'xref' => $individual->xref()])) ?>"> <?= view('icons/reorder') ?> <?= I18N::translate('Re-order media') ?> </a> diff --git a/resources/views/modules/relatives/family.phtml b/resources/views/modules/relatives/family.phtml index 964d2fb659..bc04d916cd 100644 --- a/resources/views/modules/relatives/family.phtml +++ b/resources/views/modules/relatives/family.phtml @@ -2,7 +2,8 @@ <?php use Fisharebest\Webtrees\Functions\Functions; ?> <?php use Fisharebest\Webtrees\Gedcom; ?> <?php use Fisharebest\Webtrees\GedcomTag; ?> -<?php use Fisharebest\Webtrees\I18N; ?> +<?php use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenPage; +use Fisharebest\Webtrees\I18N; ?> <?php use Fisharebest\Webtrees\Individual; ?> <table class="table table-sm wt-facts-table"> @@ -190,7 +191,7 @@ <tr> <th scope="row"> <?php if ($family->children()->count() > 1) : ?> - <a href="<?= e(route('reorder-children', ['tree' => $family->tree()->name(), 'xref' => $family->xref()])) ?>"> + <a href="<?= e(route(ReorderChildrenPage::class, ['tree' => $family->tree()->name(), 'xref' => $family->xref()])) ?>"> <?= view('icons/reorder') ?> <?= I18N::translate('Re-order children') ?> </a> diff --git a/resources/views/modules/relatives/tab.phtml b/resources/views/modules/relatives/tab.phtml index 4208f578a5..3f8dc043ff 100644 --- a/resources/views/modules/relatives/tab.phtml +++ b/resources/views/modules/relatives/tab.phtml @@ -1,4 +1,5 @@ -<?php use Fisharebest\Webtrees\I18N; ?> +<?php use Fisharebest\Webtrees\Http\RequestHandlers\ReorderSpousesPage; +use Fisharebest\Webtrees\I18N; ?> <?php use Fisharebest\Webtrees\View; ?> <div class="wt-tab-relatives py-4"> @@ -87,7 +88,7 @@ <?php if ($spouse_families->count() > 1) : ?> <tr> <td> - <a href="<?= e(route('reorder-spouses', ['tree' => $individual->tree()->name(), 'xref' => $individual->xref()])) ?>"> + <a href="<?= e(route(ReorderSpousesPage::class, ['tree' => $individual->tree()->name(), 'xref' => $individual->xref()])) ?>"> <?= view('icons/reorder') ?> <?= I18N::translate('Re-order families') ?> </a> diff --git a/routes/web.php b/routes/web.php index 5df20861de..1e59f0af1f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -57,6 +57,14 @@ use Fisharebest\Webtrees\Http\RequestHandlers\RedirectRepoPhp; use Fisharebest\Webtrees\Http\RequestHandlers\RedirectSourcePhp; use Fisharebest\Webtrees\Http\RequestHandlers\RegisterAction; use Fisharebest\Webtrees\Http\RequestHandlers\RegisterPage; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenAction; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenPage; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaAction; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaPage; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderNamesAction; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderNamesPage; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderSpousesAction; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderSpousesPage; use Fisharebest\Webtrees\Http\RequestHandlers\SelectLanguage; use Fisharebest\Webtrees\Http\RequestHandlers\SelectTheme; use Fisharebest\Webtrees\Http\RequestHandlers\VerifyEmail; @@ -246,14 +254,14 @@ $router->attach('', '/tree/{tree}', static function (Map $router) { $router->post('create-source-action', '/create-source', 'EditSourceController::createSourceAction'); $router->get('create-submitter', '/create-submitter', 'EditSubmitterController::createSubmitter'); $router->post('create-submitter-action', '/create-submitter', 'EditSubmitterController::createSubmitterAction'); - $router->get('reorder-children', '/reorder-children', 'EditFamilyController::reorderChildren'); - $router->post('reorder-children-action', '/reorder-children', 'EditFamilyController::reorderChildrenAction'); - $router->get('reorder-media', '/reorder-media', 'EditIndividualController::reorderMedia'); - $router->post('reorder-media-action', '/reorder-media', 'EditIndividualController::reorderMediaAction'); - $router->get('reorder-names', '/reorder-names', 'EditIndividualController::reorderNames'); - $router->post('reorder-names-action', '/reorder-names', 'EditIndividualController::reorderNamesAction'); - $router->get('reorder-spouses', '/reorder-spouses', 'EditIndividualController::reorderSpouses'); - $router->post('reorder-spouses-action', '/reorder-spouses', 'EditIndividualController::reorderSpousesAction'); + $router->get(ReorderChildrenPage::class, '/reorder-children/{xref}', ReorderChildrenPage::class); + $router->post(ReorderChildrenAction::class, '/reorder-children/{xref}', ReorderChildrenAction::class); + $router->get(ReorderMediaPage::class, '/reorder-media/{xref}', ReorderMediaPage::class); + $router->post(ReorderMediaAction::class, '/reorder-media/{xref}', ReorderMediaAction::class); + $router->get(ReorderNamesPage::class, '/reorder-names/{xref}', ReorderNamesPage::class); + $router->post(ReorderNamesAction::class, '/reorder-names/{xref}', ReorderNamesAction::class); + $router->get(ReorderSpousesPage::class, '/reorder-spouses/{xref}', ReorderSpousesPage::class); + $router->post(ReorderSpousesAction::class, '/reorder-spouses/{xref}', ReorderSpousesAction::class); $router->get('edit-raw-record', '/edit-raw-record', 'EditGedcomRecordController::editRawRecord'); $router->post('edit-raw-record-action', '/edit-raw-record', 'EditGedcomRecordController::editRawRecordAction'); $router->get('edit-raw-fact', '/edit-raw-fact', 'EditGedcomRecordController::editRawFact'); |
