afea/filament-positions

Career positions module for the Afea Filament CMS package ecosystem: job listings with SEO, applications, and public routes.

Maintainers

Package info

github.com/AfeaSoftware/filament-positions

pkg:composer/afea/filament-positions

Statistics

Installs: 1

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

v0.1.0 2026-04-21 10:48 UTC

This package is auto-updated.

Last update: 2026-04-21 11:57:46 UTC


README

Career positions module for the Afea Filament CMS package ecosystem.

Ships:

  • Position model — SEO-enabled, supports slug/resource/localized routing, carries a free-form additional_fields JSON bag
  • PositionApplication model — candidate submissions with CV file (stored on a private disk), status workflow
  • Three translatable enums: PositionLocation, PositionType, PositionApplicationStatus
  • Filament v4 PositionResource + PositionApplicationResource (with pending-badge in navigation)
  • PositionController with list/show/apply actions + shipped Blade views
  • PositionsPlugin
  • afea:install:positions installer

Installation

composer require afea/filament-positions
php artisan afea:install:positions

Register in AdminPanelProvider:

->plugin(\Afea\Cms\Positions\Filament\PositionsPlugin::make())

Set AFEA_POSITIONS_CV_DISK to a private disk — CVs contain candidate PII.

Three common scenarios

1. Switch routing strategy

AFEA_POSITIONS_ROUTING_STRATEGY=localized
AFEA_POSITIONS_PREFIX=kariyer

Public URLs move from /careers/developer to /tr/kariyer/developer.

2. Query active positions grouped by department

use Afea\Cms\Positions\Models\Position;

$byDepartment = Position::query()
    ->active()
    ->with('seo')
    ->get()
    ->groupBy('department');

3. Extend the application status workflow

Override the enum via a sub-enum replacement isn't possible, but you can override the model:

class PositionApplication extends \Afea\Cms\Positions\Models\PositionApplication
{
    public function scopeNeedsReview($q)
    {
        return $q->pending()->where('created_at', '<', now()->subDays(3));
    }
}
'models' => ['position_application' => \App\Models\PositionApplication::class],