From b2be2a58f9dcf2f6ace604c22d7a021a4222a8d3 Mon Sep 17 00:00:00 2001 From: Sergey Tereshko Date: Sat, 8 Jun 2024 12:46:58 +0300 Subject: [PATCH 1/2] Added support of Relation Managers --- README.md | 20 ++++ .../resource-lock-observer.blade.php | 6 +- .../UsesRelationManagerResourceLock.php | 101 ++++++++++++++++++ .../Pages/Concerns/UsesResourceLock.php | 9 +- .../Pages/Concerns/UsesSimpleResourceLock.php | 2 +- 5 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php diff --git a/README.md b/README.md index de33bae..92240bb 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,26 @@ class ManagePosts extends ManageRecords } ``` +#### Relation Managers + +If you have a [relation manager](https://filamentphp.com/docs/3.x/panels/resources/relation-managers#creating-a-relation-manager) in the resource, +you'll need to use the new UsesRelationManagerResourceLock trait. + +```php +// TreatmentsRelationManager.php + +use Filament\Resources\RelationManagers\RelationManager; +use Kenepa\ResourceLock\Resources\Pages\Concerns\UsesRelationManagerResourceLock; + +class TreatmentsRelationManager extends RelationManager +{ + use UsesRelationManagerResourceLock; + + protected static string $relationship = 'treatments'; + +} +``` + And that's it! Your resource is now able to be locked. Refer to the documentation below for more information on how to configure the locking functionality. diff --git a/resources/views/components/resource-lock-observer.blade.php b/resources/views/components/resource-lock-observer.blade.php index 1efb428..c1d5560 100644 --- a/resources/views/components/resource-lock-observer.blade.php +++ b/resources/views/components/resource-lock-observer.blade.php @@ -10,9 +10,9 @@ function resourceLockObserverInit() { }; window.addEventListener('close-modal', event => { - if (event.detail.id.endsWith('-table-action')) { - Livewire.dispatch('resourceLockObserver::unload') - } + if (event.detail.id.endsWith('-table-action')) { + Livewire.dispatch('resourceLockObserver::unloadSimple') + } }) diff --git a/src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php b/src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php new file mode 100644 index 0000000..dd32be7 --- /dev/null +++ b/src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php @@ -0,0 +1,101 @@ +parentClass = + "App\\Models\\" . + class_basename($this->getRelationship()->getParent()); + + $this->relatedClass = + "App\\Models\\" . + class_basename($this->getRelationship()->getRelated()); + } + + #[On('resourceLockObserver::unlock')] + public function resourceLockObserverUnlock(){ + if ($this->relatedRecord) { + if ($this->relatedRecord->unlock(force: true)) { + $this->closeLockedResourceModal(); + $this->relatedLock(); + } + } else { + if ($this->getOwnerRecord()->unlock(force: true)) { + $this->closeLockedResourceModal(); + $this->getOwnerRecord()->lock(); + } + } + } + + public function relatedLock() + { + $resourceLockModel = config('resource-lock.models.ResourceLock', ResourceLock::class); + $guard = Filament::auth()->name; + $resourceLock = new $resourceLockModel; + $resourceLock->user_id = auth()->guard($guard)->user()->id; + $resourceLock->lockable_id = $this->relatedRecord->id; + $resourceLock->lockable_type = $this->relatedRecord->getMorphClass(); + $resourceLock->save(); + } + + public function mountTableAction( + string $name, + ?string $record = null, + array $arguments = [] + ): mixed { + parent::mountTableAction($name, $record); + + if ($name == "edit") { + $this->relatedRecord = $this->relatedClass::find($record); + $this->checkIfResourceLockHasExpired($this->relatedRecord); + $this->lockResource($this->relatedRecord); + } + + return null; + } + + public function unmountTableAction( + bool $shouldCancelParentActions = true + ): void { + if ($this->mountedTableActionRecord) { + $this->relatedRecord = $this->relatedClass::find( + $this->mountedTableActionRecord + ); + + $this->relatedRecord->unlock(); + } + + parent::unmountTableAction($shouldCancelParentActions); + } + + public function resourceLockReturnUrl() + { + $parentClassResource = "App\\Filament\\Resources\\" . + class_basename($this->getRelationship()->getParent()) . "Resource"; + return $parentClassResource::getUrl("edit", ['record' => $this->getOwnerRecord()->id]); + } + + public function getResourceLockOwner(): void + { + if (config('resource-lock.lock_notice.display_resource_lock_owner', false)) { + $getResourceLockOwnerActionClass = config('resource-lock.actions.get_resource_lock_owner_action'); + $getResourceLockOwnerAction = app($getResourceLockOwnerActionClass); + + $this->resourceLockOwner = $getResourceLockOwnerAction->execute($this->relatedRecord->resourceLock->user); + } + } +} diff --git a/src/Resources/Pages/Concerns/UsesResourceLock.php b/src/Resources/Pages/Concerns/UsesResourceLock.php index 882e110..37beac8 100644 --- a/src/Resources/Pages/Concerns/UsesResourceLock.php +++ b/src/Resources/Pages/Concerns/UsesResourceLock.php @@ -55,9 +55,12 @@ public function resourceLockObserverUnload() */ public function resourceLockObserverUnlock() { - if ($this->record->unlock(force: true)) { - $this->closeLockedResourceModal(); - $this->record->lock(); + if (is_null($this->activeRelationManager)) { + if ($this->record->unlock(force: true)) { + $this->closeLockedResourceModal(); + $this->record->refresh(); + $this->record->lock(); + } } } diff --git a/src/Resources/Pages/Concerns/UsesSimpleResourceLock.php b/src/Resources/Pages/Concerns/UsesSimpleResourceLock.php index 5d7073f..3723fd0 100644 --- a/src/Resources/Pages/Concerns/UsesSimpleResourceLock.php +++ b/src/Resources/Pages/Concerns/UsesSimpleResourceLock.php @@ -18,7 +18,7 @@ public function bootUsesSimpleResourceLock(): void { $this->listeners = array_merge($this->listeners, [ 'resourceLockObserver::init' => 'resourceLockObserverInit', - 'resourceLockObserver::unload' => 'resourceLockObserverUnload', + 'resourceLockObserver::unloadSimple' => 'resourceLockObserverUnload', 'resourceLockObserver::unlock' => 'resourceLockObserverUnlock', ]); } From 619f1e436b30b6c9dd86ea8a225563199b755fe9 Mon Sep 17 00:00:00 2001 From: Jehizkia Date: Mon, 1 Jul 2024 13:46:21 +0200 Subject: [PATCH 2/2] Added support for nested resources --- .../UsesRelationManagerResourceLock.php | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php b/src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php index dd32be7..2633f02 100644 --- a/src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php +++ b/src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php @@ -17,17 +17,13 @@ trait UsesRelationManagerResourceLock public function bootUsesRelationManagerResourceLock(): void { - $this->parentClass = - "App\\Models\\" . - class_basename($this->getRelationship()->getParent()); - - $this->relatedClass = - "App\\Models\\" . - class_basename($this->getRelationship()->getRelated()); + $this->parentClass = get_class($this->getRelationship()->getParent()); + $this->relatedClass = get_class($this->getRelationship()->getRelated()); } #[On('resourceLockObserver::unlock')] - public function resourceLockObserverUnlock(){ + public function resourceLockObserverUnlock() + { if ($this->relatedRecord) { if ($this->relatedRecord->unlock(force: true)) { $this->closeLockedResourceModal(); @@ -59,7 +55,7 @@ public function mountTableAction( ): mixed { parent::mountTableAction($name, $record); - if ($name == "edit") { + if ($name == 'edit') { $this->relatedRecord = $this->relatedClass::find($record); $this->checkIfResourceLockHasExpired($this->relatedRecord); $this->lockResource($this->relatedRecord); @@ -84,9 +80,9 @@ public function unmountTableAction( public function resourceLockReturnUrl() { - $parentClassResource = "App\\Filament\\Resources\\" . - class_basename($this->getRelationship()->getParent()) . "Resource"; - return $parentClassResource::getUrl("edit", ['record' => $this->getOwnerRecord()->id]); + $parentClassResource = Filament::getCurrentPanel()->getModelResource($this->getRelationship()->getParent()); + + return $parentClassResource::getUrl('edit', ['record' => $this->getOwnerRecord()->id]); } public function getResourceLockOwner(): void