Compare commits

...

5 commits

Author SHA1 Message Date
4b0d17e2ae Fix flaky boundary test with freezeTime
All checks were successful
CI / ci (push) Successful in 5m36s
CI / ci (pull_request) Successful in 16m47s
Build and Push Docker Image / build (push) Successful in 4m15s
2026-03-18 21:54:20 +01:00
ff855facda Fix flaky test from duplicate Article factory URLs
Some checks failed
CI / ci (push) Successful in 5m14s
CI / ci (pull_request) Failing after 5m13s
2026-03-18 21:39:22 +01:00
a7317e376f 103 - Move notification bell to page header component
Some checks failed
CI / ci (push) Failing after 6m32s
CI / ci (pull_request) Successful in 5m35s
2026-03-18 21:27:14 +01:00
3d58baf156 102 - Fix route modals hidden behind overlay 2026-03-18 20:58:35 +01:00
268bbfd05a 101 - Fix cramped number inputs on Settings page 2026-03-18 20:52:49 +01:00
10 changed files with 31 additions and 48 deletions

View file

@ -20,7 +20,7 @@ public function definition(): array
{
return [
'feed_id' => Feed::factory(),
'url' => $this->faker->url(),
'url' => $this->faker->unique()->url(),
'title' => $this->faker->sentence(),
'description' => $this->faker->paragraph(),
'content' => $this->faker->paragraphs(3, true),

View file

@ -0,0 +1,16 @@
@props(['title', 'subtitle' => null])
<div class="mb-8 flex items-start justify-between">
<div>
<h1 class="text-2xl font-bold text-gray-900">{{ $title }}</h1>
@if ($subtitle)
<p class="mt-1 text-sm text-gray-500">{{ $subtitle }}</p>
@endif
</div>
<div class="flex items-center space-x-3">
{{ $slot }}
<div class="hidden lg:block">
<livewire:notification-bell />
</div>
</div>
</div>

View file

@ -66,9 +66,6 @@ class="p-2 rounded-md text-gray-400 hover:text-gray-600 hover:bg-gray-100"
<nav class="mt-5 flex-1 px-2 bg-white">
@include('layouts.navigation-items')
</nav>
<div class="flex-shrink-0 px-4 py-3 border-t border-gray-200">
<livewire:notification-bell />
</div>
<div class="flex-shrink-0 p-4 border-t border-gray-200">
<div class="flex items-center">
<div class="flex-1 min-w-0">

View file

@ -1,11 +1,5 @@
<div class="p-6">
<div class="mb-6 flex items-start justify-between">
<div>
<h1 class="text-2xl font-bold text-gray-900">Articles</h1>
<p class="mt-1 text-sm text-gray-500">
Review and manage article routing
</p>
</div>
<x-page-header title="Articles" subtitle="Review and manage article routing">
<button
wire:click="refresh"
wire:loading.attr="disabled"
@ -19,7 +13,7 @@ class="inline-flex items-center px-4 py-2 border border-transparent text-sm font
<span wire:loading.remove wire:target="refresh">{{ $isRefreshing ? 'Refreshing...' : 'Refresh' }}</span>
<span wire:loading wire:target="refresh">Refreshing...</span>
</button>
</div>
</x-page-header>
{{-- Tab bar --}}
<div class="mb-6 border-b border-gray-200">

View file

@ -1,10 +1,5 @@
<div class="p-6">
<div class="mb-8">
<h1 class="text-2xl font-bold text-gray-900">Channels</h1>
<p class="mt-1 text-sm text-gray-500">
Manage your platform channels and linked accounts
</p>
</div>
<x-page-header title="Channels" subtitle="Manage your platform channels and linked accounts" />
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
@forelse ($channels as $channel)

View file

@ -1,10 +1,5 @@
<div class="p-6">
<div class="mb-8">
<h1 class="text-2xl font-bold text-gray-900">Dashboard</h1>
<p class="mt-1 text-sm text-gray-500">
Overview of your feed management system
</p>
</div>
<x-page-header title="Dashboard" subtitle="Overview of your feed management system" />
<!-- System Statistics -->
<div class="mb-8">

View file

@ -1,10 +1,5 @@
<div class="p-6">
<div class="mb-8">
<h1 class="text-2xl font-bold text-gray-900">Feeds</h1>
<p class="mt-1 text-sm text-gray-500">
Manage your news feed sources
</p>
</div>
<x-page-header title="Feeds" subtitle="Manage your news feed sources" />
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
@forelse ($feeds as $feed)

View file

@ -1,11 +1,5 @@
<div class="p-6">
<div class="mb-8 flex items-center justify-between">
<div>
<h1 class="text-2xl font-bold text-gray-900">Routes</h1>
<p class="mt-1 text-sm text-gray-500">
Manage connections between your feeds and channels
</p>
</div>
<x-page-header title="Routes" subtitle="Manage connections between your feeds and channels">
<button
wire:click="openCreateModal"
class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"
@ -15,7 +9,7 @@ class="inline-flex items-center px-4 py-2 border border-transparent text-sm font
</svg>
Create Route
</button>
</div>
</x-page-header>
<div class="space-y-6">
@forelse ($routes as $route)
@ -156,7 +150,7 @@ class="inline-flex items-center px-4 py-2 border border-transparent text-sm font
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
<div class="inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6">
<div class="relative z-10 inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6">
<h3 class="text-lg font-medium text-gray-900 mb-4">Create New Route</h3>
<form wire:submit="createRoute" class="space-y-4">
<div>
@ -238,7 +232,7 @@ class="px-4 py-2 text-sm font-medium text-white bg-blue-600 border border-transp
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
<div class="inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6">
<div class="relative z-10 inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full sm:p-6">
<div class="flex items-center justify-between mb-4">
<h3 class="text-lg font-medium text-gray-900">Edit Route</h3>
<button wire:click="closeEditModal" class="text-gray-400 hover:text-gray-600">

View file

@ -1,10 +1,5 @@
<div class="p-6" x-data x-on:clear-message.window="setTimeout(() => $wire.clearMessages(), 3000)">
<div class="mb-8">
<h1 class="text-2xl font-bold text-gray-900">Settings</h1>
<p class="mt-1 text-sm text-gray-500">
Configure your system preferences
</p>
</div>
<x-page-header title="Settings" subtitle="Configure your system preferences" />
<div class="space-y-6">
<!-- Article Processing Settings -->
@ -63,7 +58,7 @@ class="flex-shrink-0"
min="0"
max="1440"
step="1"
class="w-20 rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm"
class="w-24 rounded-md border-gray-300 px-3 py-2 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm"
/>
<button
wire:click="updateArticlePublishingInterval"
@ -133,7 +128,7 @@ class="flex-shrink-0"
wire:model="feedStalenessThreshold"
min="0"
step="1"
class="w-20 rounded-md border-gray-300 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 sm:text-sm"
class="w-24 rounded-md border-gray-300 px-3 py-2 shadow-sm focus:border-indigo-500 focus:ring-indigo-500 text-sm"
/>
<button
wire:click="updateFeedStalenessThreshold"

View file

@ -100,6 +100,8 @@ public function test_cascade_deletes_route_articles(): void
public function test_preserves_article_at_exact_retention_boundary(): void
{
$this->freezeTime();
$boundary = Article::factory()->for(Feed::factory())->create([
'created_at' => now()->subDays(30),
]);