From 7920f87df74b3462591219ad94117665099076b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puigdell=C3=ADvol?= Date: Tue, 26 Nov 2024 12:09:28 +0100 Subject: [PATCH 1/5] Added single resource actions --- .../ThrustSingleResourceActionsController.php | 59 +++++++++++++++++++ src/Html/Edit.php | 23 ++++---- src/Resource.php | 4 ++ .../actions/singleResourceActions.blade.php | 35 +++++++++++ src/resources/views/edit.blade.php | 11 +++- src/routes.php | 1 + 6 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 src/Controllers/ThrustSingleResourceActionsController.php create mode 100644 src/resources/views/actions/singleResourceActions.blade.php diff --git a/src/Controllers/ThrustSingleResourceActionsController.php b/src/Controllers/ThrustSingleResourceActionsController.php new file mode 100644 index 0000000..a2d95e4 --- /dev/null +++ b/src/Controllers/ThrustSingleResourceActionsController.php @@ -0,0 +1,59 @@ +findActionForResource($resourceName, request('action')); + try { + $response = $action->handle(); + } catch (\Exception $e) { + return request()->ajax() ? + response()->json(['ok' => false, 'message' => $e->getMessage(), 'shouldReload' => false, 'responseAsPopup' => false]) : + back()->withErrors(['msg' => $e->getMessage()]); + } + + if (request()->ajax()) { + return response()->json(['ok' => true, 'message' => $response ?? 'done', 'shouldReload' => $action->shouldReload, 'responseAsPopup' => $action->responseAsPopup]); + } + + return back()->withMessage($response); + } + + public function index($resourceName) + { + $resource = Thrust::make($resourceName); + + return view('thrust::components.actions-index', [ + 'actions' => collect($resource->getActions(whileSearching: $this->searchingInResource())), + 'resourceName' => $resource->name(), + 'attributes' => new ComponentAttributeBag([]) + ]); + } + + private function findActionForResource($resourceName, $actionClass) + { + $resource = Thrust::make($resourceName); + $action = collect($resource->singleResourceActions())->first(function ($action) use ($actionClass) { + return get_class($action) === $actionClass; + }); + + $action->resource = request('search') && $resource::$searchResource + ? Thrust::make($resource::$searchResource) + : $resource; + + return $action; + } + + private function searchingInResource(): bool + { + return (bool) request('search', false); + } +} diff --git a/src/Html/Edit.php b/src/Html/Edit.php index 94f570a..99b6936 100644 --- a/src/Html/Edit.php +++ b/src/Html/Edit.php @@ -54,19 +54,20 @@ public function show($id, $fullPage = false, $multiple = false, $inline = false) view()->share('fullPage', $fullPage); $object = is_numeric($id) ? $this->resource->find($id) : $id; return view('thrust::edit', [ - 'title' => $this->resource->getTitle(), - 'nameField' => $this->resource->nameField, - 'breadcrumbs' => $this->resource->breadcrumbs($object), - 'resourceName' => $this->resourceName ? : $this->resource->name(), + 'resource' => $this->resource, + 'title' => $this->resource->getTitle(), + 'nameField' => $this->resource->nameField, + 'breadcrumbs' => $this->resource->breadcrumbs($object), + 'resourceName' => $this->resourceName ? : $this->resource->name(), 'fields' => $this->getEditFields($multiple), - 'object' => $object, - 'hideVisibility' => Field::getPanelHideVisibilityJson(collect($this->resource->panels($object))), - 'showVisibility' => Field::getPanelShowVisibilityJson(collect($this->resource->panels($object))), - 'fullPage' => $fullPage, + 'object' => $object, + 'hideVisibility' => Field::getPanelHideVisibilityJson(collect($this->resource->panels($object))), + 'showVisibility' => Field::getPanelShowVisibilityJson(collect($this->resource->panels($object))), + 'fullPage' => $fullPage, 'updateConfirmationMessage' => $this->resource->getUpdateConfirmationMessage(), - 'multiple' => $multiple, - 'eventListeners' => $this->resource->getValidationEventListeners(), - 'inline' => $inline, + 'multiple' => $multiple, + 'eventListeners' => $this->resource->getValidationEventListeners(), + 'inline' => $inline, ])->render(); } diff --git a/src/Resource.php b/src/Resource.php index b38fa24..b11a0e6 100644 --- a/src/Resource.php +++ b/src/Resource.php @@ -333,6 +333,10 @@ public function mainActions() ]; } + public function singlePageActions(){ + return []; + } + public function actions() { return $this->canDelete(static::$model) diff --git a/src/resources/views/actions/singleResourceActions.blade.php b/src/resources/views/actions/singleResourceActions.blade.php new file mode 100644 index 0000000..420dd6f --- /dev/null +++ b/src/resources/views/actions/singleResourceActions.blade.php @@ -0,0 +1,35 @@ +@if(count($resource->singleResourceActions())) + + + @icon(ellipsis-v) + +
+ @foreach($resource->singleResourceActions() as $action) + + {{ $action->title }} + + @endforeach +
+
+@endif + + \ No newline at end of file diff --git a/src/resources/views/edit.blade.php b/src/resources/views/edit.blade.php index 13da984..7ecf980 100644 --- a/src/resources/views/edit.blade.php +++ b/src/resources/views/edit.blade.php @@ -1,7 +1,12 @@ @if ($fullPage) -
- @component(config('thrust.sidebar-collapsed-button'))@endcomponent -

{{ $title }}

+
+
+ @component(config('thrust.sidebar-collapsed-button'))@endcomponent +

{{ $title }}

+
+
+ @include('thrust::actions.singleResourceActions') +
@else
diff --git a/src/routes.php b/src/routes.php index 9a09cdb..0c95239 100644 --- a/src/routes.php +++ b/src/routes.php @@ -20,6 +20,7 @@ Route::post('{resourceName}/actions', 'ThrustActionsController@perform')->name('thrust.actions.perform'); Route::get('{resourceName}/actions', 'ThrustActionsController@create')->name('thrust.actions.create'); Route::get('{resourceName}/index/actions', 'ThrustActionsController@index')->name('thrust.actions.index'); + Route::post('{resourceName}/singleResource/actions', 'ThrustSingleResourceActionsController@perform')->name('thrust.actions.singleResource.perform'); Route::post('{resourceName}/updateOrder', 'ThrustSortController@updateOrder')->name('thrust.updateOrder'); Route::get('{resourceName}/{id}/toggle/{field}', 'ThrustActionsController@toggle')->name('thrust.toggle'); From 981fceb42eb0541fb2a04019db7596390dc0c5a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puigdell=C3=ADvol?= Date: Tue, 26 Nov 2024 12:13:58 +0100 Subject: [PATCH 2/5] Removed uneeded method --- .../ThrustSingleResourceActionsController.php | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/Controllers/ThrustSingleResourceActionsController.php b/src/Controllers/ThrustSingleResourceActionsController.php index a2d95e4..b1e0d13 100644 --- a/src/Controllers/ThrustSingleResourceActionsController.php +++ b/src/Controllers/ThrustSingleResourceActionsController.php @@ -13,7 +13,7 @@ public function perform($resourceName) { $action = $this->findActionForResource($resourceName, request('action')); try { - $response = $action->handle(); + $response = $action->handle(); } catch (\Exception $e) { return request()->ajax() ? response()->json(['ok' => false, 'message' => $e->getMessage(), 'shouldReload' => false, 'responseAsPopup' => false]) : @@ -27,17 +27,7 @@ public function perform($resourceName) return back()->withMessage($response); } - public function index($resourceName) - { - $resource = Thrust::make($resourceName); - - return view('thrust::components.actions-index', [ - 'actions' => collect($resource->getActions(whileSearching: $this->searchingInResource())), - 'resourceName' => $resource->name(), - 'attributes' => new ComponentAttributeBag([]) - ]); - } - + private function findActionForResource($resourceName, $actionClass) { $resource = Thrust::make($resourceName); @@ -51,9 +41,4 @@ private function findActionForResource($resourceName, $actionClass) return $action; } - - private function searchingInResource(): bool - { - return (bool) request('search', false); - } } From d259a7e9f179fe911c85104df8245dd913751a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puigdell=C3=ADvol?= Date: Tue, 26 Nov 2024 12:19:58 +0100 Subject: [PATCH 3/5] PR fixes --- src/Controllers/ThrustActionsController.php | 45 ++++++++++++++++--- .../ThrustSingleResourceActionsController.php | 32 ++++++++++--- .../actions/singleResourceActions.blade.php | 43 +++++++++--------- 3 files changed, 87 insertions(+), 33 deletions(-) diff --git a/src/Controllers/ThrustActionsController.php b/src/Controllers/ThrustActionsController.php index 4005470..6096cd6 100644 --- a/src/Controllers/ThrustActionsController.php +++ b/src/Controllers/ThrustActionsController.php @@ -12,12 +12,11 @@ public function toggle($resourceName, $id, $field) { $resource = Thrust::make($resourceName); $object = $resource->find($id); + if(! method_exists($object, 'toggleActive')){ + $object->update([$field => !$object->{$field}]); + return back(); + } try { - if(! method_exists($object, 'toggleActive')){ - $object->update([$field => !$object->{$field}]); - return back(); - } - $object->toggleActive(); return back(); }catch(\Exception $e){ @@ -51,7 +50,41 @@ public function perform($resourceName) $ids = is_string(request('ids')) ? explode(',', request('ids')) : request('ids'); try { - $response = $action->handle(collect($action->resource->find($ids))); + return $this->handleResponse($action, $action->handle(collect($action->resource->find($ids)))); + } catch (\Exception $e) { + return $this->handleException($e); + } + } + + private function handleException(\Exception $e) { + return request()->ajax() + ? response()->json([ + 'ok' => false, + 'message' => $e->getMessage(), + 'shouldReload' => false, + 'responseAsPopup' => false + ]) + : back()->withErrors(['msg' => $e->getMessage()]); + } + + private function handleResponse($action, $response){ + if (request()->ajax()) { + return response()->json([ + 'ok' => true, + 'message' => $response ?? 'done', + 'shouldReload' => $action->shouldReload, + 'responseAsPopup' => $action->responseAsPopup + ]); + } + + return back()->withMessage($response); + } + + public function singleResourcePerform($resourceName) + { + $action = $this->findActionForResource($resourceName, request('action')); + try { + $response = $action->handle(); } catch (\Exception $e) { return request()->ajax() ? response()->json(['ok' => false, 'message' => $e->getMessage(), 'shouldReload' => false, 'responseAsPopup' => false]) : diff --git a/src/Controllers/ThrustSingleResourceActionsController.php b/src/Controllers/ThrustSingleResourceActionsController.php index b1e0d13..e45ea42 100644 --- a/src/Controllers/ThrustSingleResourceActionsController.php +++ b/src/Controllers/ThrustSingleResourceActionsController.php @@ -13,21 +13,36 @@ public function perform($resourceName) { $action = $this->findActionForResource($resourceName, request('action')); try { - $response = $action->handle(); + return $this->handleResponse($action, $action->handle()); } catch (\Exception $e) { - return request()->ajax() ? - response()->json(['ok' => false, 'message' => $e->getMessage(), 'shouldReload' => false, 'responseAsPopup' => false]) : - back()->withErrors(['msg' => $e->getMessage()]); + return $this->handleException($e); } + } + + private function handleException(\Exception $e) { + return request()->ajax() + ? response()->json([ + 'ok' => false, + 'message' => $e->getMessage(), + 'shouldReload' => false, + 'responseAsPopup' => false + ]) + : back()->withErrors(['msg' => $e->getMessage()]); + } + private function handleResponse($action, $response){ if (request()->ajax()) { - return response()->json(['ok' => true, 'message' => $response ?? 'done', 'shouldReload' => $action->shouldReload, 'responseAsPopup' => $action->responseAsPopup]); + return response()->json([ + 'ok' => true, + 'message' => $response ?? 'done', + 'shouldReload' => $action->shouldReload, + 'responseAsPopup' => $action->responseAsPopup + ]); } return back()->withMessage($response); } - private function findActionForResource($resourceName, $actionClass) { $resource = Thrust::make($resourceName); @@ -41,4 +56,9 @@ private function findActionForResource($resourceName, $actionClass) return $action; } + + private function searchingInResource(): bool + { + return (bool) request('search', false); + } } diff --git a/src/resources/views/actions/singleResourceActions.blade.php b/src/resources/views/actions/singleResourceActions.blade.php index 420dd6f..6460c4c 100644 --- a/src/resources/views/actions/singleResourceActions.blade.php +++ b/src/resources/views/actions/singleResourceActions.blade.php @@ -11,25 +11,26 @@ @endforeach
-@endif - \ No newline at end of file + + +@endif \ No newline at end of file From f39624fe51266ed2f6c0c0a79fe0deccbc5530c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puigdell=C3=ADvol?= Date: Tue, 26 Nov 2024 12:23:03 +0100 Subject: [PATCH 4/5] Added single resource action file --- src/Actions/SingleResourceAction.php | 32 ++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/Actions/SingleResourceAction.php diff --git a/src/Actions/SingleResourceAction.php b/src/Actions/SingleResourceAction.php new file mode 100644 index 0000000..d70283e --- /dev/null +++ b/src/Actions/SingleResourceAction.php @@ -0,0 +1,32 @@ +title = $title; + $action->icon = 'plus'; + return $action; + } + + abstract public function handle(); + + public function getClassForJs() + { + return str_replace('\\', '\\\\', get_class($this)); + } + + +} From ea15e51ccaf304748c899f808fef592c05366479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jordi=20Puigdell=C3=ADvol?= Date: Tue, 26 Nov 2024 12:29:30 +0100 Subject: [PATCH 5/5] Added single resource action file --- src/Actions/SingleResourceAction.php | 4 +- .../actions/singleResourceActions.blade.php | 45 ++++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/Actions/SingleResourceAction.php b/src/Actions/SingleResourceAction.php index d70283e..dfbfd24 100644 --- a/src/Actions/SingleResourceAction.php +++ b/src/Actions/SingleResourceAction.php @@ -13,11 +13,11 @@ abstract class SingleResourceAction public $shouldReload = false; public $responseAsPopup = true; - public static function make($title) + public static function make($title, ?string $icon = null) { $action = new static; $action->title = $title; - $action->icon = 'plus'; + $action->icon = $icon; return $action; } diff --git a/src/resources/views/actions/singleResourceActions.blade.php b/src/resources/views/actions/singleResourceActions.blade.php index 6460c4c..55a6cc4 100644 --- a/src/resources/views/actions/singleResourceActions.blade.php +++ b/src/resources/views/actions/singleResourceActions.blade.php @@ -5,32 +5,33 @@
@foreach($resource->singleResourceActions() as $action) - + {{ $action->title }} @endforeach
- -@endif \ No newline at end of file + async function doSingleResourceAction(actionClass){ + await $.post("{{ route('thrust.actions.singleResource.perform', [$resourceName]) }}", { + "_token": "{{ csrf_token() }}", + "action" : actionClass, + }).done(function(data){ + if (data["responseAsPopup"]){ + $('#popup').popup('show') + $("#popupContent").html(data["message"]) + } else { + showMessage(data["message"]) + } + if (data["shouldReload"]) { + location.reload() + } + }).fail(function(){ + showMessage("Something went wrong") + }) + } + + +@endif +