Skip to content

Commit

Permalink
feat: Redirect improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
lee-to committed Dec 22, 2024
1 parent 1f71aac commit 9cfa43d
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 37 deletions.
15 changes: 9 additions & 6 deletions src/Laravel/src/Fields/Relationships/HasMany.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,15 +105,19 @@ public function redirectAfter(Closure $callback): static
return $this;
}

public function getRedirectAfter(Model|int|null|string $parentId): string
public function getRedirectAfter(Model|int|null|string $parentId): ?string
{
if (! \is_null($this->redirectAfter)) {
return (string) value($this->redirectAfter, $parentId, $this);
}

if($this->isAsync()) {
return null;
}

return moonshineRequest()
->getResource()
?->getFormPageUrl($parentId) ?? '';
?->getFormPageUrl($parentId);
}

/**
Expand Down Expand Up @@ -450,10 +454,9 @@ protected function getItemButtons(): array
{
$resource = $this->getResource()->stopGettingItemFromUrl();

$redirectAfter = $this->isAsync()
? '' : $this->getRedirectAfter(
$this->getRelatedModel()?->getKey()
);
$redirectAfter = $this->getRedirectAfter(
$this->getRelatedModel()?->getKey()
);

$editButton = $this->editButton ?? HasManyButton::for($this, update: true);

Expand Down
12 changes: 8 additions & 4 deletions src/Laravel/src/Fields/Relationships/HasOne.php
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,19 @@ public function redirectAfter(Closure $callback): static
return $this;
}

public function getRedirectAfter(Model|int|null|string $parentId): string
public function getRedirectAfter(Model|int|null|string $parentId): ?string
{
if (! \is_null($this->redirectAfter)) {
return (string) value($this->redirectAfter, $parentId, $this);
}

if($this->isAsync()) {
return null;
}

return moonshineRequest()
->getResource()
?->getFormPageUrl($parentId) ?? '';
->getResource()
?->getFormPageUrl($parentId);
}

/**
Expand Down Expand Up @@ -257,7 +261,7 @@ protected function getComponent(): FormBuilder
)
->toArray()
)
->redirect($isAsync ? null : $redirectAfter)
->redirect($redirectAfter)
->fillCast(
$item?->toArray() ?? array_filter([
$relation->getForeignKeyName() => $this->getRelatedModel()?->getKey(),
Expand Down
6 changes: 6 additions & 0 deletions src/Laravel/src/Fields/Relationships/ModelRelationField.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Illuminate\Support\Stringable;
use MoonShine\Contracts\Core\HasResourceContract;
use MoonShine\Contracts\Core\TypeCasts\DataWrapperContract;
use MoonShine\Contracts\UI\HasFieldsContract;
use MoonShine\Core\Traits\HasResource;
use MoonShine\Laravel\Resources\ModelResource;
use MoonShine\UI\Exceptions\FieldException;
Expand Down Expand Up @@ -86,6 +87,11 @@ public function __construct(
} else {
$this->setResource($resource);
}

// required to create field entities and load assets
if($this instanceof HasFieldsContract) {
$this->getResource()?->getFormFields();
}
}

/**
Expand Down
24 changes: 13 additions & 11 deletions src/Laravel/src/Http/Controllers/CrudController.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests;
use MoonShine\Contracts\Core\CrudResourceContract;
use MoonShine\Laravel\Contracts\Notifications\MoonShineNotificationContract;
use MoonShine\Laravel\Http\Requests\MoonShineFormRequest;
use MoonShine\Laravel\Http\Requests\Resources\DeleteFormRequest;
use MoonShine\Laravel\Http\Requests\Resources\MassDeleteFormRequest;
use MoonShine\Laravel\Http\Requests\Resources\StoreFormRequest;
use MoonShine\Laravel\Http\Requests\Resources\UpdateFormRequest;
use MoonShine\Laravel\MoonShineRequest;
use MoonShine\Laravel\Resources\CrudResource;
use MoonShine\Support\Enums\ToastType;
use Symfony\Component\HttpFoundation\Response;
use Throwable;
Expand Down Expand Up @@ -99,7 +101,7 @@ public function destroy(DeleteFormRequest $request): Response
if ($request->ajax() || $request->wantsJson()) {
return $this->json(
message: __('moonshine::ui.deleted'),
redirect: $redirectRoute
redirect: $request->input('_redirect')
);
}

Expand All @@ -108,10 +110,6 @@ public function destroy(DeleteFormRequest $request): Response
ToastType::SUCCESS
);

if(\is_null($redirectRoute)) {
return back();
}

return redirect($redirectRoute);
}

Expand All @@ -131,7 +129,7 @@ public function massDelete(MassDeleteFormRequest $request): Response
if ($request->ajax() || $request->wantsJson()) {
return $this->json(
message: __('moonshine::ui.deleted'),
redirect: $redirectRoute
redirect: $request->input('_redirect')
);
}

Expand All @@ -140,10 +138,6 @@ public function massDelete(MassDeleteFormRequest $request): Response
ToastType::SUCCESS
);

if(\is_null($redirectRoute)) {
return back();
}

return redirect($redirectRoute);
}

Expand All @@ -157,7 +151,15 @@ protected function updateOrCreate(
$resource = $request->getResource();
$item = $resource->getItemOrInstance();

$redirectRoute = static fn ($resource): ?string => $request->input('_redirect', $resource->getRedirectAfterSave());
$redirectRoute = static function (CrudResource $resource) use($request): ?string {
$redirect = $request->input('_redirect', $resource->getRedirectAfterSave());

if(\is_null($redirect) && !$resource->isCreateInModal() && $resource->isRecentlyCreated()) {
return $resource->getFormPageUrl($resource->getCastedData());
}

return $redirect;
};

try {
$item = $resource->save($item);
Expand Down
16 changes: 6 additions & 10 deletions src/Laravel/src/Traits/Resource/ResourceCrudRouter.php
Original file line number Diff line number Diff line change
Expand Up @@ -126,18 +126,14 @@ public function getRedirectAfterSave(): ?string
? []
: ['resourceItem' => $this->getCastedData()?->getKey()];

if (! \is_null($this->redirectAfterSave)) {
return $this
->getPages()
->findByType($this->redirectAfterSave)
?->getRoute($params);
}

return $this->getFormPageUrl(params: $params);
return $this
->getPages()
->findByType($this->redirectAfterSave)
?->getRoute($params);
}

public function getRedirectAfterDelete(): ?string
public function getRedirectAfterDelete(): string
{
return null;
return $this->getIndexPageUrl();
}
}
4 changes: 2 additions & 2 deletions src/Laravel/src/Traits/Resource/ResourceWithButtons.php
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ public function getDeleteButton(
DeleteButton::for(
$this,
componentName: $componentName,
redirectAfterDelete: $redirectAfterDelete,
redirectAfterDelete: $isAsync ? null : $redirectAfterDelete,
isAsync: $isAsync,
modalName: $modalName
)
Expand All @@ -200,7 +200,7 @@ public function getMassDeleteButton(
MassDeleteButton::for(
$this,
componentName: $componentName,
redirectAfterDelete: $redirectAfterDelete,
redirectAfterDelete: $isAsync ? null : $redirectAfterDelete,
isAsync: $isAsync,
modalName: $modalName
)
Expand Down
9 changes: 5 additions & 4 deletions tests/Feature/Controllers/CrudControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
$this->itemResource->getRoute('crud.update', $item->getKey()),
['name' => 'New test name']
)
->assertRedirect();
->assertRedirect($this->itemResource->getFormPageUrl($item->getKey()));

$item->refresh();

Expand All @@ -104,7 +104,7 @@
asAdmin()->delete(
$this->itemResource->getRoute('crud.destroy', $item->getKey())
)
->assertRedirect();
->assertRedirect($this->itemResource->getIndexPageUrl());
});

it('when component crud delete', function () {
Expand Down Expand Up @@ -136,7 +136,7 @@
asAdmin()->delete(
$this->itemResource->getRoute('crud.destroy', $item->getKey())
)
->assertRedirect();
->assertRedirect($this->itemResource->getIndexPageUrl());
});

it('crud mass delete', function () {
Expand All @@ -147,7 +147,8 @@
asAdmin()->delete(
$this->itemResource->getRoute('crud.massDelete', query: ['ids' => $ids])
)
->assertRedirect();
->assertRedirect($this->itemResource->getIndexPageUrl())
;

$items = Item::query()->get()->toArray();

Expand Down

0 comments on commit 9cfa43d

Please sign in to comment.