mirror of
https://github.com/pacnpal/thrillwiki_laravel.git
synced 2025-12-20 02:31:09 -05:00
feat: Implement Global Search component with caching and tests
This commit is contained in:
@@ -39,7 +39,7 @@
|
|||||||
"ghcr.io/github/github-mcp-server"
|
"ghcr.io/github/github-mcp-server"
|
||||||
],
|
],
|
||||||
"env": {
|
"env": {
|
||||||
"GITHUB_PERSONAL_ACCESS_TOKEN": "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",
|
"GITHUB_PERSONAL_ACCESS_TOKEN": "",
|
||||||
"GITHUB_TOOLSETS": "",
|
"GITHUB_TOOLSETS": "",
|
||||||
"GITHUB_READ_ONLY": ""
|
"GITHUB_READ_ONLY": ""
|
||||||
}
|
}
|
||||||
|
|||||||
54
app/Livewire/GlobalSearchComponent.php
Normal file
54
app/Livewire/GlobalSearchComponent.php
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
# Active Context - Current Session Status
|
# Active Context - Current Session Status
|
||||||
|
|
||||||
**Date**: June 22, 2025
|
**Date**: June 23, 2025
|
||||||
**Time**: 7:48 PM
|
**Time**: 8:10 AM EST
|
||||||
**Status**: ✅ **RIDE CRUD SYSTEM IMPLEMENTATION COMPLETE**
|
**Status**: 🔍 **GLOBAL SEARCH SYSTEM IMPLEMENTATION IN PROGRESS**
|
||||||
|
|
||||||
## ✅ **CURRENT SESSION SUMMARY**
|
## 🎯 **CURRENT SESSION SUMMARY**
|
||||||
|
|
||||||
### **Task: Implement Ride CRUD System Using ThrillWiki Generators**
|
### **Task: Implement Global Search System Using ThrillWiki Generators**
|
||||||
**Result**: ✅ **100% SUCCESSFUL - ALL OBJECTIVES ACHIEVED**
|
**Result**: 🔄 **IN PROGRESS - STARTING IMPLEMENTATION**
|
||||||
|
|
||||||
### **What Was Accomplished**
|
### **What Was Accomplished**
|
||||||
1. ✅ **CRUD System Generated** - Complete Ride CRUD with API using `php artisan make:thrillwiki-crud Ride --api --with-tests`
|
1. ✅ **CRUD System Generated** - Complete Ride CRUD with API using `php artisan make:thrillwiki-crud Ride --api --with-tests`
|
||||||
|
|||||||
31
resources/views/livewire/autocomplete-component.blade.php
Normal file
31
resources/views/livewire/autocomplete-component.blade.php
Normal 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>
|
||||||
31
resources/views/livewire/global-search-component.blade.php
Normal file
31
resources/views/livewire/global-search-component.blade.php
Normal 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>
|
||||||
35
tests/Feature/Livewire/AutocompleteComponentTest.php
Normal file
35
tests/Feature/Livewire/AutocompleteComponentTest.php
Normal 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');
|
||||||
|
}
|
||||||
|
}
|
||||||
35
tests/Feature/Livewire/GlobalSearchComponentTest.php
Normal file
35
tests/Feature/Livewire/GlobalSearchComponentTest.php
Normal 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');
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user