Skip to content
This repository was archived by the owner on Nov 26, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/Actions/SingleResourceAction.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace BadChoice\Thrust\Actions;

use BadChoice\Thrust\Resource;
use BadChoice\Thrust\ResourceGate;

abstract class SingleResourceAction

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice to have: Per codi nou potser podem posar types a les funcions (param i return) i variables? A codi antic costa més perque tenim moltes classes que els sobre-escriuen pero aqui podriem fer-ho

{
public $title;
public $icon;
public Resource $resource;
public $shouldReload = false;
public $responseAsPopup = true;

public static function make($title, ?string $icon = null)
{
$action = new static;
$action->title = $title;
$action->icon = $icon;
return $action;
}

abstract public function handle();

public function getClassForJs()
{
return str_replace('\\', '\\\\', get_class($this));
}


}
45 changes: 39 additions & 6 deletions src/Controllers/ThrustActionsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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){
Expand Down Expand Up @@ -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]) :
Expand Down
64 changes: 64 additions & 0 deletions src/Controllers/ThrustSingleResourceActionsController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace BadChoice\Thrust\Controllers;

use BadChoice\Thrust\Facades\Thrust;
use Illuminate\Routing\Controller;
use Illuminate\View\ComponentAttributeBag;

class ThrustSingleResourceActionsController extends Controller
{

public function perform($resourceName)
{
$action = $this->findActionForResource($resourceName, request('action'));
try {
return $this->handleResponse($action, $action->handle());
} 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);
}

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);
}
}
23 changes: 12 additions & 11 deletions src/Html/Edit.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
4 changes: 4 additions & 0 deletions src/Resource.php
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,10 @@ public function mainActions()
];
}

public function singlePageActions(){
return [];
}

public function actions()
{
return $this->canDelete(static::$model)
Expand Down
37 changes: 37 additions & 0 deletions src/resources/views/actions/singleResourceActions.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
@if(count($resource->singleResourceActions()))
<x-ui::dropdown>
<x-slot:trigger>
<x-ui::secondary-button>@icon(ellipsis-v)</x-ui::secondary-button>
</x-slot:trigger>
<div class="flex flex-col gap-2">
@foreach($resource->singleResourceActions() as $action)
<x-ui::tertiary-button :icon="$action->icon" action="function() { doSingleResourceAction('{{ $action->getClassForJs() }}') }">
{{ $action->title }}
</x-ui::tertiary-button>
@endforeach
</div>
</x-ui::dropdown>

<script>
async function doSingleResourceAction(actionClass){

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Si ho fem amb un js aprofitem per compilar-ho no? Sino tant per tant deixa-ho amb alpinejs

I no vam dir que deixavem de fer servir jquery? Si és codi nou entenc que ja no ho hauriem d'aplicar

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")
})
}
</script>

@endif

11 changes: 8 additions & 3 deletions src/resources/views/edit.blade.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
@if ($fullPage)
<div class="flex items-center mb-4 w-xl text-sm md:text-lg">
@component(config('thrust.sidebar-collapsed-button'))@endcomponent
<h2>{{ $title }}</h2>
<div class="flex items-center justify-between mb-4 w-xl">
<div class="flex items-center">
@component(config('thrust.sidebar-collapsed-button'))@endcomponent
<h2 class="text-sm md:text-lg">{{ $title }}</h2>
</div>
<div>
@include('thrust::actions.singleResourceActions')
</div>
</div>
@else
<div class="flex space-x-1 items-center text-lg pb-2">
Expand Down
1 change: 1 addition & 0 deletions src/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down