Release v1.4.0 #146
5 changed files with 42 additions and 4 deletions
|
|
@ -4,9 +4,12 @@
|
|||
|
||||
use App\Enums\ActivityTypeEnum;
|
||||
use App\Models\ActivityLog;
|
||||
use App\Models\Article;
|
||||
use App\Services\Activity\ActivitySummary;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Relations\MorphTo;
|
||||
use Illuminate\Database\Eloquent\Relations\Relation;
|
||||
use Livewire\Component;
|
||||
use Livewire\WithPagination;
|
||||
|
||||
|
|
@ -34,7 +37,11 @@ public function updatedDays(): void
|
|||
private function query(): Builder
|
||||
{
|
||||
return ActivityLog::query()
|
||||
->with('subject')
|
||||
->with(['subject' => function (Relation $morphTo): void {
|
||||
if ($morphTo instanceof MorphTo) {
|
||||
$morphTo->morphWith([Article::class => ['feed']]);
|
||||
}
|
||||
}])
|
||||
->since(now()->subDays($this->days))
|
||||
->when(
|
||||
$this->type !== '',
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public function loggedAt(Carbon $loggedAt): static
|
|||
return $this->state(['logged_at' => $loggedAt]);
|
||||
}
|
||||
|
||||
public function for_subject(Model $subject): static
|
||||
public function forSubject(Model $subject): static
|
||||
{
|
||||
return $this->state([
|
||||
'subject_type' => $subject->getMorphClass(),
|
||||
|
|
|
|||
|
|
@ -44,6 +44,9 @@ class="w-44 shrink-0 pl-3 pr-10 py-2 border border-gray-300 rounded-md text-sm f
|
|||
|
||||
<div class="min-w-0 flex-1">
|
||||
<p class="text-sm text-gray-900 dark:text-gray-100">{{ $entry->message }}</p>
|
||||
@if ($entry->subject instanceof App\Models\Article)
|
||||
<p class="mt-0.5 text-xs text-gray-500 dark:text-gray-400">{{ $entry->subject->feed?->name }}</p>
|
||||
@endif
|
||||
@if (($entry->context['reason'] ?? null) !== null)
|
||||
<p class="mt-0.5 text-xs text-gray-500 dark:text-gray-400">{{ $entry->context['reason'] }}</p>
|
||||
@endif
|
||||
|
|
|
|||
|
|
@ -6,7 +6,9 @@
|
|||
use App\Livewire\Activity;
|
||||
use App\Models\ActivityLog;
|
||||
use App\Models\Article;
|
||||
use App\Models\Feed;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Livewire\Livewire;
|
||||
use Tests\TestCase;
|
||||
|
||||
|
|
@ -70,7 +72,7 @@ public function test_entry_without_a_subject_renders(): void
|
|||
public function test_entry_with_a_deleted_subject_renders(): void
|
||||
{
|
||||
$article = Article::factory()->create();
|
||||
ActivityLog::factory()->for_subject($article)->create(['message' => 'Dangling subject']);
|
||||
ActivityLog::factory()->forSubject($article)->create(['message' => 'Dangling subject']);
|
||||
$article->delete();
|
||||
|
||||
Livewire::test(Activity::class)
|
||||
|
|
@ -83,6 +85,32 @@ public function test_empty_state_is_shown_when_there_is_no_activity(): void
|
|||
Livewire::test(Activity::class)->assertSee('No activity in this period.');
|
||||
}
|
||||
|
||||
public function test_an_article_subject_shows_its_feed_name(): void
|
||||
{
|
||||
$feed = Feed::factory()->create(['name' => 'VRT News']);
|
||||
$article = Article::factory()->create(['feed_id' => $feed->id]);
|
||||
ActivityLog::factory()->forSubject($article)->create(['message' => 'Published something']);
|
||||
|
||||
Livewire::test(Activity::class)->assertSee('VRT News');
|
||||
}
|
||||
|
||||
public function test_subjects_are_eager_loaded(): void
|
||||
{
|
||||
$feed = Feed::factory()->create();
|
||||
|
||||
foreach (range(1, 5) as $i) {
|
||||
$article = Article::factory()->create(['feed_id' => $feed->id]);
|
||||
ActivityLog::factory()->forSubject($article)->create();
|
||||
}
|
||||
|
||||
DB::enableQueryLog();
|
||||
Livewire::test(Activity::class);
|
||||
$queries = count(DB::getQueryLog());
|
||||
DB::disableQueryLog();
|
||||
|
||||
$this->assertLessThan(10, $queries);
|
||||
}
|
||||
|
||||
public function test_a_reason_in_context_is_shown_under_the_message(): void
|
||||
{
|
||||
ActivityLog::factory()->create([
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ public function test_latest_first_breaks_ties_on_id(): void
|
|||
public function test_subject_resolves_to_the_related_model(): void
|
||||
{
|
||||
$article = Article::factory()->create();
|
||||
$log = ActivityLog::factory()->for_subject($article)->create();
|
||||
$log = ActivityLog::factory()->forSubject($article)->create();
|
||||
|
||||
$this->assertInstanceOf(Article::class, $log->subject);
|
||||
$this->assertSame($article->id, $log->subject->id);
|
||||
|
|
|
|||
Loading…
Reference in a new issue