Skip to content

Commit accd379

Browse files
authored
Merge pull request #42 from tipoff/chx2/feature/41-contact-status
Contact Status #41
2 parents 1f25e7a + ed3391a commit accd379

File tree

8 files changed

+122
-1
lines changed

8 files changed

+122
-1
lines changed

composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"tipoff/authorization": "^2.5.5",
2222
"tipoff/locations": "^2.6.0",
2323
"tipoff/notes": "^2.0.1",
24-
"tipoff/statuses": "^2.1.0",
24+
"tipoff/statuses": "^2.1",
2525
"tipoff/support": "^1.7.2"
2626
},
2727
"require-dev": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Illuminate\Database\Migrations\Migration;
6+
use Tipoff\Forms\Enums\ContactStatus;
7+
use Tipoff\Statuses\Models\Status;
8+
9+
class AddContactStatuses extends Migration
10+
{
11+
public function up()
12+
{
13+
Status::publishStatuses(ContactStatus::statusType(), ContactStatus::getValues());
14+
}
15+
}

src/Enums/ContactStatus.php

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tipoff\Forms\Enums;
6+
7+
use Tipoff\Statuses\Models\Status;
8+
use Tipoff\Support\Enums\BaseEnum;
9+
10+
/**
11+
* @method static ContactStatus SUBMITTED()
12+
* @psalm-immutable
13+
*/
14+
class ContactStatus extends BaseEnum
15+
{
16+
const SUBMITTED = 'Submitted';
17+
18+
public static function statusType(): string
19+
{
20+
return StatusType::CONTACT;
21+
}
22+
23+
public function toStatus(): ? Status
24+
{
25+
/** @psalm-suppress ImpureMethodCall */
26+
return Status::findStatus(static::statusType(), (string) $this->getValue());
27+
}
28+
}

src/Enums/StatusType.php

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tipoff\Forms\Enums;
6+
7+
use Tipoff\Support\Enums\BaseEnum;
8+
9+
/**
10+
* @method static StatusType CONTACT()
11+
* @psalm-immutable
12+
*/
13+
class StatusType extends BaseEnum
14+
{
15+
const CONTACT = 'contact';
16+
}

src/Models/Contact.php

+29
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,20 @@
66

77
use Assert\Assert;
88
use Carbon\Carbon;
9+
use Illuminate\Database\Eloquent\Builder;
910
use Illuminate\Database\Eloquent\SoftDeletes;
11+
use Illuminate\Support\Collection;
1012
use Illuminate\Support\Str;
13+
use Tipoff\Forms\Enums\ContactStatus;
14+
use Tipoff\Statuses\Traits\HasStatuses;
1115
use Tipoff\Support\Models\BaseModel;
1216
use Tipoff\Support\Traits\HasPackageFactory;
1317

1418
class Contact extends BaseModel
1519
{
1620
use HasPackageFactory;
1721
use SoftDeletes;
22+
use HasStatuses;
1823

1924
protected $casts = [
2025
'emailed_at' => 'datetime',
@@ -47,6 +52,30 @@ public function generateReferenceNumber()
4752
$this->reference_number = $token;
4853
}
4954

55+
public function scopeByContactStatus(Builder $query, ContactStatus $contactStatus): Builder
56+
{
57+
return $this->scopeByStatus($query, $contactStatus->toStatus());
58+
}
59+
60+
public function setContactStatus(ContactStatus $contactStatus): self
61+
{
62+
$this->setStatus((string) $contactStatus->getValue(), ContactStatus::statusType());
63+
64+
return $this;
65+
}
66+
67+
public function getContactStatus(): ? ContactStatus
68+
{
69+
$status = $this->getStatus(ContactStatus::statusType());
70+
71+
return $status ? ContactStatus::byValue((string) $status) : null;
72+
}
73+
74+
public function getContactStatusHistory(): Collection
75+
{
76+
return $this->getStatusHistory(ContactStatus::statusType());
77+
}
78+
5079
public function user()
5180
{
5281
return $this->belongsTo(app('user'));

src/Nova/Contact.php

+8
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
use Laravel\Nova\Fields\Textarea;
1818
use Laravel\Nova\Http\Requests\NovaRequest;
1919
use Laravel\Nova\Panel;
20+
use Tipoff\Forms\Enums\ContactStatus;
2021
use Tipoff\Support\Nova\BaseResource;
22+
use Tipoff\Support\Nova\Fields\Enum;
2123

2224
class Contact extends BaseResource
2325
{
@@ -41,6 +43,9 @@ public function fieldsForIndex(NovaRequest $request)
4143
{
4244
return array_filter([
4345
ID::make(),
46+
Enum::make('ContactStatus', function (\Tipoff\Forms\Models\Contact $contact) {
47+
return $contact->getContactStatus();
48+
})->attach(ContactStatus::class)->sortable(),
4449
Text::make('Form Type')->sortable(),
4550
Text::make('Number', 'reference_number')->sortable(),
4651
nova('user') ? BelongsTo::make('User', 'user', nova('user'))->sortable() : null,
@@ -52,6 +57,9 @@ public function fieldsForIndex(NovaRequest $request)
5257
public function fields(Request $request)
5358
{
5459
return array_filter([
60+
Enum::make('ContactStatus', function (\Tipoff\Forms\Models\Contact $contact) {
61+
return $contact->getContactStatus();
62+
})->attach(ContactStatus::class),
5563
Select::make('Form Type')->options([
5664
'contact' => 'Contact Page',
5765
'reservation' => 'Reservation Page',

tests/TestCase.php

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Tipoff\Forms\FormsServiceProvider;
1212
use Tipoff\Forms\Tests\Support\Providers\NovaPackageServiceProvider;
1313
use Tipoff\Locations\LocationsServiceProvider;
14+
use Tipoff\Statuses\StatusesServiceProvider;
1415
use Tipoff\Support\SupportServiceProvider;
1516
use Tipoff\TestSupport\BaseTestCase;
1617

@@ -21,6 +22,7 @@ protected function getPackageProviders($app)
2122
return [
2223
SupportServiceProvider::class,
2324
AddressesServiceProvider::class,
25+
StatusesServiceProvider::class,
2426
AuthorizationServiceProvider::class,
2527
PermissionServiceProvider::class,
2628
LocationsServiceProvider::class,

tests/Unit/Models/ContactModelTest.php

+23
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,40 @@
55
namespace Tipoff\Forms\Tests\Unit\Models;
66

77
use Illuminate\Foundation\Testing\DatabaseTransactions;
8+
use Illuminate\Foundation\Testing\WithFaker;
9+
use Tipoff\Authorization\Models\User;
10+
use Tipoff\Forms\Enums\ContactStatus;
811
use Tipoff\Forms\Models\Contact;
912
use Tipoff\Forms\Tests\TestCase;
13+
use Tipoff\Statuses\Models\StatusRecord;
1014

1115
class ContactModelTest extends TestCase
1216
{
1317
use DatabaseTransactions;
18+
use WithFaker;
1419

1520
/** @test */
1621
public function create()
1722
{
1823
$model = Contact::factory()->create();
1924
$this->assertNotNull($model);
2025
}
26+
27+
/** @test */
28+
public function can_set_status()
29+
{
30+
$this->actingAs(User::factory()->create());
31+
32+
/** @var Contact $contact */
33+
$contact = Contact::factory()->create();
34+
$contact->setContactStatus(ContactStatus::SUBMITTED());
35+
$this->assertEquals(ContactStatus::SUBMITTED, $contact->getContactStatus()->getValue());
36+
37+
$history = $contact->getContactStatusHistory()
38+
->map(function (StatusRecord $statusRecord) {
39+
return (string) $statusRecord->status;
40+
})->toArray();
41+
42+
$this->assertEquals([ContactStatus::SUBMITTED], $history);
43+
}
2144
}

0 commit comments

Comments
 (0)