summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Http/RequestHandlers/ReorderMediaFilesAction.php82
-rw-r--r--app/Http/RequestHandlers/ReorderMediaFilesPage.php64
-rw-r--r--app/Http/Routes/WebRoutes.php4
-rw-r--r--resources/views/edit/reorder-media-files.phtml55
-rw-r--r--resources/views/media-page-menu.phtml8
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>