Add User Guide functionality: Created UserGuide page and GuideService to manage and display user guides. Implemented localization for user guide labels and integrated a search feature for easy navigation. Added markdown support for guide content and established a structured layout for guide selection and display.

This commit is contained in:
Ümit Tunç
2025-11-03 17:08:15 -03:00
parent 6a5e26638c
commit f9730a64f7
9 changed files with 786 additions and 209 deletions
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace App\Filament\Admin\Pages;
use App\Services\GuideService;
use BackedEnum;
use Filament\Pages\Page;
use Filament\Support\Icons\Heroicon;
class UserGuide extends Page
{
protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedBookOpen;
protected string $view = 'filament.admin.pages.user-guide';
protected static ?int $navigationSort = 999;
public ?string $selectedGuide = null;
public function mount(): void
{
$guideService = app(GuideService::class);
$firstGuide = $guideService->getFirstGuide();
if ($firstGuide) {
$this->selectedGuide = $firstGuide['slug'];
}
}
public static function getNavigationLabel(): string
{
return __('user-guide.navigation_label');
}
public function getTitle(): string
{
return __('user-guide.title');
}
public function getGuides(): array
{
$guideService = app(GuideService::class);
return $guideService->getAllGuides();
}
public function getSelectedGuideContent(): ?array
{
if (!$this->selectedGuide) {
return null;
}
$guideService = app(GuideService::class);
return $guideService->getGuide($this->selectedGuide);
}
public function selectGuide(string $slug): void
{
$guideService = app(GuideService::class);
if ($guideService->guideExists($slug)) {
$this->selectedGuide = $slug;
}
}
}
+108
View File
@@ -0,0 +1,108 @@
<?php
namespace App\Services;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
class GuideService
{
/**
* Guide dosyalarının bulunduğu dizin
*/
protected string $guidePath;
public function __construct()
{
$this->guidePath = resource_path('views/guide');
}
/**
* Tüm markdown dosyalarını son güncellenme tarihine göre sıralı olarak getir
*
* @return array
*/
public function getAllGuides(): array
{
if (!File::exists($this->guidePath)) {
return [];
}
$files = File::glob($this->guidePath . '/*.md');
$guides = [];
foreach ($files as $file) {
$filename = File::basename($file);
$name = Str::before($filename, '.md');
$modifiedTime = File::lastModified($file);
$guides[] = [
'filename' => $filename,
'name' => $name,
'slug' => Str::slug($name),
'path' => $file,
'modified_time' => $modifiedTime,
'modified_date' => date('Y-m-d H:i:s', $modifiedTime),
];
}
// Son güncellenenden ilk güncellenene göre sırala
usort($guides, function ($a, $b) {
return $b['modified_time'] <=> $a['modified_time'];
});
return $guides;
}
/**
* Belirli bir guide dosyasını getir
*
* @param string $slug
* @return array|null
*/
public function getGuide(string $slug): ?array
{
$guides = $this->getAllGuides();
foreach ($guides as $guide) {
if ($guide['slug'] === $slug) {
$guide['content'] = File::get($guide['path']);
return $guide;
}
}
return null;
}
/**
* İlk guide'ı getir (varsayılan olarak gösterilecek)
*
* @return array|null
*/
public function getFirstGuide(): ?array
{
$guides = $this->getAllGuides();
if (empty($guides)) {
return null;
}
$firstGuide = $guides[0];
$firstGuide['content'] = File::get($firstGuide['path']);
return $firstGuide;
}
/**
* Guide dosyasının var olup olmadığını kontrol et
*
* @param string $slug
* @return bool
*/
public function guideExists(string $slug): bool
{
return $this->getGuide($slug) !== null;
}
}