diff options
| author | Greg Roach <greg@subaqua.co.uk> | 2022-04-24 11:20:06 +0100 |
|---|---|---|
| committer | Greg Roach <greg@subaqua.co.uk> | 2022-04-24 11:20:16 +0100 |
| commit | d178350f1d754b60945fcca3e61a19f04dadd861 (patch) | |
| tree | adcd141cd9fe195935ea0a06e90cbd782837c28d | |
| parent | 10cdb299f03d7de65db7612095b8ec88143eca9f (diff) | |
| download | webtrees-d178350f1d754b60945fcca3e61a19f04dadd861.tar.gz webtrees-d178350f1d754b60945fcca3e61a19f04dadd861.tar.bz2 webtrees-d178350f1d754b60945fcca3e61a19f04dadd861.zip | |
Fi: #4338 - allow media files to be re-ordered
| -rw-r--r-- | app/Http/RequestHandlers/ReorderMediaFilesAction.php | 82 | ||||
| -rw-r--r-- | app/Http/RequestHandlers/ReorderMediaFilesPage.php | 64 | ||||
| -rw-r--r-- | app/Http/Routes/WebRoutes.php | 4 | ||||
| -rw-r--r-- | resources/views/edit/reorder-media-files.phtml | 55 | ||||
| -rw-r--r-- | resources/views/media-page-menu.phtml | 8 |
5 files changed, 213 insertions, 0 deletions
diff --git a/app/Http/RequestHandlers/ReorderMediaFilesAction.php b/app/Http/RequestHandlers/ReorderMediaFilesAction.php new file mode 100644 index 0000000000..57e0bdbb61 --- /dev/null +++ b/app/Http/RequestHandlers/ReorderMediaFilesAction.php @@ -0,0 +1,82 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2022 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 <https://www.gnu.org/licenses/>. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Http\RequestHandlers; + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Registry; +use Fisharebest\Webtrees\Validator; +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 media files of a media object. + */ +class ReorderMediaFilesAction implements RequestHandlerInterface +{ + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $media = Registry::mediaFactory()->make($xref, $tree); + $media = Auth::checkMediaAccess($media, true); + $params = (array) $request->getParsedBody(); + + $order = $params['order']; + assert(is_array($order)); + + $fake_facts = ['0 @' . $media->xref() . '@ OBJE']; + $sort_facts = []; + $keep_facts = []; + + // Split facts into OBJE and other + foreach ($media->facts() as $fact) { + if ($fact->tag() === 'OBJE:FILE') { + $sort_facts[$fact->id()] = $fact->gedcom(); + } else { + $keep_facts[] = $fact->gedcom(); + } + } + + // Sort the facts + $callback = static fn (string $x, string $y): int => array_search($x, $order, true) <=> array_search($y, $order, true); + uksort($sort_facts, $callback); + + // Merge the facts + $gedcom = implode("\n", array_merge($fake_facts, $sort_facts, $keep_facts)); + + $media->updateRecord($gedcom, false); + + return redirect($media->url()); + } +} diff --git a/app/Http/RequestHandlers/ReorderMediaFilesPage.php b/app/Http/RequestHandlers/ReorderMediaFilesPage.php new file mode 100644 index 0000000000..a94a0c743f --- /dev/null +++ b/app/Http/RequestHandlers/ReorderMediaFilesPage.php @@ -0,0 +1,64 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2022 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 <https://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\Registry; +use Fisharebest\Webtrees\Validator; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\RequestHandlerInterface; + +/** + * Reorder the media files of a media object. + */ +class ReorderMediaFilesPage implements RequestHandlerInterface +{ + use ViewResponseTrait; + + /** + * @param ServerRequestInterface $request + * + * @return ResponseInterface + */ + public function handle(ServerRequestInterface $request): ResponseInterface + { + $tree = Validator::attributes($request)->tree(); + $xref = Validator::attributes($request)->isXref()->string('xref'); + $media = Registry::mediaFactory()->make($xref, $tree); + $media = Auth::checkMediaAccess($media, true); + $title = $media->fullName() . ' — ' . I18N::translate('Re-order media'); + + if ($media->mediaFiles()->count() < 2) { + return Registry::responseFactory()->redirect(MediaPage::class, [ + 'tree' => $tree->name(), + 'xref' => $media->xref(), + ]); + } + + return $this->viewResponse('edit/reorder-media-files', [ + 'media' => $media, + 'title' => $title, + 'tree' => $tree, + ]); + } +} diff --git a/app/Http/Routes/WebRoutes.php b/app/Http/Routes/WebRoutes.php index 5aba4434ff..0577270e73 100644 --- a/app/Http/Routes/WebRoutes.php +++ b/app/Http/Routes/WebRoutes.php @@ -240,6 +240,8 @@ use Fisharebest\Webtrees\Http\RequestHandlers\ReorderChildrenPage; use Fisharebest\Webtrees\Http\RequestHandlers\ReorderFamiliesAction; use Fisharebest\Webtrees\Http\RequestHandlers\ReorderFamiliesPage; use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaAction; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaFilesAction; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaFilesPage; use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaPage; use Fisharebest\Webtrees\Http\RequestHandlers\ReorderNamesAction; use Fisharebest\Webtrees\Http\RequestHandlers\ReorderNamesPage; @@ -587,6 +589,8 @@ class WebRoutes $router->post(ReorderChildrenAction::class, '/reorder-children/{xref}'); $router->get(ReorderMediaPage::class, '/reorder-media/{xref}'); $router->post(ReorderMediaAction::class, '/reorder-media/{xref}'); + $router->get(ReorderMediaFilesPage::class, '/reorder-media-files/{xref}'); + $router->post(ReorderMediaFilesAction::class, '/reorder-media-files/{xref}'); $router->get(ReorderNamesPage::class, '/reorder-names/{xref}'); $router->post(ReorderNamesAction::class, '/reorder-names/{xref}'); $router->get(ReorderFamiliesPage::class, '/reorder-spouses/{xref}'); diff --git a/resources/views/edit/reorder-media-files.phtml b/resources/views/edit/reorder-media-files.phtml new file mode 100644 index 0000000000..927432cf31 --- /dev/null +++ b/resources/views/edit/reorder-media-files.phtml @@ -0,0 +1,55 @@ +<?php + +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaFilesAction; +use Fisharebest\Webtrees\I18N; +use Fisharebest\Webtrees\Media; +use Fisharebest\Webtrees\View; + +/** + * @var Media $media + * @var string $title + */ + +?> + +<h2 class="wt-page-title"><?= $title ?></h2> + +<form method="post" action="<?= e(route(ReorderMediaFilesAction::class, ['tree' => $media->tree()->name(), 'xref' => $media->xref()])) ?>" class="wt-page-content"> + <?= csrf_field() ?> + + <div class="wt-sortable-list"> + <?php foreach ($media->mediaFiles() as $media_file) : ?> + <div class="card my-2 wt-sortable-item"> + <input type="hidden" name="order[]" value="<?= $media_file->factId() ?>"> + <div class="card-header"> + <?= view('edit/reorder-card-header', ['title' => e($media_file->filename())]) ?> + </div> + + <div class="card-body d-flex"> + <?= $media_file->displayImage(100, 100, 'contain') ?> + <?= e($media_file->title()) ?> + </div> + </div> + <?php endforeach ?> + </div> + + <p> + <button class="btn btn-primary" type="submit"> + <?= view('icons/save') ?> + <?= /* I18N: A button label. */ I18N::translate('save') ?> + </button> + + <a class="btn btn-secondary" href="<?= e($media->url()) ?>"> + <?= view('icons/cancel') ?> + <?= /* I18N: A button label. */ I18N::translate('cancel') ?> + </a> + </p> +</form> + +<?php View::push('javascript') ?> +<script> + new Sortable(document.querySelector(".wt-sortable-list"), { + handle: ".card-header", + }); +</script> +<?php View::endpush() ?> diff --git a/resources/views/media-page-menu.phtml b/resources/views/media-page-menu.phtml index 7a24e5b7cc..a4b25701f4 100644 --- a/resources/views/media-page-menu.phtml +++ b/resources/views/media-page-menu.phtml @@ -7,6 +7,7 @@ use Fisharebest\Webtrees\Http\RequestHandlers\EditRecordPage; use Fisharebest\Webtrees\Http\RequestHandlers\LinkMediaToFamilyModal; use Fisharebest\Webtrees\Http\RequestHandlers\LinkMediaToIndividualModal; use Fisharebest\Webtrees\Http\RequestHandlers\LinkMediaToSourceModal; +use Fisharebest\Webtrees\Http\RequestHandlers\ReorderMediaFilesPage; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Media; use Illuminate\Support\Collection; @@ -37,6 +38,13 @@ use Illuminate\Support\Collection; <?= I18N::translate('Add a media file') ?> </a> + <?php if ($record->mediaFiles()->count() >= 2) : ?> + <a class="dropdown-item" href="<?= route(ReorderMediaFilesPage::class, ['xref' => $record->xref(), 'tree' => $record->tree()->name()]) ?>"> + <?= view('icons/reorder') ?> + <?= I18N::translate('Re-order media files') ?> + </a> + <?php endif ?> + <?php if ($record->missingFacts() !== []) : ?> <div class="dropdown-divider"></div> |
