1. Go to this page and download the library: Download wezlo/filament-approval library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
wezlo / filament-approval example snippets
use Wezlo\FilamentApproval\FilamentApprovalPlugin;
->plugins([
FilamentApprovalPlugin::make(),
])
use Wezlo\FilamentApproval\FilamentApprovalPlugin;
// SuperAdmin panel -- uses Admin model and custom resolvers
->plugins([
FilamentApprovalPlugin::make()
->userModel(\App\Models\Admin::class)
->resolvers([
\App\ApproverResolvers\AdminResolver::class,
])
->navigationGroup('Admin Approvals'),
])
// Company panel -- uses defaults from config
->plugins([
FilamentApprovalPlugin::make(),
])
use Wezlo\FilamentApproval\Concerns\HasApprovals;
class PurchaseOrder extends Model
{
use HasApprovals;
}
$order->submitForApproval(); // Submit using auto-detected flow
$order->submitForApproval($flow); // Submit using a specific flow
$order->isPendingApproval(); // Check if pending
$order->isApproved(); // Check if approved
$order->isRejected(); // Check if rejected
$order->approvalStatus(); // Get ApprovalStatus enum
$order->latestApproval(); // Get latest Approval model
$order->currentApproval(); // Get current pending Approval
$order->approvals; // All approval instances
use Wezlo\FilamentApproval\Concerns\HasApprovalsResource;
class ViewPurchaseOrder extends ViewRecord
{
use HasApprovalsResource;
protected static string $resource = PurchaseOrderResource::class;
protected function getHeaderActions(): array
{
return [
...$this->getApprovalHeaderActions(),
// your other actions...
];
}
}
use Wezlo\FilamentApproval\Columns\ApprovalStatusColumn;
public static function table(Table $table): Table
{
return $table->columns([
TextColumn::make('title'),
ApprovalStatusColumn::make(),
// ...
]);
}
use Wezlo\FilamentApproval\RelationManagers\ApprovalsRelationManager;
public static function getRelations(): array
{
return [
ApprovalsRelationManager::class,
];
}
use Wezlo\FilamentApproval\Infolists\ApprovalStatusSection;
public static function infolist(Schema $schema): Schema
{
return $schema->components([
// your other entries...
ApprovalStatusSection::make(),
]);
}
use Wezlo\FilamentApproval\ApproverResolvers\CallbackResolver;
// In AppServiceProvider::boot()
CallbackResolver::register('project_manager', function ($approvable) {
return [$approvable->project->manager_user_id];
});
CallbackResolver::register('department_head', function ($approvable) {
return [$approvable->department->head_user_id];
});
use Wezlo\FilamentApproval\Contracts\ApproverResolver;
use Illuminate\Database\Eloquent\Model;
class TeamLeadResolver implements ApproverResolver
{
public function resolve(array $config, Model $approvable): array
{
return $approvable->team->leads->pluck('id')->all();
}
public static function label(): string
{
return 'Team Leads';
}
public static function configSchema(): array
{
return [
// Filament form components for configuring this resolver
];
}
}
class Contract extends Model
{
use HasApprovals;
/**
* Once approved or rejected, the submit button won't appear again.
*/
public function allowsApprovalResubmission(): bool
{
return false;
}
}
class PurchaseOrder extends Model
{
use HasApprovals;
/**
* Only the creator or admins can submit for approval.
*/
public function canSubmitForApproval(?int $userId = null): bool
{
$userId ??= auth()->id();
return $this->created_by === $userId
|| User::find($userId)?->hasRole('admin');
}
}
class Invoice extends Model
{
use HasApprovals;
public function allowsApprovalResubmission(): bool
{
// Allow resubmission only if previously rejected (not if approved)
$latest = $this->latestApproval();
return ! $latest || $latest->status !== ApprovalStatus::Approved;
}
public function canSubmitForApproval(?int $userId = null): bool
{
return $this->created_by === ($userId ?? auth()->id());
}
}
use Wezlo\FilamentApproval\Events\ApprovalSubmitted;
use Wezlo\FilamentApproval\Events\ApprovalStepCompleted;
use Wezlo\FilamentApproval\Events\ApprovalCompleted;
use Wezlo\FilamentApproval\Events\ApprovalRejected;
use Wezlo\FilamentApproval\Events\ApprovalEscalated;
use Wezlo\FilamentApproval\Concerns\HasApprovals;
use Wezlo\FilamentApproval\Models\Approval;
use Wezlo\FilamentApproval\Models\ApprovalAction;
use Wezlo\FilamentApproval\Models\ApprovalStepInstance;
class PurchaseOrder extends Model
{
use HasApprovals;
public function onApprovalSubmitted(Approval $approval): void
{
$this->update(['status' => 'pending_approval']);
}
public function onApprovalApproved(Approval $approval): void
{
$this->update(['status' => 'approved']);
Mail::to($this->requester)->send(new OrderApprovedMail($this));
}
public function onApprovalRejected(Approval $approval): void
{
$this->update(['status' => 'rejected']);
}
public function onApprovalCancelled(Approval $approval): void
{
$this->update(['status' => 'draft']);
}
public function onApprovalCommented(ApprovalAction $action): void
{
// Notify the team about the comment
}
public function onApprovalDelegated(
ApprovalStepInstance $stepInstance,
int $fromUserId,
int $toUserId,
): void {
// Log delegation
}
public function onApprovalStepCompleted(ApprovalStepInstance $stepInstance): void
{
// Notify when a step passes
}
public function onApprovalEscalated(ApprovalStepInstance $stepInstance): void
{
// Alert management about SLA breach
}
}