intial push
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
<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>
|
||||
@@ -0,0 +1,16 @@
|
||||
<x-filament-panels::page wire:init="loadAddOns">
|
||||
@if(!$addOnsLoaded)
|
||||
<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_addons') }}</span>
|
||||
</div>
|
||||
</x-filament::section>
|
||||
@else
|
||||
<div class="space-y-8">
|
||||
<div class="flex flex-col gap-10">
|
||||
{{ $this->form }}
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</x-filament-panels::page>
|
||||
@@ -0,0 +1,121 @@
|
||||
<x-filament-panels::page wire:init="loadAdmins">
|
||||
@if(!$adminsLoaded)
|
||||
<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_admins') }}</span>
|
||||
</div>
|
||||
</x-filament::section>
|
||||
@else
|
||||
<div class="flex flex-col gap-6">
|
||||
|
||||
{{-- Confirmation modal popup --}}
|
||||
@if($this->confirmingDemote || $this->confirmingRemove)
|
||||
<div
|
||||
class="fixed inset-0 z-50 flex items-center justify-center p-4"
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
@keydown.escape.window="$wire.cancelConfirm()"
|
||||
>
|
||||
<div
|
||||
class="absolute inset-0 bg-black/50"
|
||||
wire:click="cancelConfirm"
|
||||
></div>
|
||||
<div class="relative z-10 w-full max-w-md rounded-xl bg-white dark:bg-gray-900 shadow-xl dark:ring-1 dark:ring-white/10 p-6 text-center">
|
||||
@if($this->confirmingDemote)
|
||||
<p class="text-sm text-gray-700 dark:text-gray-300 mb-8">
|
||||
{{ trans('blockland-config::blockland-config.admins.confirm_demote', ['bl_id' => $demoteBlId]) }}
|
||||
</p>
|
||||
@else
|
||||
<p class="text-sm text-gray-700 dark:text-gray-300 mb-8">
|
||||
{{ trans('blockland-config::blockland-config.admins.confirm_remove', ['bl_id' => $this->confirmingRemove['blId'], 'role' => $this->confirmingRemove['list'] === 'super' ? trans('blockland-config::blockland-config.admins.super_admins') : trans('blockland-config::blockland-config.admins.admins')]) }}
|
||||
</p>
|
||||
@endif
|
||||
<div class="flex justify-center gap-3">
|
||||
<x-filament::button color="gray" outlined icon="tabler-x" wire:click="cancelConfirm">
|
||||
{{ trans('blockland-config::blockland-config.admins.cancel') }}
|
||||
</x-filament::button>
|
||||
@if($this->confirmingDemote)
|
||||
<x-filament::button color="danger" icon="tabler-user-minus" wire:click="demoteByBlId" wire:loading.attr="disabled">
|
||||
{{ trans('blockland-config::blockland-config.admins.demote') }}
|
||||
</x-filament::button>
|
||||
@else
|
||||
<x-filament::button color="danger" icon="tabler-user-minus" wire:click="confirmRemoveFromList" wire:loading.attr="disabled">
|
||||
{{ trans('blockland-config::blockland-config.admins.remove') }}
|
||||
</x-filament::button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- Add by BL_ID --}}
|
||||
<x-filament::section :heading="trans('blockland-config::blockland-config.admins.add_by_blid')">
|
||||
<div class="space-y-6">
|
||||
<div>
|
||||
{{ $this->addForm }}
|
||||
</div>
|
||||
<div class="mt-8 pt-6">
|
||||
<x-filament::button icon="tabler-plus" wire:click="addByBlId" wire:loading.attr="disabled">
|
||||
{{ trans('blockland-config::blockland-config.admins.add') }}
|
||||
</x-filament::button>
|
||||
</div>
|
||||
</div>
|
||||
</x-filament::section>
|
||||
|
||||
{{-- Demote by BL_ID --}}
|
||||
<x-filament::section
|
||||
:heading="trans('blockland-config::blockland-config.admins.demote_by_blid')"
|
||||
:description="trans('blockland-config::blockland-config.admins.demote_by_blid_hint')"
|
||||
>
|
||||
<div class="space-y-6">
|
||||
<div>
|
||||
{{ $this->demoteForm }}
|
||||
</div>
|
||||
<div class="mt-8 pt-6">
|
||||
<x-filament::button color="danger" icon="tabler-user-minus" wire:click="askConfirmDemote" wire:loading.attr="disabled">
|
||||
{{ trans('blockland-config::blockland-config.admins.demote') }}
|
||||
</x-filament::button>
|
||||
</div>
|
||||
</div>
|
||||
</x-filament::section>
|
||||
|
||||
{{-- Super Admins --}}
|
||||
<x-filament::section :heading="trans('blockland-config::blockland-config.admins.super_admins')" collapsible collapsed>
|
||||
@if(count($this->superAdmins) > 0)
|
||||
<div class="divide-y divide-transparent dark:divide-white/10">
|
||||
@foreach($this->superAdmins as $blId)
|
||||
<div class="flex items-center justify-between py-4 gap-4">
|
||||
<span class="text-sm text-gray-950 dark:text-white">BL_ID {{ $blId }}</span>
|
||||
<x-filament::button color="danger" size="sm" icon="tabler-user-minus" wire:click="askRemoveFromList('{{ $blId }}', 'super')" wire:loading.attr="disabled">
|
||||
{{ trans('blockland-config::blockland-config.admins.remove') }}
|
||||
</x-filament::button>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@else
|
||||
<p class="text-sm text-gray-500 dark:text-gray-400">{{ trans('blockland-config::blockland-config.admins.no_super_admins') }}</p>
|
||||
@endif
|
||||
</x-filament::section>
|
||||
|
||||
{{-- Admins --}}
|
||||
<x-filament::section :heading="trans('blockland-config::blockland-config.admins.admins')" collapsible collapsed>
|
||||
@if(count($this->admins) > 0)
|
||||
<div class="divide-y divide-transparent dark:divide-white/10">
|
||||
@foreach($this->admins as $blId)
|
||||
<div class="flex items-center justify-between py-4 gap-4">
|
||||
<span class="text-sm text-gray-950 dark:text-white">BL_ID: {{ $blId }}</span>
|
||||
<x-filament::button color="danger" size="sm" icon="tabler-user-minus" wire:click="askRemoveFromList('{{ $blId }}', 'admin')" wire:loading.attr="disabled">
|
||||
{{ trans('blockland-config::blockland-config.admins.remove') }}
|
||||
</x-filament::button>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@else
|
||||
<p class="text-sm text-gray-500 dark:text-gray-400">{{ trans('blockland-config::blockland-config.admins.no_admins') }}</p>
|
||||
@endif
|
||||
</x-filament::section>
|
||||
|
||||
</div>
|
||||
@endif
|
||||
</x-filament-panels::page>
|
||||
@@ -0,0 +1,46 @@
|
||||
<x-filament-panels::page wire:init="loadColorSet">
|
||||
@if(!$colorSetLoaded)
|
||||
<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_colorset') }}</span>
|
||||
</div>
|
||||
</x-filament::section>
|
||||
@else
|
||||
<div class="flex flex-col gap-6">
|
||||
{{-- Color count summary --}}
|
||||
<x-filament::section>
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex items-center gap-2">
|
||||
<x-filament::icon icon="tabler-palette" class="h-5 w-5 text-primary-500 dark:text-primary-400 shrink-0" />
|
||||
<span class="text-sm font-medium text-gray-950 dark:text-white">{{ trans('blockland-config::blockland-config.colorset.active_palette') }}</span>
|
||||
</div>
|
||||
<span class="text-sm text-gray-500 dark:text-gray-400">{{ trans('blockland-config::blockland-config.colorset.color_count', ['count' => $this->totalColors, 'max' => 64]) }}</span>
|
||||
</div>
|
||||
</x-filament::section>
|
||||
|
||||
{{-- Swatch preview per section --}}
|
||||
@forelse($this->colorSetPreview as $section)
|
||||
<x-filament::section
|
||||
:heading="$section['label']"
|
||||
:description="count($section['colors']) . ' ' . (count($section['colors']) === 1 ? 'color' : 'colors')"
|
||||
>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
@foreach($section['colors'] as $color)
|
||||
<div
|
||||
class="shrink-0 w-10 h-10 rounded-lg border-0 dark:border dark:border-gray-600 shadow-sm"
|
||||
style="background-color: rgba({{ $color['r'] }}, {{ $color['g'] }}, {{ $color['b'] }}, {{ round($color['a'] / 255, 2) }});"
|
||||
title="R:{{ $color['r'] }} G:{{ $color['g'] }} B:{{ $color['b'] }} A:{{ $color['a'] }}"
|
||||
></div>
|
||||
@endforeach
|
||||
</div>
|
||||
</x-filament::section>
|
||||
@empty
|
||||
<x-filament::empty-state
|
||||
icon="tabler-palette-off"
|
||||
:heading="trans('blockland-config::blockland-config.colorset.no_colorset')"
|
||||
/>
|
||||
@endforelse
|
||||
</div>
|
||||
@endif
|
||||
</x-filament-panels::page>
|
||||
@@ -0,0 +1,16 @@
|
||||
<x-filament-panels::page wire:init="loadPrefs">
|
||||
@if(!$prefsLoaded)
|
||||
<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_prefs') }}</span>
|
||||
</div>
|
||||
</x-filament::section>
|
||||
@else
|
||||
<div class="space-y-8">
|
||||
<div class="flex flex-col gap-10">
|
||||
{{ $this->form }}
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</x-filament-panels::page>
|
||||
@@ -0,0 +1,100 @@
|
||||
<x-filament-panels::page wire:init="loadSaves">
|
||||
@if(!$savesLoaded)
|
||||
<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_saves') }}</span>
|
||||
</div>
|
||||
</x-filament::section>
|
||||
@else
|
||||
<div class="flex flex-col gap-6">
|
||||
{{-- Upload to Saves --}}
|
||||
<x-filament::section :heading="trans('blockland-config::blockland-config.save_loader.upload')" :description="trans('blockland-config::blockland-config.save_loader.upload_hint')">
|
||||
<div class="rounded-xl border-2 transition {{ $uploadedFile ? 'border-gray-200 bg-gray-50 px-6 py-4 dark:border-gray-700 dark:bg-gray-800/50' : 'border-dashed border-gray-300 dark:border-gray-600' }}">
|
||||
@if($uploadedFile)
|
||||
<div class="space-y-4">
|
||||
<div class="flex flex-wrap items-center justify-between gap-4">
|
||||
<label class="flex min-w-0 cursor-pointer items-center gap-3">
|
||||
<x-filament::icon icon="tabler-file" class="h-6 w-6 shrink-0 text-primary-500 dark:text-primary-400" />
|
||||
<div class="min-w-0">
|
||||
<p class="truncate text-sm font-medium text-gray-950 dark:text-white">{{ $uploadedFile->getClientOriginalName() }}</p>
|
||||
<span class="text-xs text-primary-500 hover:underline dark:text-primary-400">{{ trans('blockland-config::blockland-config.save_loader.upload_change') }}</span>
|
||||
</div>
|
||||
<input type="file" wire:model="uploadedFile" accept=".bls" class="absolute h-px w-px overflow-hidden opacity-0" aria-hidden="true" tabindex="-1" />
|
||||
</label>
|
||||
<x-filament::button icon="tabler-upload" wire:click="uploadSave" wire:loading.attr="disabled">
|
||||
{{ trans('blockland-config::blockland-config.save_loader.upload_button') }}
|
||||
</x-filament::button>
|
||||
</div>
|
||||
<div class="border-t border-gray-200 pt-4 dark:border-white/10">
|
||||
<p class="mb-2 text-xs text-gray-500 dark:text-gray-400">{{ trans('blockland-config::blockland-config.save_loader.upload_preview_optional') }}</p>
|
||||
@if($uploadedPreviewFile)
|
||||
<div class="flex items-center gap-3">
|
||||
<label class="flex min-w-0 flex-1 cursor-pointer items-center gap-3">
|
||||
<div class="flex h-6 w-8 shrink-0 items-center justify-center overflow-hidden rounded bg-gray-200 dark:bg-gray-700">
|
||||
<img src="{{ $uploadedPreviewFile->temporaryUrl() }}" alt="" class="h-full w-full object-cover" />
|
||||
</div>
|
||||
<div class="min-w-0">
|
||||
<p class="truncate text-sm font-medium text-gray-950 dark:text-white">{{ $uploadedPreviewFile->getClientOriginalName() }}</p>
|
||||
<span class="text-xs text-primary-500 hover:underline dark:text-primary-400">{{ trans('blockland-config::blockland-config.save_loader.upload_preview_change') }}</span>
|
||||
</div>
|
||||
<input type="file" wire:model="uploadedPreviewFile" accept=".jpg,.jpeg,.png" class="absolute h-px w-px overflow-hidden opacity-0" aria-hidden="true" tabindex="-1" />
|
||||
</label>
|
||||
<button type="button" wire:click="removeUploadedPreviewFile" class="shrink-0 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300">
|
||||
<x-filament::icon icon="tabler-x" class="h-5 w-5" />
|
||||
</button>
|
||||
</div>
|
||||
@else
|
||||
<label class="flex cursor-pointer items-center gap-2 rounded-lg border border-dashed border-gray-300 px-3 py-2 text-sm transition dark:border-gray-600 hover:border-primary-500 dark:hover:border-primary-500">
|
||||
<x-filament::icon icon="tabler-photo-plus" class="h-5 w-5 text-gray-400 dark:text-gray-500" />
|
||||
<span class="text-gray-600 dark:text-gray-300">{{ trans('blockland-config::blockland-config.save_loader.upload_preview_add') }}</span>
|
||||
<input type="file" wire:model="uploadedPreviewFile" accept=".jpg,.jpeg,.png" class="absolute h-px w-px overflow-hidden opacity-0" aria-hidden="true" />
|
||||
</label>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<label class="relative flex cursor-pointer flex-col items-center justify-center gap-2 px-6 py-8 sm:flex-row sm:py-6">
|
||||
<x-filament::icon icon="tabler-upload" class="h-10 w-10 shrink-0 text-gray-400 dark:text-gray-500" />
|
||||
<div class="text-center sm:text-left">
|
||||
<p class="text-sm font-medium text-gray-950 dark:text-white">{{ trans('blockland-config::blockland-config.save_loader.upload_drop_or_click') }}</p>
|
||||
<p class="text-xs text-gray-500 dark:text-gray-400">{{ trans('blockland-config::blockland-config.save_loader.upload_file_types') }}</p>
|
||||
</div>
|
||||
<input type="file" wire:model="uploadedFile" accept=".bls" class="absolute inset-0 h-full w-full cursor-pointer opacity-0" aria-hidden="true" />
|
||||
</label>
|
||||
@endif
|
||||
</div>
|
||||
</x-filament::section>
|
||||
|
||||
{{-- Saves Folder --}}
|
||||
<x-filament::section :heading="trans('blockland-config::blockland-config.save_loader.saves_folder')" :description="trans('blockland-config::blockland-config.save_loader.copy_hint')">
|
||||
@if(count($saves) > 0)
|
||||
<div class="divide-y divide-transparent dark:divide-white/10">
|
||||
@foreach($saves as $save)
|
||||
<div class="flex items-center justify-between gap-4 py-4" wire:key="save-{{ $save['path'] }}">
|
||||
<div class="flex min-w-0 flex-1 items-center gap-4">
|
||||
<div class="flex h-6 w-8 shrink-0 items-center justify-center overflow-hidden rounded bg-gray-100 dark:bg-gray-800">
|
||||
@if(isset($save['preview_url']))
|
||||
<img src="{{ $save['preview_url'] }}" alt="" class="h-full w-full object-cover" loading="lazy" />
|
||||
@else
|
||||
<x-filament::icon icon="tabler-file" class="h-4 w-4 text-gray-400 dark:text-gray-500" />
|
||||
@endif
|
||||
</div>
|
||||
<span class="truncate text-sm font-medium text-gray-950 dark:text-white">{{ $save['name'] }}</span>
|
||||
</div>
|
||||
<x-filament::button size="sm" icon="tabler-copy" wire:click="copyToTemp('{{ addslashes($save['path']) }}')" wire:loading.attr="disabled">
|
||||
{{ trans('blockland-config::blockland-config.save_loader.copy_to_temp') }}
|
||||
</x-filament::button>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@else
|
||||
<x-filament::empty-state
|
||||
icon="tabler-folder-off"
|
||||
:heading="trans('blockland-config::blockland-config.save_loader.no_saves')"
|
||||
/>
|
||||
@endif
|
||||
</x-filament::section>
|
||||
</div>
|
||||
@endif
|
||||
</x-filament-panels::page>
|
||||
Reference in New Issue
Block a user