Skip to content

Commit

Permalink
[7.x] Fix error when running resource actions (#638)
Browse files Browse the repository at this point in the history
Co-authored-by: duncanmcclean <duncanmcclean@users.noreply.github.com>
  • Loading branch information
duncanmcclean and duncanmcclean authored Dec 4, 2024
1 parent faece2f commit e3e2ddd
Show file tree
Hide file tree
Showing 16 changed files with 147 additions and 80 deletions.
2 changes: 1 addition & 1 deletion resources/views/edit.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
create-another-url="{{ cp_route('runway.create', ['resource' => $resource->handle()]) }}"
initial-listing-url="{{ cp_route('runway.index', ['resource' => $resource->handle()]) }}"
:initial-item-actions="{{ json_encode($itemActions) }}"
item-action-url="{{ cp_route('runway.actions.run', ['resource' => $resource->handle()]) }}"
item-action-url="{{ cp_route('runway.models.actions.run', ['resource' => $resource->handle()]) }}"
:revisions-enabled="{{ $str::bool($revisionsEnabled) }}"
></runway-publish-form>

Expand Down
9 changes: 6 additions & 3 deletions routes/cp.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use Illuminate\Support\Facades\Route;
use StatamicRadPack\Runway\Http\Controllers\CP\ModelActionController;
use StatamicRadPack\Runway\Http\Controllers\CP\ModelRevisionsController;
use StatamicRadPack\Runway\Http\Controllers\CP\PublishedModelsController;
use StatamicRadPack\Runway\Http\Controllers\CP\ResourceActionController;
Expand All @@ -10,10 +11,12 @@

Route::name('runway.')->prefix('runway')->group(function () {
Route::get('/{resource}', [ResourceController::class, 'index'])->name('index');

Route::get('{resource}/listing-api', [ResourceListingController::class, 'index'])->name('listing-api');
Route::post('{resource}/actions', [ResourceActionController::class, 'runAction'])->name('actions.run');
Route::post('{resource}/actions/list', [ResourceActionController::class, 'bulkActionsList'])->name('actions.bulk');

Route::post('{resource}/actions', [ResourceActionController::class, 'run'])->name('actions.run');

Route::post('{resource}/models/actions', [ModelActionController::class, 'runAction'])->name('models.actions.run');
Route::post('{resource}/models/actions/list', [ModelActionController::class, 'bulkActionsList'])->name('models.actions.bulk');

Route::get('{resource}/create', [ResourceController::class, 'create'])->name('create');
Route::post('{resource}/create', [ResourceController::class, 'store'])->name('store');
Expand Down
2 changes: 1 addition & 1 deletion src/Fieldtypes/HasManyFieldtype.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public function preProcess($data)
public function preload()
{
return array_merge(parent::preload(), [
'actionUrl' => cp_route('runway.actions.run', [
'actionUrl' => cp_route('runway.models.actions.run', [
'resource' => $this->config('resource'),
]),
]);
Expand Down
47 changes: 47 additions & 0 deletions src/Http/Controllers/CP/ModelActionController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace StatamicRadPack\Runway\Http\Controllers\CP;

use Illuminate\Http\Request;
use Statamic\Facades\Action;
use Statamic\Http\Controllers\CP\ActionController;
use StatamicRadPack\Runway\Resource;

class ModelActionController extends ActionController
{
use Traits\ExtractsFromModelFields;

protected $resource;

public function runAction(Request $request, Resource $resource)
{
$this->resource = $resource;

return parent::run($request);
}

public function bulkActionsList(Request $request, Resource $resource)
{
$this->resource = $resource;

return parent::bulkActions($request);
}

protected function getSelectedItems($items, $context)
{
return $this->resource->findMany($items);
}

protected function getItemData($model, $context): array
{
$blueprint = $this->resource->blueprint();

[$values] = $this->extractFromFields($model, $this->resource, $blueprint);

return [
'title' => $model->getAttribute($this->resource->titleField()),
'values' => array_merge($values, ['id' => $model->getKey()]),
'itemActions' => Action::for($model, $context),
];
}
}
37 changes: 2 additions & 35 deletions src/Http/Controllers/CP/ResourceActionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,13 @@

namespace StatamicRadPack\Runway\Http\Controllers\CP;

use Illuminate\Http\Request;
use Statamic\Facades\Action;
use Statamic\Http\Controllers\CP\ActionController;
use StatamicRadPack\Runway\Resource;
use StatamicRadPack\Runway\Runway;

class ResourceActionController extends ActionController
{
use Traits\ExtractsFromModelFields;

protected $resource;

public function runAction(Request $request, Resource $resource)
{
$this->resource = $resource;

return parent::run($request);
}

public function bulkActionsList(Request $request, Resource $resource)
{
$this->resource = $resource;

return parent::bulkActions($request);
}

protected function getSelectedItems($items, $context)
{
return $this->resource->findMany($items);
}

protected function getItemData($model, $context): array
{
$blueprint = $this->resource->blueprint();

[$values] = $this->extractFromFields($model, $this->resource, $blueprint);

return [
'title' => $model->getAttribute($this->resource->titleField()),
'values' => array_merge($values, ['id' => $model->getKey()]),
'itemActions' => Action::for($model, $context),
];
return $items->map(fn ($item) => Runway::findResource($item));
}
}
2 changes: 1 addition & 1 deletion src/Http/Controllers/CP/ResourceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public function index(IndexRequest $request, Resource $resource)
->rejectUnlisted()
->values(),
'filters' => Scope::filters('runway', ['resource' => $resource->handle()]),
'actionUrl' => cp_route('runway.actions.run', ['resource' => $resource->handle()]),
'actionUrl' => cp_route('runway.models.actions.run', ['resource' => $resource->handle()]),
'primaryColumn' => $this->getPrimaryColumn($resource),
'actions' => Action::for($resource, ['view' => 'form']),
]);
Expand Down
4 changes: 2 additions & 2 deletions tests/Console/Commands/GenerateMigrationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class GenerateMigrationTest extends TestCase
{
use RefreshDatabase;

public function setUp(): void
protected function setUp(): void
{
parent::setUp();

Expand All @@ -37,7 +37,7 @@ public function setUp(): void
});
}

public function tearDown(): void
protected function tearDown(): void
{
parent::tearDown();

Expand Down
2 changes: 1 addition & 1 deletion tests/Fieldtypes/BelongsToFieldtypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class BelongsToFieldtypeTest extends TestCase

protected BelongsToFieldtype $fieldtype;

public function setUp(): void
protected function setUp(): void
{
parent::setUp();

Expand Down
2 changes: 1 addition & 1 deletion tests/Fieldtypes/HasManyFieldtypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class HasManyFieldtypeTest extends TestCase

protected HasManyFieldtype $fieldtype;

public function setUp(): void
protected function setUp(): void
{
parent::setUp();

Expand Down
2 changes: 1 addition & 1 deletion tests/Http/Controllers/ApiControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

class ApiControllerTest extends TestCase
{
public function setUp(): void
protected function setUp(): void
{
parent::setUp();

Expand Down
67 changes: 67 additions & 0 deletions tests/Http/Controllers/CP/ModelActionControllerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

namespace StatamicRadPack\Runway\Tests\Http\Controllers\CP;

use PHPUnit\Framework\Attributes\Test;
use Statamic\Actions\Action;
use Statamic\Facades\User;
use StatamicRadPack\Runway\Tests\Fixtures\Models\Post;
use StatamicRadPack\Runway\Tests\TestCase;

class ModelActionControllerTest extends TestCase
{
protected function setUp(): void
{
parent::setUp();

FooAction::register();
}

#[Test]
public function can_run_action()
{
$post = Post::factory()->create();

$this->assertFalse(FooAction::$hasRun);

$this
->actingAs(User::make()->makeSuper()->save())
->post('/cp/runway/post/models/actions', [
'action' => 'foo',
'selections' => [$post->id],
'values' => [],
])
->assertOk()
->assertJson(['message' => 'Foo action run!']);

$this->assertTrue(FooAction::$hasRun);
}

#[Test]
public function can_get_bulk_actions_list()
{
$post = Post::factory()->create();

$this
->actingAs(User::make()->makeSuper()->save())
->post('/cp/runway/post/models/actions/list', [
'selections' => [$post->id],
])
->assertOk()
->assertJsonPath('0.handle', 'unpublish');
}
}

class FooAction extends Action
{
protected static $handle = 'foo';

public static bool $hasRun = false;

public function run($items, $values)
{
static::$hasRun = true;

return 'Foo action run!';
}
}
4 changes: 2 additions & 2 deletions tests/Http/Controllers/CP/ModelRevisionsControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class ModelRevisionsControllerTest extends TestCase
{
private $dir;

public function setUp(): void
protected function setUp(): void
{
parent::setUp();

Expand All @@ -22,7 +22,7 @@ public function setUp(): void
config(['statamic.revisions.path' => $this->dir]);
}

public function tearDown(): void
protected function tearDown(): void
{
Folder::delete($this->dir);

Expand Down
4 changes: 2 additions & 2 deletions tests/Http/Controllers/CP/PublishedModelsControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class PublishedModelsControllerTest extends TestCase
{
private $dir;

public function setUp(): void
protected function setUp(): void
{
parent::setUp();

Expand All @@ -21,7 +21,7 @@ public function setUp(): void
config(['statamic.revisions.path' => $this->dir]);
}

public function tearDown(): void
protected function tearDown(): void
{
Folder::delete($this->dir);

Expand Down
37 changes: 10 additions & 27 deletions tests/Http/Controllers/CP/ResourceActionControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,63 +5,46 @@
use PHPUnit\Framework\Attributes\Test;
use Statamic\Actions\Action;
use Statamic\Facades\User;
use StatamicRadPack\Runway\Tests\Fixtures\Models\Post;
use StatamicRadPack\Runway\Tests\TestCase;

class ResourceActionControllerTest extends TestCase
{
public function setUp(): void
protected function setUp(): void
{
parent::setUp();

FooAction::register();
BarAction::register();
}

#[Test]
public function can_run_action()
{
$post = Post::factory()->create();

$this->assertFalse(FooAction::$hasRun);
$this->assertFalse(BarAction::$hasRun);

$this
->actingAs(User::make()->makeSuper()->save())
->post('/cp/runway/post/actions', [
'action' => 'foo',
'selections' => [$post->id],
'action' => 'bar',
'selections' => ['post'],
'values' => [],
])
->assertOk()
->assertJson(['message' => 'Foo action run!']);

$this->assertTrue(FooAction::$hasRun);
}

#[Test]
public function can_get_bulk_actions_list()
{
$post = Post::factory()->create();
->assertJson(['message' => 'Bar action run!']);

$this
->actingAs(User::make()->makeSuper()->save())
->post('/cp/runway/post/actions/list', [
'selections' => [$post->id],
])
->assertOk()
->assertJsonPath('0.handle', 'unpublish');
$this->assertTrue(BarAction::$hasRun);
}
}

class FooAction extends Action
class BarAction extends Action
{
protected static $handle = 'foo';
protected static $handle = 'bar';

public static bool $hasRun = false;

public function run($items, $values)
{
static::$hasRun = true;

return 'Foo action run!';
return 'Bar action run!';
}
}
4 changes: 2 additions & 2 deletions tests/Http/Controllers/CP/RestoreModelRevisionController.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class RestoreModelRevisionController extends TestCase
{
private $dir;

public function setUp(): void
protected function setUp(): void
{
parent::setUp();

Expand All @@ -21,7 +21,7 @@ public function setUp(): void
config(['statamic.revisions.path' => $this->dir]);
}

public function tearDown(): void
protected function tearDown(): void
{
Folder::delete($this->dir);

Expand Down
2 changes: 1 addition & 1 deletion tests/Tags/RunwayTagTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class RunwayTagTest extends TestCase
{
public $tag;

public function setUp(): void
protected function setUp(): void
{
parent::setUp();

Expand Down

0 comments on commit e3e2ddd

Please sign in to comment.