A lot of things

This commit is contained in:
2026-06-16 16:21:43 +02:00
parent 4f9f6c63b3
commit 7e1e26f20b
126 changed files with 7917 additions and 204 deletions

View File

@@ -0,0 +1,210 @@
<div>
<div class="log-filters" x-data="{ open: {{ $hasFilters ? 'true' : 'false' }} }">
<div class="log-filters-main">
<div class="log-search-wrap">
<i data-lucide="search" size="13"></i>
<input
wire:model.live.debounce.300ms="search"
type="text"
class="form-input"
placeholder="Search description, subject, channel…"
>
</div>
<select wire:model.live="event" class="form-select log-select">
<option value="">All events</option>
@foreach($events as $e)
<option value="{{ $e }}">{{ ucfirst($e) }}</option>
@endforeach
</select>
<select wire:model.live="logName" class="form-select log-select">
<option value="">All channels</option>
@foreach($logNames as $name)
<option value="{{ $name }}">{{ $name }}</option>
@endforeach
</select>
<button @click="open = !open" class="btn {{ $hasFilters ? 'btn--active' : '' }}">
<i data-lucide="sliders-horizontal" size="13"></i>
More filters
@if($hasFilters)
<span class="log-filter-dot"></span>
@endif
</button>
@if($search || $hasFilters)
<button wire:click="clearFilters" class="btn">
<i data-lucide="x" size="13"></i> Clear
</button>
@endif
</div>
<div
x-show="open"
x-transition:enter="log-transition-enter"
x-transition:leave="log-transition-leave"
class="log-filters-extra"
>
<div class="log-filters-extra-inner">
<div class="log-filter-field">
<label class="log-filter-label">From</label>
<input wire:model.live="dateFrom" type="date" class="form-input">
</div>
<div class="log-filter-field">
<label class="log-filter-label">To</label>
<input wire:model.live="dateTo" type="date" class="form-input">
</div>
<div class="log-filter-field">
<label class="log-filter-label">User ID</label>
<input
wire:model.live.debounce.400ms="causerId"
type="text"
class="form-input"
placeholder="XenForo user ID"
>
</div>
</div>
</div>
</div>
<div class="log-results-bar">
<span class="log-results-count">
<span wire:loading.class="log-loading">
{{ number_format($logs->total()) }} log entries
</span>
</span>
<span class="log-results-pages">
Page {{ $logs->currentPage() }} / {{ $logs->lastPage() }}
</span>
</div>
@if($logs->isEmpty())
<div class="modcp-empty">
<i data-lucide="search-x" size="36"></i>
<p>No logs match your search.</p>
</div>
@else
<div class="modcp-list">
@foreach($logs as $log)
@php
$old = $log->properties->get('old', []);
$attrs = $log->properties->get('attributes', []);
$extra = array_diff_key($log->properties->toArray(), array_flip(['old', 'attributes']));
$hasDiff = !empty($old) || !empty($attrs) || !empty($extra);
@endphp
<div
class="modcp-list-item log-item"
x-data="{ open: false }"
:class="open && 'log-item--open'"
>
<div class="log-event-dot log-event-dot--{{ $log->event ?? 'custom' }}">
@switch($log->event)
@case('created') <i data-lucide="plus" size="12"></i> @break
@case('updated') <i data-lucide="pen-line" size="12"></i> @break
@case('deleted') <i data-lucide="trash-2" size="12"></i> @break
@default <i data-lucide="zap" size="12"></i>
@endswitch
</div>
<div class="modcp-list-item-info">
<span class="modcp-list-item-title">{{ $log->description }}</span>
<div class="modcp-list-item-meta">
@if($log->log_name)
<span class="log-channel-badge">{{ $log->log_name }}</span>
<span class="log-sep">·</span>
@endif
@if($log->subject_type)
<span>
{{ class_basename($log->subject_type) }}
<span class="log-id">#{{ $log->subject_id }}</span>
</span>
<span class="log-sep">·</span>
@endif
@if($log->causer_id)
<span>
<i data-lucide="user" size="10"></i>
<x-xf-username-link :user-id="$log->causer_id" />
</span>
<span class="log-sep">·</span>
@endif
<span title="{{ $log->created_at->format('d M Y, H:i:s') }}">
{{ $log->created_at->diffForHumans() }}
</span>
</div>
</div>
<div class="log-item-right">
<span class="log-timestamp">{{ $log->created_at->format('d M Y, H:i') }}</span>
@if($hasDiff)
<button
@click="open = !open"
class="btn btn--sm log-expand-btn"
:class="open && 'btn--active'"
:aria-label="open ? 'Hide details' : 'Show details'"
>
<i data-lucide="chevron-down" size="12"
style="transition: transform .15s"
:style="open ? 'transform:rotate(180deg)' : ''">
</i>
</button>
@endif
</div>
</div>
@if($hasDiff)
<div x-show="open" x-transition class="log-properties">
@if(!empty($old) || !empty($attrs))
<div class="log-diff-label">Changes</div>
<table class="log-diff">
<thead>
<tr>
<th>Field</th>
<th class="log-diff-old-head">Before</th>
<th class="log-diff-new-head">After</th>
</tr>
</thead>
<tbody>
@foreach(array_unique(array_merge(array_keys((array)$old), array_keys((array)$attrs))) as $key)
<tr>
<td class="log-diff-key">{{ $key }}</td>
<td class="log-diff-old">
{{ is_array($old[$key] ?? null) ? json_encode($old[$key]) : ($old[$key] ?? '—') }}
</td>
<td class="log-diff-new">
{{ is_array($attrs[$key] ?? null) ? json_encode($attrs[$key]) : ($attrs[$key] ?? '—') }}
</td>
</tr>
@endforeach
</tbody>
</table>
@endif
@if(!empty($extra))
<div class="log-diff-label" style="margin-top: 10px">Properties</div>
<pre class="log-raw">{{ json_encode($extra, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) }}</pre>
@endif
</div>
@endif
@endforeach
</div>
<div class="log-pagination">
{{ $logs->links() }}
</div>
@endif
</div>

View File

@@ -5,7 +5,7 @@
<div class="game-selector">
<div class="game-selector-level2">
<x-form-field-title name="Authors" helper="Person or Group who created this, if it's you add/select yourself." required="true" />
<input id="author-search" class="form-input" type="text" wire:model.live.debounce="search" placeholder="Search a game..." autocomplete="off"
<input id="author-search" class="form-input" type="text" wire:model.live.debounce="search" placeholder="Search an author..." autocomplete="off"
@focus="$wire.dropdown = $wire.search.length >= 2" @click.outside="$wire.dropdown = false" >
</div>
@if( $dropdown )

View File

@@ -6,7 +6,7 @@
placeholder="Search..."
class="form-input filter-bar-search"
>
@if( $search || $types || $platforms || $games || $statuses || $authors || $languages || $modifications )
@if( $search || $types || $platforms || $games || $statuses || $authors || $languages || $modifications || $categories || $levels || $systems )
<button type="button" wire:click="clearFilters" class="btn">
<i data-lucide="x"></i> Clear filters
</button>

View File

@@ -20,13 +20,18 @@
<div class="file-item">
<div class="file-info">
<span class="file-name">{{ $file->filename }}</span>
<span class="file-meta">{{ $file->filesize }} - 0 downloads</span>
<span class="file-meta">{{ $file->filesize }} - {{ $file->download_count }} downloads</span>
</div>
<div style="display:flex;flex-direction:column;gap:15px;">
<a href="{{ route('fs.download', ['entry_id' => $entryId, 'file' => $file->file_uuid] ) }}" class="btn primary"><i data-lucide="download"></i> Download</a>
@if( $file->online_patcher )
<a href="{{ route('tools.direct-patch', ['entry_id' => $entryId, 'file' => $file->file_uuid] ) }}" class="btn"><i data-lucide="stamp"></i> Patch</a>
@endif
@if( $file->playOnlineSetting )
@auth
<a href="{{ route('tools.play', ['entry_id' => $entryId, 'file' => $file->file_uuid] ) }}" class="btn"><i data-lucide="gamepad-2"></i> Try it online</a>
@endauth
@endif
</div>
</div>
@empty

View File

@@ -0,0 +1,41 @@
<div class="form-group">
<div class="game-selector">
<div class="game-selector-level2">
<x-form-field-title name="Related Entry" required="" />
<input id="entry-search" class="form-input" type="text" wire:model.live.debounce="search" placeholder="Search an entry..." autocomplete="off"
@focus="$wire.dropdown = $wire.search.length > 2" @click.outside="$wire.dropdown = false"
>
<input type="hidden" name="entry_id" value="{{ $selectedEntryId ?? '' }}" />
</div>
@if( $dropdown )
<ul class="game-selector-dropdown">
@forelse( $entries as $entry )
<li>
<button type="button"
wire:click="selectEntry({{ $entry->id }})" class="dropdown-item" {{ $selectedEntryId === $entry->id ? 'selected' : '' }}>
<span class="dropdown-item-name">
{{ $entry->complete_title ?? $entry->title }}
</span>
<span class="badge {{ $entry->type }}">
{{ \App\View\Components\EntryCard::ENTRY_TYPES_BADGE[$entry->type] ?? $entry->type }}
</span>
</button>
</li>
@empty
<li class="dropdown-empty">No entry found</li>
@endforelse
</ul>
@endif
</div>
<div style="display:flex;align-items: flex-end;justify-content: right;gap:15px;margin-top: 15px;">
@if($selectedEntryId)
<button type="button" class="btn" wire:click="clearEntry">
Remove
</button>
@endif
</div>
</div>

View File

@@ -0,0 +1,43 @@
<div @filters-updated.window="refreshIcons($el)">
<div class="database-search filter-bar">
<input type="text" wire:model.live.debounce="search"
placeholder="Search..." class="form-input filter-bar-search"
>
@if($search || $categories )
<button type="button" wire:click="clearFilters" class="btn">
<i data-lucide="x"></i> Clear filters
</button>
@endif
</div>
<div class="database-wrapper">
<aside class="database-filters">
{{-- Categories --}}
<x-database-filter-without-mode title="Categories" :items="$allCategories" model="categories" />
</aside>
<div class="database-results">
<div class="database-sort">
@foreach( \App\Livewire\NewsDatabase::SORT_OPTIONS as $k => $v )
<button type="button" wire:click="setSort('{{ $k }}')" class="btn {{ $sortBy === $k ? 'active' : '' }}">
{{ $v }}
</button>
@if( $sortBy === $k )
<i data-lucide="{{ $sortDir === 'asc' ? 'arrow-up' : 'arrow-down' }}"></i>
@endif
@endforeach
<span class="database-results-count">{{ $news->total() }} results</span>
</div>
<div class="news-grid">
@forelse($news as $item)
<x-news-card :news="$item" />
@empty
<p>No news found.</p>
@endforelse
</div>
{{ $news->links() }}
</div>
</div>
</div>