From e6b26cc47ac0fa29027cc9a431f1c397f08a4fe5 Mon Sep 17 00:00:00 2001 From: LT Date: Sat, 8 Feb 2025 11:07:41 +0300 Subject: [PATCH] feat: Simulate now on --- src/Laravel/src/Buttons/HasManyButton.php | 9 ++++--- .../src/Fields/Relationships/HasMany.php | 12 ++++++--- .../src/Fields/Relationships/HasOne.php | 10 +++++--- src/Laravel/src/Pages/Page.php | 25 ++++++++++++++++++- .../Fields/BelongsToOrManyCreatable.php | 10 +++++--- .../src/Traits/Fields/WithAsyncSearch.php | 3 ++- .../src/Traits/Fields/WithRelatedLink.php | 4 ++- 7 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/Laravel/src/Buttons/HasManyButton.php b/src/Laravel/src/Buttons/HasManyButton.php index 25947d3c1..4a4948be4 100644 --- a/src/Laravel/src/Buttons/HasManyButton.php +++ b/src/Laravel/src/Buttons/HasManyButton.php @@ -5,6 +5,7 @@ namespace MoonShine\Laravel\Buttons; use Illuminate\Database\Eloquent\Model; +use MoonShine\Contracts\Core\CrudResourceContract; use MoonShine\Contracts\Core\TypeCasts\DataWrapperContract; use MoonShine\Contracts\UI\ActionButtonContract; use MoonShine\Laravel\Enums\Ability; @@ -27,8 +28,10 @@ public static function for( ): ActionButtonContract { /** @var ModelResource $resource */ $resource = $field->getResource()->stopGettingItemFromUrl(); - $parentResource = moonshineRequest()->getResource(); - $parentPage = moonshineRequest()->getPage(); + /** @var ?CrudResourceContract $parentResource */ + $parentResource = $field->getNowOnResource() ?? moonshineRequest()->getResource(); + $parentPage = $field->getNowOnPage() ?? moonshineRequest()->getPage(); + $itemID = data_get($field->getNowOnQueryParams(), 'resourceItem', moonshineRequest()->getItemID()); if (! $resource->getFormPage()) { return ActionButton::emptyHidden(); @@ -36,7 +39,7 @@ public static function for( $action = static fn (?Model $data) => $parentResource->getRoute( 'has-many.form', - moonshineRequest()->getItemID(), + $itemID, [ 'pageUri' => $parentPage->getUriKey(), '_relation' => $field->getRelationName(), diff --git a/src/Laravel/src/Fields/Relationships/HasMany.php b/src/Laravel/src/Fields/Relationships/HasMany.php index 401fc0d54..508f94ab6 100644 --- a/src/Laravel/src/Fields/Relationships/HasMany.php +++ b/src/Laravel/src/Fields/Relationships/HasMany.php @@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\Relations\HasOneOrManyThrough; use Illuminate\Database\Eloquent\Relations\MorphOneOrMany; use Illuminate\Database\Eloquent\Relations\Relation; +use MoonShine\Contracts\Core\CrudResourceContract; use MoonShine\Contracts\Core\DependencyInjection\FieldsContract; use MoonShine\Contracts\Core\TypeCasts\DataWrapperContract; use MoonShine\Contracts\UI\ActionButtonContract; @@ -125,9 +126,10 @@ public function getRedirectAfter(Model|int|null|string $parentId): ?string public function getDefaultRedirect(Model|int|null|string $parentId): ?string { - return moonshineRequest() - ->getResource() - ?->getFormPageUrl($parentId); + /** @var ?CrudResourceContract $resource */ + $resource = $this->getNowOnResource() ?? moonshineRequest()->getResource(); + + return $resource->getFormPageUrl($parentId); } /** @@ -425,7 +427,9 @@ protected function getTableValue(): TableBuilder $asyncUrl = moonshineRouter()->getEndpoints()->withRelation( 'has-many.list', resourceItem: $this->getRelatedModel()?->getKey(), - relation: $this->getRelationName() + relation: $this->getRelationName(), + resourceUri: $this->getNowOnResource()?->getUriKey(), + pageUri: $this->getNowOnPage()?->getUriKey() ); return TableBuilder::make(items: $items) diff --git a/src/Laravel/src/Fields/Relationships/HasOne.php b/src/Laravel/src/Fields/Relationships/HasOne.php index b6b546d9d..a2965801e 100644 --- a/src/Laravel/src/Fields/Relationships/HasOne.php +++ b/src/Laravel/src/Fields/Relationships/HasOne.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Relations\HasOneOrMany; use Illuminate\Database\Eloquent\Relations\HasOneOrManyThrough; use Illuminate\Database\Eloquent\Relations\MorphOneOrMany; +use MoonShine\Contracts\Core\CrudResourceContract; use MoonShine\Contracts\Core\DependencyInjection\FieldsContract; use MoonShine\Contracts\UI\ComponentContract; use MoonShine\Contracts\UI\FieldContract; @@ -181,9 +182,10 @@ public function getRedirectAfter(Model|int|null|string $parentId): ?string public function getDefaultRedirect(Model|int|null|string $parentId): ?string { - return moonshineRequest() - ->getResource() - ?->getFormPageUrl($parentId); + /** @var ?CrudResourceContract $resource */ + $resource = $this->getNowOnResource() ?? moonshineRequest()->getResource(); + + return $resource->getFormPageUrl($parentId); } /** @@ -219,7 +221,7 @@ public function getComponent(): ComponentContract $resource = $this->getResource()->stopGettingItemFromUrl(); /** @var ?ModelResource $parentResource */ - $parentResource = moonshineRequest()->getResource(); + $parentResource = $this->getNowOnResource() ?? moonshineRequest()->getResource(); $item = $this->toValue(); diff --git a/src/Laravel/src/Pages/Page.php b/src/Laravel/src/Pages/Page.php index 513e743f3..6dc093811 100644 --- a/src/Laravel/src/Pages/Page.php +++ b/src/Laravel/src/Pages/Page.php @@ -8,6 +8,9 @@ use Illuminate\Contracts\Support\Renderable; use Illuminate\View\View; use MoonShine\Contracts\Core\CrudResourceContract; +use MoonShine\Contracts\Core\DependencyInjection\CoreContract; +use MoonShine\Contracts\Core\PageContract; +use MoonShine\Contracts\Core\ResourceContract; use MoonShine\Core\Pages\Page as CorePage; use MoonShine\Laravel\Contracts\WithResponseModifierContract; use MoonShine\Laravel\DependencyInjection\MoonShine; @@ -29,9 +32,24 @@ protected function prepareBeforeRender(): void oops404(); } + $this->simulateRoute(); + } + + public function simulateRoute(?PageContract $page = null, ?ResourceContract $resource = null): static + { request() ->route() - ?->setParameter('pageUri', $this->getUriKey()); + ?->setParameter('pageUri', ($page ?? $this)->getUriKey()); + + if(!\is_null($resource)) { + $this->setResource($resource); + + request() + ->route() + ?->setParameter('resourceUri', $resource->getUriKey()); + } + + return $this; } protected function prepareRender(Renderable|Closure|string $view): Renderable|Closure|string @@ -43,6 +61,11 @@ protected function prepareRender(Renderable|Closure|string $view): Renderable|Cl ); } + public function nowOn(): static + { + return $this; + } + public function isResponseModified(): bool { return $this->modifyResponse() instanceof Response; diff --git a/src/Laravel/src/Traits/Fields/BelongsToOrManyCreatable.php b/src/Laravel/src/Traits/Fields/BelongsToOrManyCreatable.php index 7cd9c48c4..93363024e 100644 --- a/src/Laravel/src/Traits/Fields/BelongsToOrManyCreatable.php +++ b/src/Laravel/src/Traits/Fields/BelongsToOrManyCreatable.php @@ -57,10 +57,14 @@ public function getCreateButton(): ?ActionButtonContract public function getFragmentUrl(): string { + $resource = $this->getNowOnResource() ?? moonshineRequest()->getResource(); + $page = $this->getNowOnPage() ?? moonshineRequest()->getPage(); + $itemID = data_get($this->getNowOnQueryParams(), 'resourceItem', moonshineRequest()->getItemID()); + return $this->creatableFragmentUrl ?? toPage( - page: moonshineRequest()->getPage(), - resource: moonshineRequest()->getResource(), - params: ['resourceItem' => moonshineRequest()->getItemID()], + page: $page, + resource: $resource, + params: ['resourceItem' => $itemID], fragment: $this->getRelationName() ); } diff --git a/src/Laravel/src/Traits/Fields/WithAsyncSearch.php b/src/Laravel/src/Traits/Fields/WithAsyncSearch.php index 0ccc08546..5b574cd6c 100644 --- a/src/Laravel/src/Traits/Fields/WithAsyncSearch.php +++ b/src/Laravel/src/Traits/Fields/WithAsyncSearch.php @@ -131,10 +131,11 @@ public function getAsyncSearchUrl(): string } $resourceUri = $this->getNowOnResource()?->getUriKey() ?? moonshineRequest()->getResourceUri(); + $itemID = data_get($this->getNowOnQueryParams(), 'resourceItem', moonshineRequest()->getItemID()); return moonshineRouter()->getEndpoints()->withRelation( 'async-search', - resourceItem: moonshineRequest()->getItemID(), + resourceItem: $itemID, relation: $this->getRelationName(), resourceUri: $resourceUri, parentField: $parentName, diff --git a/src/Laravel/src/Traits/Fields/WithRelatedLink.php b/src/Laravel/src/Traits/Fields/WithRelatedLink.php index 6b82282fb..69c248679 100644 --- a/src/Laravel/src/Traits/Fields/WithRelatedLink.php +++ b/src/Laravel/src/Traits/Fields/WithRelatedLink.php @@ -63,7 +63,9 @@ public function getRelatedLinkRelation(): string return $this->parentRelationName; } - $relationName = str((string) moonshineRequest()->getResourceUri()) + $resource = $this->getNowOnResource() ?? moonshineRequest()->getResource(); + + $relationName = str((string) $resource?->getUriKey()) ->remove('-resource') ->replace('-', '_');