From 303e8407d1f176a8264ae44370993984c9f1d126 Mon Sep 17 00:00:00 2001 From: Marco Rieser Date: Tue, 26 Aug 2025 21:14:03 +0200 Subject: [PATCH 1/4] Suspend propagation when duplicating entries --- src/Actions/DuplicateEntry.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Actions/DuplicateEntry.php b/src/Actions/DuplicateEntry.php index f278fd6482a..26a3a63e520 100644 --- a/src/Actions/DuplicateEntry.php +++ b/src/Actions/DuplicateEntry.php @@ -66,6 +66,8 @@ public function run($items, $values) private function duplicateEntry(Entry $original, ?string $origin = null) { + $this->suspendPropagation($original); + $originalParent = $this->getEntryParentFromStructure($original); [$title, $slug] = $this->generateTitleAndSlug($original); @@ -175,4 +177,13 @@ public function redirect($items, $values) return $this->newItems->first()->editUrl(); } + + /** + * @param Entry $original + * @return void + */ + private function suspendPropagation(Entry $original): void + { + $original->collection()->propagate(false); + } } From 0fb0beb83787e83b8160b8fedf0c35b66f777715 Mon Sep 17 00:00:00 2001 From: Marco Rieser Date: Tue, 26 Aug 2025 21:49:01 +0200 Subject: [PATCH 2/4] Add test --- tests/Actions/DuplicateEntryTest.php | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/Actions/DuplicateEntryTest.php b/tests/Actions/DuplicateEntryTest.php index c4ffe0a4a95..3edc671801e 100644 --- a/tests/Actions/DuplicateEntryTest.php +++ b/tests/Actions/DuplicateEntryTest.php @@ -433,6 +433,42 @@ public function it_duplicates_an_entry_from_a_non_default_site() ], $this->entryData()); } + #[Test] + public function it_duplicates_an_entry_with_localizations_only_once() + { + $this->setSites([ + 'en' => ['url' => 'http://domain.com/', 'locale' => 'en'], + 'fr' => ['url' => 'http://domain.com/fr/', 'locale' => 'fr'], + ]); + + $collection = Collection::make('test')->sites(['en', 'fr']); + $collection->save(); + + $entry = EntryFactory::id('alfa-id')->locale('en')->collection('test')->slug('alfa')->data(['title' => 'Alfa'])->create(); + $entry->makeLocalization('fr')->id('alfa-id-fr')->data(['title' => 'Alfa (French)'])->save(); + + $this->assertEquals([ + ['slug' => 'alfa', 'published' => true, 'data' => ['title' => 'Alfa'], 'locale' => 'en', 'origin' => ''], + ['slug' => 'alfa', 'published' => true, 'data' => ['title' => 'Alfa (French)'], 'locale' => 'fr', 'origin' => 'en.alfa'], + ], $this->entryData()); + + // Make super user since this test isn't concerned with permissions. + $this->actingAs(tap(User::make()->makeSuper())->save()); + + $collection->propagate(true); + + (new DuplicateEntry)->run(collect([ + Entry::find('alfa-id'), + ]), []); + + $this->assertEquals([ + ['slug' => 'alfa', 'published' => true, 'data' => ['title' => 'Alfa'], 'locale' => 'en', 'origin' => null], + ['slug' => 'alfa', 'published' => true, 'data' => ['title' => 'Alfa (French)'], 'locale' => 'fr', 'origin' => 'en.alfa'], + ['slug' => 'alfa-1', 'published' => false, 'data' => ['title' => 'Alfa (Duplicated)', 'duplicated_from' => 'alfa-id'], 'locale' => 'en', 'origin' => null], + ['slug' => 'alfa-1', 'published' => false, 'data' => ['title' => 'Alfa (French) (Duplicated)', 'duplicated_from' => 'alfa-id-fr'], 'locale' => 'fr', 'origin' => 'en.alfa-1'], + ], $this->entryData()); + } + #[Test] public function if_an_entry_has_an_origin_it_duplicates_the_root_origin() { From 37a7293251546f889c2989ee32b0086f1ff01baf Mon Sep 17 00:00:00 2001 From: Marco Rieser Date: Tue, 26 Aug 2025 21:51:19 +0200 Subject: [PATCH 3/4] Remove docblock --- src/Actions/DuplicateEntry.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Actions/DuplicateEntry.php b/src/Actions/DuplicateEntry.php index 26a3a63e520..68189e408e5 100644 --- a/src/Actions/DuplicateEntry.php +++ b/src/Actions/DuplicateEntry.php @@ -178,10 +178,6 @@ public function redirect($items, $values) return $this->newItems->first()->editUrl(); } - /** - * @param Entry $original - * @return void - */ private function suspendPropagation(Entry $original): void { $original->collection()->propagate(false); From 731f4607edeab3cb0061f3054127f254eded2c2f Mon Sep 17 00:00:00 2001 From: Marco Rieser Date: Tue, 26 Aug 2025 21:52:13 +0200 Subject: [PATCH 4/4] Rename test --- tests/Actions/DuplicateEntryTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Actions/DuplicateEntryTest.php b/tests/Actions/DuplicateEntryTest.php index 3edc671801e..80982519ff4 100644 --- a/tests/Actions/DuplicateEntryTest.php +++ b/tests/Actions/DuplicateEntryTest.php @@ -434,7 +434,7 @@ public function it_duplicates_an_entry_from_a_non_default_site() } #[Test] - public function it_duplicates_an_entry_with_localizations_only_once() + public function it_duplicates_an_entry_with_localizations_without_propagating() { $this->setSites([ 'en' => ['url' => 'http://domain.com/', 'locale' => 'en'],