Fix: Address 'Too few arguments' error in settings catalog view
This commit is contained in:
parent
79636c13c5
commit
06382aed01
@ -0,0 +1,160 @@
|
||||
@php
|
||||
use Illuminate\Support\Str;
|
||||
use function Filament\Support\evaluate;
|
||||
|
||||
// Normalize incoming state from Filament ViewEntry. Accept multiple shapes:
|
||||
// - $groups passed directly
|
||||
// - $state as array with ['groups' => [...]]
|
||||
// - $state as JSON string
|
||||
// - $state as a Closure
|
||||
$groups = [];
|
||||
$searchQuery = $searchQuery ?? '';
|
||||
|
||||
// If $state is a closure, resolve it first.
|
||||
$state = evaluate($state);
|
||||
|
||||
if (isset($groups) && is_array($groups) && count($groups) > 0) {
|
||||
// $groups already provided by caller
|
||||
// leave as-is
|
||||
} elseif (isset($state)) {
|
||||
if (is_string($state) && Str::startsWith(trim($state), '{')) {
|
||||
$decoded = json_decode($state, true);
|
||||
if (is_array($decoded)) {
|
||||
$groups = $decoded['groups'] ?? $decoded;
|
||||
}
|
||||
} elseif (is_array($state)) {
|
||||
$groups = $state['groups'] ?? $state;
|
||||
} elseif (is_object($state)) {
|
||||
$arr = (array) $state;
|
||||
$groups = $arr['groups'] ?? $arr;
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure groups is an array
|
||||
if (! is_array($groups)) {
|
||||
$groups = [];
|
||||
}
|
||||
@endphp
|
||||
|
||||
<div class="space-y-4">
|
||||
@if(empty($groups))
|
||||
<div class="text-center py-8">
|
||||
<p class="text-gray-500 dark:text-gray-400">No settings available</p>
|
||||
</div>
|
||||
@else
|
||||
@foreach($groups as $groupIndex => $group)
|
||||
@php
|
||||
// Filter settings by search query
|
||||
$filteredSettings = collect($group['settings'] ?? [])->filter(function($setting) use ($searchQuery) {
|
||||
if (empty($searchQuery)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$searchLower = strtolower($searchQuery);
|
||||
return str_contains(strtolower($setting['label'] ?? ''), $searchLower) ||
|
||||
str_contains(strtolower($setting['value_display'] ?? ''), $searchLower);
|
||||
})->all();
|
||||
|
||||
$settingCount = count($filteredSettings);
|
||||
@endphp
|
||||
|
||||
@if($settingCount > 0)
|
||||
<x-filament::section
|
||||
:heading="$group['title'] ?? 'Settings'"
|
||||
:description="$group['description'] ?? null"
|
||||
collapsible
|
||||
:collapsed="$groupIndex > 0"
|
||||
>
|
||||
<x-slot name="headerEnd">
|
||||
<span class="text-sm text-gray-500 dark:text-gray-400">
|
||||
{{ $settingCount }} {{ Str::plural('setting', $settingCount) }}
|
||||
</span>
|
||||
</x-slot>
|
||||
|
||||
<div class="space-y-3">
|
||||
@foreach($filteredSettings as $setting)
|
||||
<div class="flex items-start justify-between py-2 border-b border-gray-200 dark:border-gray-700 last:border-0">
|
||||
<div class="flex-1 pr-4">
|
||||
<div class="flex items-center gap-2">
|
||||
<span class="font-medium text-gray-900 dark:text-gray-100">
|
||||
{{ $setting['label'] }}
|
||||
</span>
|
||||
|
||||
@if($setting['is_fallback'] ?? false)
|
||||
<x-filament::badge color="warning" size="sm">
|
||||
Definition not cached
|
||||
</x-filament::badge>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if(!empty($setting['help_text']))
|
||||
<p class="text-sm text-gray-600 dark:text-gray-400 mt-1">
|
||||
{{ Str::limit($setting['help_text'], 200) }}
|
||||
</p>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-2">
|
||||
<div class="text-right">
|
||||
@if(is_bool($setting['value_raw']))
|
||||
<x-filament::badge :color="$setting['value_raw'] ? 'success' : 'gray'">
|
||||
{{ $setting['value_display'] }}
|
||||
</x-filament::badge>
|
||||
@elseif(is_int($setting['value_raw']))
|
||||
<span class="font-mono text-sm text-gray-900 dark:text-gray-100">
|
||||
{{ $setting['value_display'] }}
|
||||
</span>
|
||||
@else
|
||||
<span class="text-sm text-gray-900 dark:text-gray-100">
|
||||
{{ $setting['value_display'] }}
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if(strlen($setting['value_display'] ?? '') > 50)
|
||||
<button
|
||||
type="button"
|
||||
x-data="{ copied: false }"
|
||||
x-on:click="
|
||||
navigator.clipboard.writeText('{{ addslashes($setting['value_display']) }}');
|
||||
copied = true;
|
||||
setTimeout(() => copied = false, 2000);
|
||||
"
|
||||
class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300"
|
||||
title="Copy value"
|
||||
>
|
||||
<svg x-show="!copied" class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"/>
|
||||
</svg>
|
||||
<svg x-show="copied" class="w-4 h-4 text-success-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"/>
|
||||
</svg>
|
||||
</button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</x-filament::section>
|
||||
@endif
|
||||
@endforeach
|
||||
|
||||
@if(collect($groups)->sum(fn($g) => count(collect($g['settings'] ?? [])->filter(function($s) use ($searchQuery) {
|
||||
if (empty($searchQuery)) return true;
|
||||
$searchLower = strtolower($searchQuery);
|
||||
return str_contains(strtolower($s['label'] ?? ''), $searchLower) ||
|
||||
str_contains(strtolower($s['value_display'] ?? ''), $searchLower);
|
||||
}))) === 0)
|
||||
<div class="text-center py-8">
|
||||
<p class="text-gray-500 dark:text-gray-400">No settings match your search</p>
|
||||
<button
|
||||
type="button"
|
||||
wire:click="$set('search', '')"
|
||||
class="mt-2 text-sm text-primary-600 hover:text-primary-700 dark:text-primary-400"
|
||||
>
|
||||
Clear search
|
||||
</button>
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
</div>
|
||||
Loading…
Reference in New Issue
Block a user