From f4c00c69036b87307254cd05c270bc0a532aa0ea Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Tue, 26 May 2026 16:30:26 +0200 Subject: [PATCH 1/3] Fix prev/next buttons in asset fieldtype editor --- .../js/components/fieldtypes/assets/Asset.js | 29 +++++++++++++++++-- .../components/fieldtypes/assets/AssetRow.vue | 6 ++-- .../fieldtypes/assets/AssetTile.vue | 6 ++-- .../fieldtypes/assets/AssetsFieldtype.vue | 6 ++-- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/resources/js/components/fieldtypes/assets/Asset.js b/resources/js/components/fieldtypes/assets/Asset.js index 83440d00cb..68427f2ea6 100644 --- a/resources/js/components/fieldtypes/assets/Asset.js +++ b/resources/js/components/fieldtypes/assets/Asset.js @@ -16,11 +16,16 @@ export default { type: Boolean, default: true, }, + siblings: { + type: Array, + default: () => [], + }, }, data() { return { editing: false, + editingId: null, }; }, @@ -76,6 +81,7 @@ export default { if (this.asset.invalid) return; this.editing = true; + this.editingId = this.asset.id; }, remove() { @@ -98,6 +104,7 @@ export default { closeEditor() { this.editing = false; + this.editingId = null; }, assetSaved(asset) { @@ -108,10 +115,28 @@ export default { actionCompleted(successful, response) { if (successful === false) return; const id = response.ids[0] || null; - if (id && id !== this.asset.id) { - this.$emit('id-changed', id); + if (id && id !== this.editingId) { + this.$emit('id-changed', this.editingId, id); } this.closeEditor(); }, + + navigateToPrevious() { + const index = this.siblings.findIndex((asset) => asset.id === this.editingId); + if (index <= 0) return; + + const previousId = this.siblings[index - 1].id; + this.editingId = null; + this.$nextTick(() => (this.editingId = previousId)); + }, + + navigateToNext() { + const index = this.siblings.findIndex((asset) => asset.id === this.editingId); + if (index === -1 || index >= this.siblings.length - 1) return; + + const nextId = this.siblings[index + 1].id; + this.editingId = null; + this.$nextTick(() => (this.editingId = nextId)); + }, }, }; diff --git a/resources/js/components/fieldtypes/assets/AssetRow.vue b/resources/js/components/fieldtypes/assets/AssetRow.vue index 2d2f736e44..c8d62b8e23 100644 --- a/resources/js/components/fieldtypes/assets/AssetRow.vue +++ b/resources/js/components/fieldtypes/assets/AssetRow.vue @@ -57,9 +57,11 @@ /> @@ -156,12 +157,13 @@ v-for="asset in assets" :key="asset.id" :asset="asset" + :siblings="assets" :read-only="isReadOnly" :show-filename="config.show_filename" :show-set-alt="showSetAlt" @updated="assetUpdated" @removed="assetRemoved" - @id-changed="idChanged(asset.id, $event)" + @id-changed="idChanged" /> From 45a55213ea6ec91c1c2e3327c2a15cad2f009c79 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Tue, 26 May 2026 16:31:49 +0200 Subject: [PATCH 2/3] Fix Bard `Edit Image` button --- resources/js/components/fieldtypes/assets/Asset.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/js/components/fieldtypes/assets/Asset.js b/resources/js/components/fieldtypes/assets/Asset.js index 68427f2ea6..a505a628dd 100644 --- a/resources/js/components/fieldtypes/assets/Asset.js +++ b/resources/js/components/fieldtypes/assets/Asset.js @@ -78,10 +78,10 @@ export default { edit() { if (this.readOnly) return; - if (this.asset.invalid) return; + if (this.asset?.invalid) return; this.editing = true; - this.editingId = this.asset.id; + this.editingId = this.asset?.id ?? null; }, remove() { From 7d50e17d4265553071701545c0f54c09bd63c872 Mon Sep 17 00:00:00 2001 From: Joshua Blum Date: Tue, 26 May 2026 16:46:17 +0200 Subject: [PATCH 3/3] Hide prev/next buttons when there's just one asset --- resources/js/components/assets/Editor/Editor.vue | 8 ++++++-- resources/js/components/fieldtypes/assets/AssetRow.vue | 1 + resources/js/components/fieldtypes/assets/AssetTile.vue | 1 + resources/js/components/fieldtypes/bard/Image.vue | 1 + 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/resources/js/components/assets/Editor/Editor.vue b/resources/js/components/assets/Editor/Editor.vue index 06eb140b95..87cd7a6d1d 100644 --- a/resources/js/components/assets/Editor/Editor.vue +++ b/resources/js/components/assets/Editor/Editor.vue @@ -157,8 +157,8 @@
- - + +
@@ -239,6 +239,10 @@ export default { type: Boolean, default: true, }, + showNavigation: { + type: Boolean, + default: true, + }, allowDeleting: { type: Boolean, default() { diff --git a/resources/js/components/fieldtypes/assets/AssetRow.vue b/resources/js/components/fieldtypes/assets/AssetRow.vue index c8d62b8e23..74c9b7160e 100644 --- a/resources/js/components/fieldtypes/assets/AssetRow.vue +++ b/resources/js/components/fieldtypes/assets/AssetRow.vue @@ -60,6 +60,7 @@ v-if="editingId" :id="editingId" :allow-deleting="false" + :show-navigation="siblings.length > 1" @previous="navigateToPrevious" @next="navigateToNext" @closed="closeEditor" diff --git a/resources/js/components/fieldtypes/assets/AssetTile.vue b/resources/js/components/fieldtypes/assets/AssetTile.vue index b464cc2d05..bfab7cdd54 100644 --- a/resources/js/components/fieldtypes/assets/AssetTile.vue +++ b/resources/js/components/fieldtypes/assets/AssetTile.vue @@ -12,6 +12,7 @@ v-if="editingId" :id="editingId" :allow-deleting="false" + :show-navigation="siblings.length > 1" @previous="navigateToPrevious" @next="navigateToNext" @closed="closeEditor" diff --git a/resources/js/components/fieldtypes/bard/Image.vue b/resources/js/components/fieldtypes/bard/Image.vue index db21e21290..0dead0b49e 100644 --- a/resources/js/components/fieldtypes/bard/Image.vue +++ b/resources/js/components/fieldtypes/bard/Image.vue @@ -55,6 +55,7 @@ :id="assetId" :showToolbar="false" :allow-deleting="false" + :show-navigation="false" @closed="closeEditor" @saved="editorAssetSaved" @actionCompleted="actionCompleted"