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..2633f02 --- /dev/null +++ b/src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php @@ -0,0 +1,97 @@ +parentClass = get_class($this->getRelationship()->getParent()); + $this->relatedClass = get_class($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 = Filament::getCurrentPanel()->getModelResource($this->getRelationship()->getParent()); + + 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', ]); }