142 lines
7.4 KiB
PHP
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">…</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>
|