Skip to content

Commit

Permalink
Added support of Relation Managers
Browse files Browse the repository at this point in the history
  • Loading branch information
stereshko committed Jun 23, 2024
1 parent 4114250 commit b2be2a5
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 7 deletions.
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
6 changes: 3 additions & 3 deletions resources/views/components/resource-lock-observer.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -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')
}
})
</script>

Expand Down
101 changes: 101 additions & 0 deletions src/Resources/Pages/Concerns/UsesRelationManagerResourceLock.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<?php

namespace Kenepa\ResourceLock\Resources\Pages\Concerns;

use Filament\Facades\Filament;
use Kenepa\ResourceLock\Models\ResourceLock;
use Livewire\Attributes\On;

trait UsesRelationManagerResourceLock
{
use UsesLocks;

public $relatedRecord;

public string $parentClass;
public string $relatedClass;

public function bootUsesRelationManagerResourceLock(): void
{
$this->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);
}
}
}
9 changes: 6 additions & 3 deletions src/Resources/Pages/Concerns/UsesResourceLock.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Resources/Pages/Concerns/UsesSimpleResourceLock.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
]);
}
Expand Down

0 comments on commit b2be2a5

Please sign in to comment.