feat: Implement Global Search component with caching and tests

This commit is contained in:
pacnpal
2025-06-23 08:12:56 -04:00
parent bd08111971
commit ecf237d592
7 changed files with 193 additions and 7 deletions

View File

@@ -39,7 +39,7 @@
"ghcr.io/github/github-mcp-server"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "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",
"GITHUB_PERSONAL_ACCESS_TOKEN": "",
"GITHUB_TOOLSETS": "",
"GITHUB_READ_ONLY": ""
}

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Livewire;
use Livewire\Component;
use Illuminate\Support\Facades\Cache;
class GlobalSearchComponent extends Component
{
/**
* Component initialization
*/
public function mount(): void
{
// Initialize component state
}
/**
* Render the component
*/
public function render()
{
return view('livewire.global-search-component');
}
/**
* Get cache key for this component
*/
protected function getCacheKey(string $suffix = ''): string
{
return 'thrillwiki.' . class_basename(static::class) . '.' . $suffix;
}
/**
* Remember data with caching
*/
protected function remember(string $key, $callback, int $ttl = 3600)
{
return Cache::remember($this->getCacheKey($key), $ttl, $callback);
}
/**
* Invalidate component cache
*/
protected function invalidateCache(string $key = null): void
{
if ($key) {
Cache::forget($this->getCacheKey($key));
} else {
// Clear all cache for this component
Cache::flush();
}
}
}

View File

@@ -1,13 +1,13 @@
# Active Context - Current Session Status
**Date**: June 22, 2025
**Time**: 7:48 PM
**Status**: **RIDE CRUD SYSTEM IMPLEMENTATION COMPLETE**
**Date**: June 23, 2025
**Time**: 8:10 AM EST
**Status**: 🔍 **GLOBAL SEARCH SYSTEM IMPLEMENTATION IN PROGRESS**
## **CURRENT SESSION SUMMARY**
## 🎯 **CURRENT SESSION SUMMARY**
### **Task: Implement Ride CRUD System Using ThrillWiki Generators**
**Result**: **100% SUCCESSFUL - ALL OBJECTIVES ACHIEVED**
### **Task: Implement Global Search System Using ThrillWiki Generators**
**Result**: 🔄 **IN PROGRESS - STARTING IMPLEMENTATION**
### **What Was Accomplished**
1. ✅ **CRUD System Generated** - Complete Ride CRUD with API using `php artisan make:thrillwiki-crud Ride --api --with-tests`

View File

@@ -0,0 +1,31 @@
{{-- ThrillWiki Reusable Component: AutocompleteComponent --}}
<div class="thrillwiki-component"
x-data="{ loading: false }"
wire:loading.class="opacity-50">
{{-- Component Header --}}
<div class="component-header mb-4">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">
AutocompleteComponent
</h3>
</div>
{{-- Component Content --}}
<div class="component-content">
<p class="text-gray-600 dark:text-gray-400">
ThrillWiki component content goes here.
</p>
{{-- Example interactive element --}}
<button wire:click="$refresh"
class="mt-4 px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors">
Refresh Component
</button>
</div>
{{-- Loading State --}}
<div wire:loading wire:target="$refresh"
class="absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center">
<div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div>
</div>
</div>

View File

@@ -0,0 +1,31 @@
{{-- ThrillWiki Reusable Component: GlobalSearchComponent --}}
<div class="thrillwiki-component"
x-data="{ loading: false }"
wire:loading.class="opacity-50">
{{-- Component Header --}}
<div class="component-header mb-4">
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">
GlobalSearchComponent
</h3>
</div>
{{-- Component Content --}}
<div class="component-content">
<p class="text-gray-600 dark:text-gray-400">
ThrillWiki component content goes here.
</p>
{{-- Example interactive element --}}
<button wire:click="$refresh"
class="mt-4 px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors">
Refresh Component
</button>
</div>
{{-- Loading State --}}
<div wire:loading wire:target="$refresh"
class="absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center">
<div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div>
</div>
</div>

View File

@@ -0,0 +1,35 @@
<?php
namespace Tests\Feature\Livewire;
use App\Livewire\AutocompleteComponent;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;
use Tests\TestCase;
class AutocompleteComponentTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function component_can_render(): void
{
Livewire::test(AutocompleteComponent::class)
->assertStatus(200)
->assertSee('AutocompleteComponent');
}
/** @test */
public function component_can_mount_successfully(): void
{
Livewire::test(AutocompleteComponent::class)
->assertStatus(200);
}
/** @test */
public function component_follows_thrillwiki_patterns(): void
{
Livewire::test(AutocompleteComponent::class)
->assertViewIs('livewire.autocomplete-component');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Tests\Feature\Livewire;
use App\Livewire\GlobalSearchComponent;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;
use Tests\TestCase;
class GlobalSearchComponentTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function component_can_render(): void
{
Livewire::test(GlobalSearchComponent::class)
->assertStatus(200)
->assertSee('GlobalSearchComponent');
}
/** @test */
public function component_can_mount_successfully(): void
{
Livewire::test(GlobalSearchComponent::class)
->assertStatus(200);
}
/** @test */
public function component_follows_thrillwiki_patterns(): void
{
Livewire::test(GlobalSearchComponent::class)
->assertViewIs('livewire.global-search-component');
}
}