Skip to content

Commit b1aacdf

Browse files
authored
Save action classes (#5878)
Enable the usage of classes to describe the save actions. This allow more flexibility and easy to extend and/or configure behaviour.
1 parent 29e26fc commit b1aacdf

File tree

10 files changed

+365
-130
lines changed

10 files changed

+365
-130
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
namespace Backpack\CRUD\app\Library\CrudPanel\SaveActions;
4+
5+
use Backpack\CRUD\app\Library\CrudPanel\CrudPanel;
6+
use Illuminate\Http\Request;
7+
8+
abstract class AbstractSaveAction implements SaveActionInterface
9+
{
10+
protected ?int $order = null;
11+
12+
public function __construct(?int $order = null)
13+
{
14+
if ($order !== null) {
15+
$this->order = $order;
16+
}
17+
}
18+
19+
public function getOrder(): ?int
20+
{
21+
return $this->order;
22+
}
23+
24+
public function setOrder(int $order): void
25+
{
26+
$this->order = $order;
27+
}
28+
29+
public function isVisible(CrudPanel $crud): bool
30+
{
31+
return true;
32+
}
33+
34+
public function getRedirectUrl(CrudPanel $crud, Request $request, $itemId = null): ?string
35+
{
36+
return null;
37+
}
38+
39+
public function getReferrerUrl(CrudPanel $crud, Request $request, $itemId = null): ?string
40+
{
41+
return null;
42+
}
43+
44+
public function toArray(): array
45+
{
46+
return [
47+
'name' => $this->getName(),
48+
'button_text' => $this->getButtonText(),
49+
'visible' => fn (CrudPanel $crud) => $this->isVisible($crud),
50+
'redirect' => fn (CrudPanel $crud, Request $request, $itemId = null) => $this->getRedirectUrl($crud, $request, $itemId),
51+
'referrer_url' => fn (CrudPanel $crud, Request $request, $itemId = null) => $this->getReferrerUrl($crud, $request, $itemId),
52+
'order' => $this->getOrder(),
53+
'_handler' => $this,
54+
];
55+
}
56+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace Backpack\CRUD\app\Library\CrudPanel\SaveActions;
4+
5+
use Backpack\CRUD\app\Library\CrudPanel\CrudPanel;
6+
use Illuminate\Contracts\Support\Arrayable;
7+
use Illuminate\Http\Request;
8+
9+
interface SaveActionInterface extends Arrayable
10+
{
11+
public function getName(): string;
12+
13+
public function getButtonText(): string;
14+
15+
public function isVisible(CrudPanel $crud): bool;
16+
17+
public function getRedirectUrl(CrudPanel $crud, Request $request, $itemId = null): ?string;
18+
19+
public function getReferrerUrl(CrudPanel $crud, Request $request, $itemId = null): ?string;
20+
21+
public function getOrder(): ?int;
22+
23+
public function setOrder(int $order): void;
24+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Backpack\CRUD\app\Library\CrudPanel\SaveActions;
4+
5+
use Backpack\CRUD\app\Library\CrudPanel\CrudPanel;
6+
use Illuminate\Http\Request;
7+
8+
class SaveAndBack extends AbstractSaveAction
9+
{
10+
protected ?int $order = 1;
11+
12+
public function getName(): string
13+
{
14+
return 'save_and_back';
15+
}
16+
17+
public function getButtonText(): string
18+
{
19+
return trans('backpack::crud.save_action_save_and_back');
20+
}
21+
22+
public function isVisible(CrudPanel $crud): bool
23+
{
24+
return $crud->hasAccess('list');
25+
}
26+
27+
public function getRedirectUrl(CrudPanel $crud, Request $request, $itemId = null): ?string
28+
{
29+
return $request->has('_http_referrer') ? $request->get('_http_referrer') : $crud->route;
30+
}
31+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
namespace Backpack\CRUD\app\Library\CrudPanel\SaveActions;
4+
5+
use Backpack\CRUD\app\Library\CrudPanel\CrudPanel;
6+
use Illuminate\Http\Request;
7+
8+
class SaveAndEdit extends AbstractSaveAction
9+
{
10+
protected ?int $order = 2;
11+
12+
public function getName(): string
13+
{
14+
return 'save_and_edit';
15+
}
16+
17+
public function getButtonText(): string
18+
{
19+
return trans('backpack::crud.save_action_save_and_edit');
20+
}
21+
22+
public function isVisible(CrudPanel $crud): bool
23+
{
24+
return $crud->hasAccess('update');
25+
}
26+
27+
public function getRedirectUrl(CrudPanel $crud, Request $request, $itemId = null): ?string
28+
{
29+
$itemId = $itemId ?: $request->get('id');
30+
31+
if (! $itemId) {
32+
return $crud->route;
33+
}
34+
35+
$redirectUrl = rtrim($crud->route, '/').'/'.$itemId.'/edit';
36+
37+
if ($request->has('_locale')) {
38+
$redirectUrl .= '?_locale='.$request->get('_locale');
39+
}
40+
41+
if ($request->has('_current_tab')) {
42+
$redirectUrl .= '#'.$request->get('_current_tab');
43+
}
44+
45+
return $redirectUrl;
46+
}
47+
48+
public function getReferrerUrl(CrudPanel $crud, Request $request, $itemId = null): ?string
49+
{
50+
$itemId = $itemId ?: $request->get('id');
51+
52+
if (! $itemId) {
53+
return null;
54+
}
55+
56+
return url(rtrim($crud->route, '/').'/'.$itemId.'/edit');
57+
}
58+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Backpack\CRUD\app\Library\CrudPanel\SaveActions;
4+
5+
use Backpack\CRUD\app\Library\CrudPanel\CrudPanel;
6+
use Illuminate\Http\Request;
7+
8+
class SaveAndList extends AbstractSaveAction
9+
{
10+
protected ?int $order = 5;
11+
12+
public function getName(): string
13+
{
14+
return 'save_and_list';
15+
}
16+
17+
public function getButtonText(): string
18+
{
19+
return trans('backpack::crud.save_action_save_and_list');
20+
}
21+
22+
public function isVisible(CrudPanel $crud): bool
23+
{
24+
return $crud->hasAccess('list');
25+
}
26+
27+
public function getRedirectUrl(CrudPanel $crud, Request $request, $itemId = null): ?string
28+
{
29+
return $crud->route;
30+
}
31+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Backpack\CRUD\app\Library\CrudPanel\SaveActions;
4+
5+
use Backpack\CRUD\app\Library\CrudPanel\CrudPanel;
6+
use Illuminate\Http\Request;
7+
8+
class SaveAndNew extends AbstractSaveAction
9+
{
10+
protected ?int $order = 3;
11+
12+
public function getName(): string
13+
{
14+
return 'save_and_new';
15+
}
16+
17+
public function getButtonText(): string
18+
{
19+
return trans('backpack::crud.save_action_save_and_new');
20+
}
21+
22+
public function isVisible(CrudPanel $crud): bool
23+
{
24+
return $crud->hasAccess('create');
25+
}
26+
27+
public function getRedirectUrl(CrudPanel $crud, Request $request, $itemId = null): ?string
28+
{
29+
return $crud->route.'/create';
30+
}
31+
}

0 commit comments

Comments
 (0)