Files
2026-03-20 14:20:43 -07:00

142 lines
7.4 KiB
PHP

<x-filament-panels::page wire:init="loadCategories">
@if(!$categoriesLoaded)
<x-filament::section>
<div class="flex items-center justify-center gap-2 py-12">
<x-filament::loading-indicator class="h-5 w-5 text-gray-400 dark:text-gray-500" />
<span class="text-sm text-gray-500 dark:text-gray-400">{{ trans('blockland-config::blockland-config.loading_categories') }}</span>
</div>
</x-filament::section>
@else
<div class="space-y-8">
<div class="flex flex-col gap-8">
{{-- Warning banner --}}
<div class="rounded-xl border border-amber-400/30 dark:border-amber-500/30 bg-amber-50 dark:bg-amber-950/30 px-6 py-4 flex items-start gap-4 shrink-0">
<x-filament::icon icon="tabler-alert-triangle" class="h-5 w-5 text-amber-500 dark:text-amber-400 shrink-0 mt-0.5" />
<p class="text-sm text-amber-800 dark:text-amber-200">
{{ trans('blockland-config::blockland-config.browser.warning') }}
</p>
</div>
{{-- Category & search filters --}}
<div>
{{ $this->form }}
</div>
<div class="relative min-h-[12rem]">
<div wire:loading.delay.shortest class="block w-full">
<x-filament::section>
<div class="flex items-center justify-center gap-2 py-12">
<x-filament::loading-indicator class="h-5 w-5 text-gray-400 dark:text-gray-500" />
<span class="text-sm text-gray-500 dark:text-gray-400">{{ trans('blockland-config::blockland-config.browser.searching_addons') }}</span>
</div>
</x-filament::section>
</div>
<div wire:loading.remove.delay.shortest>
@if($this->selectedCategory || $this->search !== '')
@php $paginated = $this->getPaginatedData(); @endphp
<x-filament::section>
<x-slot name="afterHeader">
<div class="flex items-center justify-between gap-4 flex-wrap w-full">
<p class="text-sm text-gray-500 dark:text-gray-400">{{ trans('blockland-config::blockland-config.browser.showing_count', ['count' => $paginated['total']]) }}</p>
<div class="flex items-center gap-3">
<label for="perPage" class="text-sm font-medium text-gray-950 dark:text-white">{{ trans('blockland-config::blockland-config.browser.per_page') }}</label>
<x-filament::input.wrapper class="!w-auto min-w-[5rem]">
<x-filament::input.select wire:model.live="perPage" id="perPage">
<option value="10">10</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="100">100</option>
</x-filament::input.select>
</x-filament::input.wrapper>
</div>
</div>
</x-slot>
@if(count($paginated['items']) > 0)
<div class="divide-y divide-transparent dark:divide-white/10">
@foreach($paginated['items'] as $addOn)
<div class="flex items-center justify-between py-4 gap-4" wire:key="addon-{{ md5($addOn['filename']) }}">
<div class="flex-1 min-w-0">
<p class="text-sm font-medium text-gray-950 dark:text-white truncate">{{ $addOn['name'] }}</p>
@if($addOn['size'])
<p class="text-xs text-gray-500 dark:text-gray-400">{{ $addOn['size'] }}</p>
@endif
</div>
<x-filament::button
size="sm"
color="gray"
outlined
icon="tabler-download"
wire:click="installAddOn('{{ $addOn['url'] }}', '{{ $addOn['filename'] }}', '{{ addslashes($addOn['name']) }}')"
wire:loading.attr="disabled"
wire:target="installAddOn"
>
{{ trans('blockland-config::blockland-config.browser.install') }}
</x-filament::button>
</div>
@endforeach
</div>
@if($paginated['lastPage'] > 1)
<div class="pt-4 mt-4 border-t border-transparent dark:border-white/10 flex items-center justify-between gap-4">
<p class="text-sm text-gray-500 dark:text-gray-400">
{{ trans('blockland-config::blockland-config.browser.showing_range', [
'from' => $paginated['from'],
'to' => $paginated['to'],
'total' => $paginated['total'],
]) }}
</p>
<div class="flex items-center gap-1">
<x-filament::icon-button
icon="tabler-chevron-left"
color="gray"
wire:click="previousPage"
:disabled="$paginated['page'] <= 1"
/>
@for($p = 1; $p <= $paginated['lastPage']; $p++)
@if($paginated['lastPage'] <= 7 || $p <= 2 || $p >= $paginated['lastPage'] - 1 || abs($p - $paginated['page']) <= 1)
<x-filament::button
:color="$p === $paginated['page'] ? 'primary' : 'gray'"
:outlined="$p !== $paginated['page']"
size="sm"
wire:click="goToPage({{ $p }})"
class="!px-3 !py-1 min-w-[2rem]"
>
{{ $p }}
</x-filament::button>
@elseif($p === 3 || $p === $paginated['lastPage'] - 2)
<span class="px-2 text-sm text-gray-400 dark:text-gray-500">&hellip;</span>
@endif
@endfor
<x-filament::icon-button
icon="tabler-chevron-right"
color="gray"
wire:click="nextPage"
:disabled="$paginated['page'] >= $paginated['lastPage']"
/>
</div>
</div>
@endif
@else
<x-filament::empty-state
icon="tabler-package-off"
:heading="trans('blockland-config::blockland-config.browser.no_addons')"
/>
@endif
</x-filament::section>
@else
<x-filament::empty-state
icon="tabler-package"
:heading="trans('blockland-config::blockland-config.browser.select_category_or_search_prompt')"
/>
@endif
</div>
</div>
</div>
</div>
@endif
</x-filament-panels::page>