From 949466c95388ba806ca9cd9eb7e342b3035b1fdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Schwei=C3=9Finger?= Date: Fri, 24 May 2024 12:27:23 +0200 Subject: [PATCH 01/14] Consider failed publish/unpublish actions --- resources/lang/de.json | 1 + resources/lang/de_CH.json | 1 + resources/lang/fr.json | 1 + resources/lang/nl.json | 1 + src/Actions/Publish.php | 6 ++++-- src/Actions/Unpublish.php | 6 ++++-- src/Http/Controllers/CP/ActionController.php | 2 ++ 7 files changed, 14 insertions(+), 4 deletions(-) diff --git a/resources/lang/de.json b/resources/lang/de.json index b1baf57b82..014dd525fb 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -20,6 +20,7 @@ "A valid blueprint is required.": "Ein gültiger Blueprint ist erforderlich.", "Above": "Oberhalb", "Action completed": "Aktion abgeschlossen", + "Action failed": "Aktion fehlgeschlagen", "Activate Account": "Account aktivieren", "Activation URL": "Aktivierungs-URL", "Active": "Aktiv", diff --git a/resources/lang/de_CH.json b/resources/lang/de_CH.json index fdd1ff8cd4..8807599313 100644 --- a/resources/lang/de_CH.json +++ b/resources/lang/de_CH.json @@ -20,6 +20,7 @@ "A valid blueprint is required.": "Ein gültiger Blueprint ist erforderlich.", "Above": "Oberhalb", "Action completed": "Aktion abgeschlossen", + "Action failed": "Aktion fehlgeschlagen", "Activate Account": "Account aktivieren", "Activation URL": "Aktivierungs-URL", "Active": "Aktiv", diff --git a/resources/lang/fr.json b/resources/lang/fr.json index 50f6daec59..f1462b5d77 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -20,6 +20,7 @@ "A valid blueprint is required.": "Un Blueprint valide est exigé.", "Above": "Au dessus", "Action completed": "Action terminée", + "Action failed": "Action échouée", "Activate Account": "Activer le compte", "Activation URL": "URL d'activation", "Active": "actif", diff --git a/resources/lang/nl.json b/resources/lang/nl.json index 7cee6cfe75..90b6ac4bef 100644 --- a/resources/lang/nl.json +++ b/resources/lang/nl.json @@ -20,6 +20,7 @@ "A valid blueprint is required.": "Een geldige blueprint is vereist.", "Above": "Boven", "Action completed": "Actie voltooid", + "Action failed": "Actie gefaald", "Activate Account": "Activeer Account", "Activation URL": "Activatie-url", "Active": "Actief", diff --git a/src/Actions/Publish.php b/src/Actions/Publish.php index d573174cbc..62dee6c593 100644 --- a/src/Actions/Publish.php +++ b/src/Actions/Publish.php @@ -49,8 +49,10 @@ public function buttonText() public function run($entries, $values) { - $entries->each(function ($entry) { - $entry->publish(['user' => User::current()]); + $failedActions = $entries->filter(function ($entry) { + return ! $entry->publish(['user' => User::current()]); }); + + return $failedActions->isEmpty(); } } diff --git a/src/Actions/Unpublish.php b/src/Actions/Unpublish.php index 2d27e0f8dc..7232e8a69e 100644 --- a/src/Actions/Unpublish.php +++ b/src/Actions/Unpublish.php @@ -44,8 +44,10 @@ public function buttonText() public function run($entries, $values) { - $entries->each(function ($entry) { - $entry->unpublish(['user' => User::current()]); + $failedActions = $entries->filter(function ($entry) { + return ! $entry->unpublish(['user' => User::current()]); }); + + return $failedActions->isEmpty(); } } diff --git a/src/Http/Controllers/CP/ActionController.php b/src/Http/Controllers/CP/ActionController.php index 62a3860058..bfc23412ab 100644 --- a/src/Http/Controllers/CP/ActionController.php +++ b/src/Http/Controllers/CP/ActionController.php @@ -38,6 +38,8 @@ public function run(Request $request) $response = $action->run($items, $values); + abort_unless($response !== false, 418, __('Action failed')); + if ($redirect = $action->redirect($items, $values)) { return [ 'redirect' => $redirect, From 6e0f04e06ec28321d13daf415a4425e314484b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Schwei=C3=9Finger?= Date: Fri, 24 May 2024 13:29:00 +0200 Subject: [PATCH 02/14] add dedicated error message and close action modal --- resources/js/components/data-list/HasActions.js | 7 ++++++- src/Actions/Publish.php | 5 ++++- src/Actions/Unpublish.php | 5 ++++- src/Http/Controllers/CP/ActionController.php | 17 +++++++++++++---- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/resources/js/components/data-list/HasActions.js b/resources/js/components/data-list/HasActions.js index 6b05e31209..9b7d826ded 100644 --- a/resources/js/components/data-list/HasActions.js +++ b/resources/js/components/data-list/HasActions.js @@ -15,7 +15,12 @@ export default { this.$events.$emit('reset-action-modals'); if (response.message !== false) { - this.$toast.success(response.message || __("Action completed")); + if (response.status === 'failed') { + this.$toast.error(response.message || __("Action failed")); + } + else { + this.$toast.success(response.message || __("Action completed")); + } } this.afterActionSuccessfullyCompleted(); diff --git a/src/Actions/Publish.php b/src/Actions/Publish.php index 62dee6c593..50b2283c86 100644 --- a/src/Actions/Publish.php +++ b/src/Actions/Publish.php @@ -2,6 +2,7 @@ namespace Statamic\Actions; +use Exception; use Statamic\Contracts\Entries\Entry; use Statamic\Facades\User; @@ -53,6 +54,8 @@ public function run($entries, $values) return ! $entry->publish(['user' => User::current()]); }); - return $failedActions->isEmpty(); + if ($failedActions->isNotEmpty()) { + throw new Exception(__("Couldn't publish entry")); + } } } diff --git a/src/Actions/Unpublish.php b/src/Actions/Unpublish.php index 7232e8a69e..5ac26f756b 100644 --- a/src/Actions/Unpublish.php +++ b/src/Actions/Unpublish.php @@ -2,6 +2,7 @@ namespace Statamic\Actions; +use Exception; use Statamic\Contracts\Entries\Entry; use Statamic\Facades\User; @@ -48,6 +49,8 @@ public function run($entries, $values) return ! $entry->unpublish(['user' => User::current()]); }); - return $failedActions->isEmpty(); + if ($failedActions->isNotEmpty()) { + throw new Exception(__("Couldn't unpublish entry")); + } } } diff --git a/src/Http/Controllers/CP/ActionController.php b/src/Http/Controllers/CP/ActionController.php index bfc23412ab..6ecd6f487c 100644 --- a/src/Http/Controllers/CP/ActionController.php +++ b/src/Http/Controllers/CP/ActionController.php @@ -2,6 +2,7 @@ namespace Statamic\Http\Controllers\CP; +use Exception; use Illuminate\Http\Request; use Statamic\Facades\Action; use Statamic\Facades\User; @@ -35,10 +36,15 @@ public function run(Request $request) abort_unless($unauthorized->isEmpty(), 403, __('You are not authorized to run this action.')); $values = $action->fields()->addValues($request->all())->process()->values()->all(); + $status = 'successful'; - $response = $action->run($items, $values); - - abort_unless($response !== false, 418, __('Action failed')); + try { + $response = $action->run($items, $values); + } + catch (Exception $e) { + $response = empty($e->getMessage())? __('Action failed') : $e->getMessage(); + $status = 'failed'; + } if ($redirect = $action->redirect($items, $values)) { return [ @@ -50,7 +56,10 @@ public function run(Request $request) } if (is_string($response)) { - $response = ['message' => $response]; + $response = [ + 'message' => $response, + 'status' => $status, + ]; } $response = $response ?: []; From b42a7634ed051776075c3ce8c9ec67e8322c0dbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Schwei=C3=9Finger?= Date: Wed, 5 Jun 2024 11:45:45 +0200 Subject: [PATCH 03/14] fix: code style --- src/Http/Controllers/CP/ActionController.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Http/Controllers/CP/ActionController.php b/src/Http/Controllers/CP/ActionController.php index 6ecd6f487c..23462a10d0 100644 --- a/src/Http/Controllers/CP/ActionController.php +++ b/src/Http/Controllers/CP/ActionController.php @@ -40,9 +40,8 @@ public function run(Request $request) try { $response = $action->run($items, $values); - } - catch (Exception $e) { - $response = empty($e->getMessage())? __('Action failed') : $e->getMessage(); + } catch (Exception $e) { + $response = empty($e->getMessage()) ? __('Action failed') : $e->getMessage(); $status = 'failed'; } From 2153171b22af9011ba19763cd66156b1fe8874ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Schwei=C3=9Finger?= Date: Thu, 6 Jun 2024 19:14:56 +0200 Subject: [PATCH 04/14] extend improved handling to delete action --- resources/lang/de.json | 7 ++++ resources/lang/de_CH.json | 7 ++++ resources/lang/fr.json | 7 ++++ resources/lang/nl.json | 7 ++++ src/Actions/Concerns/DeletesItems.php | 50 +++++++++++++++++++++++++++ src/Actions/Delete.php | 5 ++- src/Actions/DeleteMultisiteEntry.php | 5 ++- src/Actions/Publish.php | 1 + src/Actions/Unpublish.php | 1 + 9 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 src/Actions/Concerns/DeletesItems.php diff --git a/resources/lang/de.json b/resources/lang/de.json index 014dd525fb..29df016c34 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -239,6 +239,13 @@ "Copy Password Reset Link": "Passwort Zurücksetzen Link kopieren", "Copy URL": "URL kopieren", "Core": "Core", + "Couldn't delete asset": "Datei konnte nicht gelöscht werden", + "Couldn't delete asset folder": "Ordner konnte nicht gelöscht werden", + "Couldn't delete entry": "Eintrag konnte nicht gelöscht werden", + "Couldn't delete form": "Formular konnte nicht gelöscht werden", + "Couldn't delete submission": "Antwort konnte nicht gelöscht werden", + "Couldn't delete term": "Begriff konnte nicht gelöscht werden", + "Couldn't delete user": "Benutzer konnte nicht gelöscht werden", "Couldn't save entry": "Eintrag konnte nicht gespeichert werden", "Couldn't save term": "Begriff konnte nicht gespeichert werden", "CP Nav Preferences": "Voreinstellungen CP Navigation", diff --git a/resources/lang/de_CH.json b/resources/lang/de_CH.json index 8807599313..4feadc05fd 100644 --- a/resources/lang/de_CH.json +++ b/resources/lang/de_CH.json @@ -239,6 +239,13 @@ "Copy Password Reset Link": "Passwort Zurücksetzen Link kopieren", "Copy URL": "URL kopieren", "Core": "Core", + "Couldn't delete asset": "Datei konnte nicht gelöscht werden", + "Couldn't delete asset folder": "Ordner konnte nicht gelöscht werden", + "Couldn't delete entry": "Eintrag konnte nicht gelöscht werden", + "Couldn't delete form": "Formular konnte nicht gelöscht werden", + "Couldn't delete submission": "Antwort konnte nicht gelöscht werden", + "Couldn't delete term": "Begriff konnte nicht gelöscht werden", + "Couldn't delete user": "Benutzer konnte nicht gelöscht werden", "Couldn't save entry": "Eintrag konnte nicht gespeichert werden", "Couldn't save term": "Begriff konnte nicht gespeichert werden", "CP Nav Preferences": "Voreinstellungen CP Navigation", diff --git a/resources/lang/fr.json b/resources/lang/fr.json index f1462b5d77..303ba94e2a 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -240,6 +240,13 @@ "Copy Password Reset Link": "Copier le lien de réinitialisation du mot de passe", "Copy URL": "Copier l'URL", "Core": "Core", + "Couldn't delete asset": "Impossible de supprimer la ressource", + "Couldn't delete asset folder": "Impossible de supprimer le dossier", + "Couldn't delete entry": "Impossible de supprimer l'entrée", + "Couldn't delete form": "Impossible de supprimer le formulaire", + "Couldn't delete submission": "Impossible de supprimer la soumission", + "Couldn't delete term": "Impossible de supprimer le terme", + "Couldn't delete user": "Impossible de supprimer l'utilisateur", "Couldn't save entry": "Impossible d'enregistrer l'entrée", "Couldn't save term": "Impossible d'enregistrer le terme", "CP Nav Preferences": "Préférences de navigation du CP", diff --git a/resources/lang/nl.json b/resources/lang/nl.json index 90b6ac4bef..70a0cdc089 100644 --- a/resources/lang/nl.json +++ b/resources/lang/nl.json @@ -237,6 +237,13 @@ "Copy Password Reset Link": "Kopieer wachtwoordresetlink", "Copy URL": "Kopieer URL", "Core": "Core", + "Couldn't delete asset": "Kon de asset niet verwijderen", + "Couldn't delete asset folder": "Kon de asset niet verwijderen", + "Couldn't delete entry": "Kon de entry niet verwijderen", + "Couldn't delete form": "Kon de formulier niet verwijderen", + "Couldn't delete submission": "Kon de inzending niet verwijderen", + "Couldn't delete term": "Kon de term niet verwijderen", + "Couldn't delete user": "Kon de gebruiker niet verwijderen", "Couldn't save entry": "Kon de entry niet opslaan", "Couldn't save term": "Kon de term niet opslaan", "CP Nav Preferences": "CP Nav Instellingen", diff --git a/src/Actions/Concerns/DeletesItems.php b/src/Actions/Concerns/DeletesItems.php new file mode 100644 index 0000000000..28ed582c88 --- /dev/null +++ b/src/Actions/Concerns/DeletesItems.php @@ -0,0 +1,50 @@ +filter(function ($item) { + return ! $item->delete(); + }); + + if ($failedActions->isNotEmpty()) { + throw new Exception($this->getCouldntDeleteTranslation($items->first())); + } + } + + private function getCouldntDeleteTranslation($item) + { + switch (true) { + case $item instanceof Contracts\Assets\Asset: + /** @translation */ + return __("Couldn't delete asset"); + case $item instanceof Contracts\Assets\AssetFolder: + /** @translation */ + return __("Couldn't delete asset folder"); + case $item instanceof Contracts\Auth\User: + /** @translation */ + return __("Couldn't delete user"); + case $item instanceof Contracts\Entries\Entry && $item->collection()->sites()->count() === 1: + /** @translation */ + return __("Couldn't delete entry"); + case $item instanceof Contracts\Forms\Form: + /** @translation */ + return __("Couldn't delete form"); + case $item instanceof Contracts\Forms\Submission: + /** @translation */ + return __("Couldn't delete submission"); + case $item instanceof Contracts\Taxonomies\Term: + /** @translation */ + return __("Couldn't delete term"); + default: + /** @translation */ + return __("Couldn't delete item"); + } + } +} diff --git a/src/Actions/Delete.php b/src/Actions/Delete.php index 30dbd99877..d4050e4f03 100644 --- a/src/Actions/Delete.php +++ b/src/Actions/Delete.php @@ -2,10 +2,13 @@ namespace Statamic\Actions; +use Statamic\Actions\Concerns\DeletesItems; use Statamic\Contracts; class Delete extends Action { + use DeletesItems; + protected $dangerous = true; public static function title() @@ -59,7 +62,7 @@ public function bypassesDirtyWarning(): bool public function run($items, $values) { - $items->each->delete(); + return $this->deleteItems($items); } public function redirect($items, $values) diff --git a/src/Actions/DeleteMultisiteEntry.php b/src/Actions/DeleteMultisiteEntry.php index 78ef6bd8d0..1365e59197 100644 --- a/src/Actions/DeleteMultisiteEntry.php +++ b/src/Actions/DeleteMultisiteEntry.php @@ -2,11 +2,14 @@ namespace Statamic\Actions; +use Statamic\Actions\Concerns\DeletesItems; use Statamic\Contracts\Entries\Entry; use Statamic\Statamic; class DeleteMultisiteEntry extends Delete { + use DeletesItems; + public function visibleTo($item) { if (! ($item instanceof Entry && $item->collection()->sites()->count() > 1)) { @@ -48,6 +51,6 @@ public function run($items, $values) $items->each->deleteDescendants(); } - $items->each->delete(); + return $this->deleteItems($items); } } diff --git a/src/Actions/Publish.php b/src/Actions/Publish.php index 50b2283c86..d2725f0bfc 100644 --- a/src/Actions/Publish.php +++ b/src/Actions/Publish.php @@ -55,6 +55,7 @@ public function run($entries, $values) }); if ($failedActions->isNotEmpty()) { + /** @translation */ throw new Exception(__("Couldn't publish entry")); } } diff --git a/src/Actions/Unpublish.php b/src/Actions/Unpublish.php index 5ac26f756b..3d58731f4a 100644 --- a/src/Actions/Unpublish.php +++ b/src/Actions/Unpublish.php @@ -50,6 +50,7 @@ public function run($entries, $values) }); if ($failedActions->isNotEmpty()) { + /** @translation */ throw new Exception(__("Couldn't unpublish entry")); } } From aa451c09b6c7553fc101b6dda50335b725b1fa86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Schwei=C3=9Finger?= Date: Thu, 6 Jun 2024 19:16:11 +0200 Subject: [PATCH 05/14] use bool value for action success status --- resources/js/components/data-list/HasActions.js | 12 +++++------- src/Http/Controllers/CP/ActionController.php | 10 ++++------ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/resources/js/components/data-list/HasActions.js b/resources/js/components/data-list/HasActions.js index 9b7d826ded..5dfb2dc133 100644 --- a/resources/js/components/data-list/HasActions.js +++ b/resources/js/components/data-list/HasActions.js @@ -14,13 +14,11 @@ export default { this.$events.$emit('clear-selections'); this.$events.$emit('reset-action-modals'); - if (response.message !== false) { - if (response.status === 'failed') { - this.$toast.error(response.message || __("Action failed")); - } - else { - this.$toast.success(response.message || __("Action completed")); - } + if (response.successful === false) { + this.$toast.error(response.message || __("Action failed")); + } + else { + this.$toast.success(response.message || __("Action completed")); } this.afterActionSuccessfullyCompleted(); diff --git a/src/Http/Controllers/CP/ActionController.php b/src/Http/Controllers/CP/ActionController.php index 23462a10d0..875ff17a94 100644 --- a/src/Http/Controllers/CP/ActionController.php +++ b/src/Http/Controllers/CP/ActionController.php @@ -36,13 +36,13 @@ public function run(Request $request) abort_unless($unauthorized->isEmpty(), 403, __('You are not authorized to run this action.')); $values = $action->fields()->addValues($request->all())->process()->values()->all(); - $status = 'successful'; + $successful = true; try { $response = $action->run($items, $values); } catch (Exception $e) { $response = empty($e->getMessage()) ? __('Action failed') : $e->getMessage(); - $status = 'failed'; + $successful = false; } if ($redirect = $action->redirect($items, $values)) { @@ -55,13 +55,11 @@ public function run(Request $request) } if (is_string($response)) { - $response = [ - 'message' => $response, - 'status' => $status, - ]; + $response = ['message' => $response]; } $response = $response ?: []; + $response['successful'] = $successful; if (Arr::get($context, 'view') === 'form') { $response['data'] = $this->getItemData($items->first(), $context); From ee0e9145512650163fe5a32dfecac8578d5fbb0d Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 16 Sep 2024 12:10:13 -0400 Subject: [PATCH 06/14] if publish save fails, return false --- src/Data/Publishable.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Data/Publishable.php b/src/Data/Publishable.php index 79c46f7c2b..861628b9d7 100644 --- a/src/Data/Publishable.php +++ b/src/Data/Publishable.php @@ -23,7 +23,11 @@ public function publish($options = []) return $this->publishWorkingCopy($options); } - $this->published(true)->save(); + $saved = $this->published(true)->save(); + + if (! $saved) { + return false; + } return $this; } From 5b535638b3b1f3b55c0f18c6a7c88849381ac5b7 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 16 Sep 2024 12:30:35 -0400 Subject: [PATCH 07/14] var --- src/Http/Controllers/CP/ActionController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Controllers/CP/ActionController.php b/src/Http/Controllers/CP/ActionController.php index 875ff17a94..dc4c1ecc97 100644 --- a/src/Http/Controllers/CP/ActionController.php +++ b/src/Http/Controllers/CP/ActionController.php @@ -41,7 +41,7 @@ public function run(Request $request) try { $response = $action->run($items, $values); } catch (Exception $e) { - $response = empty($e->getMessage()) ? __('Action failed') : $e->getMessage(); + $response = empty($msg = $e->getMessage()) ? __('Action failed') : $msg; $successful = false; } From 4e1a16bfea7a24da0ce9d2904214f5dc1ff3b530 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 16 Sep 2024 12:32:01 -0400 Subject: [PATCH 08/14] we use the word success in other responses --- resources/js/components/data-list/HasActions.js | 2 +- src/Http/Controllers/CP/ActionController.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/js/components/data-list/HasActions.js b/resources/js/components/data-list/HasActions.js index 5dfb2dc133..6d4b41ff9b 100644 --- a/resources/js/components/data-list/HasActions.js +++ b/resources/js/components/data-list/HasActions.js @@ -14,7 +14,7 @@ export default { this.$events.$emit('clear-selections'); this.$events.$emit('reset-action-modals'); - if (response.successful === false) { + if (response.success === false) { this.$toast.error(response.message || __("Action failed")); } else { diff --git a/src/Http/Controllers/CP/ActionController.php b/src/Http/Controllers/CP/ActionController.php index dc4c1ecc97..5a022df989 100644 --- a/src/Http/Controllers/CP/ActionController.php +++ b/src/Http/Controllers/CP/ActionController.php @@ -59,7 +59,7 @@ public function run(Request $request) } $response = $response ?: []; - $response['successful'] = $successful; + $response['success'] = $successful; if (Arr::get($context, 'view') === 'form') { $response['data'] = $this->getItemData($items->first(), $context); From 5be756b5a3686212cd661520808a0eadc5390d29 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 16 Sep 2024 12:32:05 -0400 Subject: [PATCH 09/14] nitpick --- resources/js/components/data-list/HasActions.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/js/components/data-list/HasActions.js b/resources/js/components/data-list/HasActions.js index 6d4b41ff9b..6e58a50db1 100644 --- a/resources/js/components/data-list/HasActions.js +++ b/resources/js/components/data-list/HasActions.js @@ -16,8 +16,7 @@ export default { if (response.success === false) { this.$toast.error(response.message || __("Action failed")); - } - else { + } else { this.$toast.success(response.message || __("Action completed")); } From 66882456995a24235bff5a233da349393c94b556 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 23 Sep 2024 14:45:12 -0400 Subject: [PATCH 10/14] adjust --- src/Actions/Concerns/DeletesItems.php | 50 --------------------------- src/Actions/Delete.php | 16 ++++++++- src/Actions/DeleteMultisiteEntry.php | 19 +++++++--- src/Actions/Publish.php | 20 +++++++---- src/Actions/Unpublish.php | 22 +++++++----- 5 files changed, 57 insertions(+), 70 deletions(-) delete mode 100644 src/Actions/Concerns/DeletesItems.php diff --git a/src/Actions/Concerns/DeletesItems.php b/src/Actions/Concerns/DeletesItems.php deleted file mode 100644 index 28ed582c88..0000000000 --- a/src/Actions/Concerns/DeletesItems.php +++ /dev/null @@ -1,50 +0,0 @@ -filter(function ($item) { - return ! $item->delete(); - }); - - if ($failedActions->isNotEmpty()) { - throw new Exception($this->getCouldntDeleteTranslation($items->first())); - } - } - - private function getCouldntDeleteTranslation($item) - { - switch (true) { - case $item instanceof Contracts\Assets\Asset: - /** @translation */ - return __("Couldn't delete asset"); - case $item instanceof Contracts\Assets\AssetFolder: - /** @translation */ - return __("Couldn't delete asset folder"); - case $item instanceof Contracts\Auth\User: - /** @translation */ - return __("Couldn't delete user"); - case $item instanceof Contracts\Entries\Entry && $item->collection()->sites()->count() === 1: - /** @translation */ - return __("Couldn't delete entry"); - case $item instanceof Contracts\Forms\Form: - /** @translation */ - return __("Couldn't delete form"); - case $item instanceof Contracts\Forms\Submission: - /** @translation */ - return __("Couldn't delete submission"); - case $item instanceof Contracts\Taxonomies\Term: - /** @translation */ - return __("Couldn't delete term"); - default: - /** @translation */ - return __("Couldn't delete item"); - } - } -} diff --git a/src/Actions/Delete.php b/src/Actions/Delete.php index d4050e4f03..3a2a77739d 100644 --- a/src/Actions/Delete.php +++ b/src/Actions/Delete.php @@ -62,7 +62,21 @@ public function bypassesDirtyWarning(): bool public function run($items, $values) { - return $this->deleteItems($items); + $failures = $items->reject(fn ($entry) => $entry->delete()); + $total = $items->count(); + + if ($failures->isNotEmpty()) { + $success = $total - $failures->count(); + if ($total === 1) { + throw new \Exception(__('Item could not be deleted')); + } elseif ($success === 0) { + throw new \Exception(__('Items could not be deleted')); + } else { + throw new \Exception(__(':success/:total items were deleted', ['total' => $total, 'success' => $success])); + } + } + + return trans_choice('Item deleted|Items deleted', $total); } public function redirect($items, $values) diff --git a/src/Actions/DeleteMultisiteEntry.php b/src/Actions/DeleteMultisiteEntry.php index f54ae557dc..4d4b70e995 100644 --- a/src/Actions/DeleteMultisiteEntry.php +++ b/src/Actions/DeleteMultisiteEntry.php @@ -2,15 +2,12 @@ namespace Statamic\Actions; -use Statamic\Actions\Concerns\DeletesItems; use Statamic\Contracts\Entries\Entry; use Statamic\Facades\User; use Statamic\Statamic; class DeleteMultisiteEntry extends Delete { - use DeletesItems; - public function visibleTo($item) { if (! ($item instanceof Entry && $item->collection()->sites()->count() > 1)) { @@ -56,7 +53,21 @@ public function run($items, $values) $items->each->deleteDescendants(); } - return $this->deleteItems($items); + $failures = $items->reject(fn ($entry) => $entry->delete()); + $total = $items->count(); + + if ($failures->isNotEmpty()) { + $success = $total - $failures->count(); + if ($total === 1) { + throw new \Exception(__('Entry could not be deleted')); + } elseif ($success === 0) { + throw new \Exception(__('Entries could not be deleted')); + } else { + throw new \Exception(__(':success/:total entries were deleted', ['total' => $total, 'success' => $success])); + } + } + + return trans_choice('Entry deleted|Entries deleted', $total); } private function canChangeBehavior(): bool diff --git a/src/Actions/Publish.php b/src/Actions/Publish.php index d2725f0bfc..14ee1c9eb3 100644 --- a/src/Actions/Publish.php +++ b/src/Actions/Publish.php @@ -2,7 +2,6 @@ namespace Statamic\Actions; -use Exception; use Statamic\Contracts\Entries\Entry; use Statamic\Facades\User; @@ -50,13 +49,20 @@ public function buttonText() public function run($entries, $values) { - $failedActions = $entries->filter(function ($entry) { - return ! $entry->publish(['user' => User::current()]); - }); + $failures = $entries->reject(fn ($entry) => $entry->publish(['user' => User::current()])); + $total = $entries->count(); - if ($failedActions->isNotEmpty()) { - /** @translation */ - throw new Exception(__("Couldn't publish entry")); + if ($failures->isNotEmpty()) { + $success = $total - $failures->count(); + if ($total === 1) { + throw new \Exception(__('Entry could not be published')); + } elseif ($success === 0) { + throw new \Exception(__('Entries could not be published')); + } else { + throw new \Exception(__(':success/:total entries were published', ['total' => $total, 'success' => $success])); + } } + + return trans_choice('Entry published|Entries published', $total); } } diff --git a/src/Actions/Unpublish.php b/src/Actions/Unpublish.php index 3d58731f4a..c30e807da3 100644 --- a/src/Actions/Unpublish.php +++ b/src/Actions/Unpublish.php @@ -2,7 +2,6 @@ namespace Statamic\Actions; -use Exception; use Statamic\Contracts\Entries\Entry; use Statamic\Facades\User; @@ -45,13 +44,20 @@ public function buttonText() public function run($entries, $values) { - $failedActions = $entries->filter(function ($entry) { - return ! $entry->unpublish(['user' => User::current()]); - }); - - if ($failedActions->isNotEmpty()) { - /** @translation */ - throw new Exception(__("Couldn't unpublish entry")); + $failures = $entries->reject(fn ($entry) => $entry->unpublish(['user' => User::current()])); + $total = $entries->count(); + + if ($failures->isNotEmpty()) { + $success = $total - $failures->count(); + if ($total === 1) { + throw new \Exception(__('Entry could not be unpublished')); + } elseif ($success === 0) { + throw new \Exception(__('Entries could not be unpublished')); + } else { + throw new \Exception(__(':success/:total entries were unpublished', ['total' => $total, 'success' => $success])); + } } + + return trans_choice('Entry unpublished|Entries unpublished', $total); } } From 05ae8f600512ec2b08072abb3b0b17a47c0f779d Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 23 Sep 2024 14:47:44 -0400 Subject: [PATCH 11/14] wip --- resources/lang/de.json | 7 ------- resources/lang/de_CH.json | 7 ------- resources/lang/fr.json | 7 ------- resources/lang/nl.json | 7 ------- 4 files changed, 28 deletions(-) diff --git a/resources/lang/de.json b/resources/lang/de.json index 7f8300c97f..8626052c5b 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -240,13 +240,6 @@ "Copy Password Reset Link": "Passwort Zurücksetzen Link kopieren", "Copy URL": "URL kopieren", "Core": "Core", - "Couldn't delete asset": "Datei konnte nicht gelöscht werden", - "Couldn't delete asset folder": "Ordner konnte nicht gelöscht werden", - "Couldn't delete entry": "Eintrag konnte nicht gelöscht werden", - "Couldn't delete form": "Formular konnte nicht gelöscht werden", - "Couldn't delete submission": "Antwort konnte nicht gelöscht werden", - "Couldn't delete term": "Begriff konnte nicht gelöscht werden", - "Couldn't delete user": "Benutzer konnte nicht gelöscht werden", "Couldn't publish entry": "Eintrag konnte nicht veröffentlicht werden", "Couldn't save entry": "Eintrag konnte nicht gespeichert werden", "Couldn't save term": "Begriff konnte nicht gespeichert werden", diff --git a/resources/lang/de_CH.json b/resources/lang/de_CH.json index efd9ae1674..6b00b1b5b8 100644 --- a/resources/lang/de_CH.json +++ b/resources/lang/de_CH.json @@ -240,13 +240,6 @@ "Copy Password Reset Link": "Passwort Zurücksetzen Link kopieren", "Copy URL": "URL kopieren", "Core": "Core", - "Couldn't delete asset": "Datei konnte nicht gelöscht werden", - "Couldn't delete asset folder": "Ordner konnte nicht gelöscht werden", - "Couldn't delete entry": "Eintrag konnte nicht gelöscht werden", - "Couldn't delete form": "Formular konnte nicht gelöscht werden", - "Couldn't delete submission": "Antwort konnte nicht gelöscht werden", - "Couldn't delete term": "Begriff konnte nicht gelöscht werden", - "Couldn't delete user": "Benutzer konnte nicht gelöscht werden", "Couldn't publish entry": "Eintrag konnte nicht veröffentlicht werden", "Couldn't save entry": "Eintrag konnte nicht gespeichert werden", "Couldn't save term": "Begriff konnte nicht gespeichert werden", diff --git a/resources/lang/fr.json b/resources/lang/fr.json index d88290acc3..b309ce01a7 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -244,13 +244,6 @@ "Copy to clipboard": "Copier vers le presse-papier", "Copy URL": "Copier l'URL", "Core": "Core", - "Couldn't delete asset": "Impossible de supprimer la ressource", - "Couldn't delete asset folder": "Impossible de supprimer le dossier", - "Couldn't delete entry": "Impossible de supprimer l'entrée", - "Couldn't delete form": "Impossible de supprimer le formulaire", - "Couldn't delete submission": "Impossible de supprimer la soumission", - "Couldn't delete term": "Impossible de supprimer le terme", - "Couldn't delete user": "Impossible de supprimer l'utilisateur", "Couldn't save entry": "Impossible d'enregistrer l'entrée", "Couldn't save term": "Impossible d'enregistrer le terme", "Couldn't publish entry": "Impossible de publier l'entrée", diff --git a/resources/lang/nl.json b/resources/lang/nl.json index 9785c1ddff..92d8227204 100644 --- a/resources/lang/nl.json +++ b/resources/lang/nl.json @@ -237,13 +237,6 @@ "Copy Password Reset Link": "Kopieer wachtwoordresetlink", "Copy URL": "Kopieer URL", "Core": "Core", - "Couldn't delete asset": "Kon de asset niet verwijderen", - "Couldn't delete asset folder": "Kon de asset niet verwijderen", - "Couldn't delete entry": "Kon de entry niet verwijderen", - "Couldn't delete form": "Kon de formulier niet verwijderen", - "Couldn't delete submission": "Kon de inzending niet verwijderen", - "Couldn't delete term": "Kon de term niet verwijderen", - "Couldn't delete user": "Kon de gebruiker niet verwijderen", "Couldn't save entry": "Kon de entry niet opslaan", "Couldn't save term": "Kon de term niet opslaan", "Couldn't publish entry": "Kon de entry niet publiceren", From b70f48cb6f5c39c76592ed7932a35987ebed372b Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 23 Sep 2024 14:48:18 -0400 Subject: [PATCH 12/14] wip --- resources/lang/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/fr.json b/resources/lang/fr.json index b309ce01a7..2ae9a8a1c4 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -244,9 +244,9 @@ "Copy to clipboard": "Copier vers le presse-papier", "Copy URL": "Copier l'URL", "Core": "Core", + "Couldn't publish entry": "Impossible de publier l'entrée", "Couldn't save entry": "Impossible d'enregistrer l'entrée", "Couldn't save term": "Impossible d'enregistrer le terme", - "Couldn't publish entry": "Impossible de publier l'entrée", "Couldn't unpublish entry": "Impossible de dépublier l'entrée", "CP Nav Preferences": "Préférences de navigation du CP", "Create": "Créer", From 4e453755a5fac1af28d8bbbc2e10aba208144700 Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 23 Sep 2024 14:48:52 -0400 Subject: [PATCH 13/14] wip --- resources/lang/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/nl.json b/resources/lang/nl.json index 92d8227204..c2e65ce364 100644 --- a/resources/lang/nl.json +++ b/resources/lang/nl.json @@ -237,9 +237,9 @@ "Copy Password Reset Link": "Kopieer wachtwoordresetlink", "Copy URL": "Kopieer URL", "Core": "Core", + "Couldn't publish entry": "Kon de entry niet publiceren", "Couldn't save entry": "Kon de entry niet opslaan", "Couldn't save term": "Kon de term niet opslaan", - "Couldn't publish entry": "Kon de entry niet publiceren", "Couldn't unpublish entry": "Kon de entry niet depubliceren", "CP Nav Preferences": "CP Nav Instellingen", "Create": "Aanmaken", From a57d26e94131bcc5f11ba81476ef8adbf1cb10ea Mon Sep 17 00:00:00 2001 From: Jason Varga Date: Mon, 23 Sep 2024 14:51:52 -0400 Subject: [PATCH 14/14] wip --- src/Actions/Delete.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Actions/Delete.php b/src/Actions/Delete.php index 3a2a77739d..4c6da3259f 100644 --- a/src/Actions/Delete.php +++ b/src/Actions/Delete.php @@ -2,13 +2,10 @@ namespace Statamic\Actions; -use Statamic\Actions\Concerns\DeletesItems; use Statamic\Contracts; class Delete extends Action { - use DeletesItems; - protected $dangerous = true; public static function title()