Skip to content

Assignable ​

The Assignable feature lets you assign records (e.g. tasks, tickets) to users or roles. It follows the triple pattern: Entity trait + Repository trait + Hydrate.

Entity Trait: Assignable ​

Add the Assignable trait to your model:

php
<?php

namespace Modules\Task\Entities;

use Unusualify\Modularous\Entities\Model;
use Unusualify\Modularous\Entities\Traits\Assignable;

class Task extends Model
{
    use Assignable;
}

Relationships and Accessors ​

  • assignments() — morphMany to Assignment (all assignments for the record)
  • lastAssignment() — morphOne to the latest assignment
  • active_assignee_name — appended attribute; name of the current assignee
  • active_assigner_name — appended attribute; name of the user who assigned
  • active_assignment_status — appended attribute; status chip HTML

Boot Logic ​

On delete, assignments are soft-deleted (if the model uses SoftDeletes) or force-deleted. On force-delete, assignments are force-deleted as well.

Repository Trait: AssignmentTrait ​

Add AssignmentTrait to your repository:

php
<?php

namespace Modules\Task\Repositories;

use Unusualify\Modularous\Repositories\Repository;
use Unusualify\Modularous\Repositories\Traits\AssignmentTrait;

class TaskRepository extends Repository
{
    use AssignmentTrait;

    public function __construct(Task $model)
    {
        $this->model = $model;
    }
}

Methods ​

  • setColumnsAssignmentTrait — Collects assignment input columns from route inputs
  • getFormFieldsAssignmentTrait — Populates form fields with assignable object key
  • filterAssignmentTrait — Applies everAssignedToYourRoleOrHasAuthorization scope
  • getTableFiltersAssignmentTrait — Returns table filters (my-assignments, your-role-assignments, completed, pending, etc.)
  • getAssignments — Fetches assignments for a given assignable ID

Input Config ​

Add an assignment input to your route in Config/config.php:

php
'routes' => [
    'item' => [
        'inputs' => [
            [
                'name' => 'assignee',
                'type' => 'assignment',
                'assigneeType' => \Modules\SystemUser\Entities\User::class,  // optional; defaults to route model
                'scopeRole' => ['admin', 'manager'],  // optional; filter assignees by Spatie role
                'acceptedExtensions' => ['pdf'],       // optional; for attachments
                'max-attachments' => 3,               // optional
            ],
        ],
    ],
],

Hydrate: AssignmentHydrate ​

AssignmentHydrate transforms the input into input-assignment schema.

Requirements ​

KeyDefault
nameassignable_id
noSubmittrue
col['cols' => 12]
defaultnull

Output ​

  • type: input-assignment
  • assigneeType: Resolved from input or route model
  • assignableType: Resolved from route model
  • fetchEndpoint: URL for fetching assignments
  • saveEndpoint: URL for creating assignments
  • filepond: Embedded Filepond schema for attachments (default: pdf, max 3)

Role Scoping ​

If scopeRole is set and the assignee model uses Spatie HasRoles, the hydrate filters assignees by those roles.