feat: increase gallery grid from 4 to 5 columns per row on desktopfeat: increase gallery grid from 4 to 5 columns per row on desktop

This commit is contained in:
2026-02-25 19:11:23 +01:00
parent 5c97488e80
commit 0032aec02f
131 changed files with 15674 additions and 597 deletions

View File

@@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
use App\Services\ThumbnailService;
use Illuminate\Support\Facades\DB;
use Laravel\Scout\Searchable;
/**
* App\Models\Artwork
@@ -23,7 +24,7 @@ use Illuminate\Support\Facades\DB;
*/
class Artwork extends Model
{
use HasFactory, SoftDeletes;
use HasFactory, SoftDeletes, Searchable;
protected $table = 'artworks';
@@ -173,6 +174,77 @@ class Artwork extends Model
return $this->hasMany(ArtworkFeature::class, 'artwork_id');
}
public function awards(): HasMany
{
return $this->hasMany(ArtworkAward::class);
}
public function awardStat(): HasOne
{
return $this->hasOne(ArtworkAwardStat::class);
}
/**
* Build the Meilisearch document for this artwork.
* Includes all fields required for search, filtering, sorting, and display.
*/
public function toSearchableArray(): array
{
$this->loadMissing(['user', 'tags', 'categories.contentType', 'stats', 'awardStat']);
$stat = $this->stats;
$awardStat = $this->awardStat;
// Orientation derived from pixel dimensions
$orientation = 'square';
if ($this->width && $this->height) {
if ($this->width > $this->height) {
$orientation = 'landscape';
} elseif ($this->height > $this->width) {
$orientation = 'portrait';
}
}
// Resolution string e.g. "1920x1080"
$resolution = ($this->width && $this->height)
? $this->width . 'x' . $this->height
: '';
// Primary category slug (first attached category)
$primaryCategory = $this->categories->first();
$category = $primaryCategory?->slug ?? '';
$content_type = $primaryCategory?->contentType?->slug ?? '';
// Tag slugs array
$tags = $this->tags->pluck('slug')->values()->all();
return [
'id' => $this->id,
'slug' => $this->slug,
'title' => $this->title,
'description' => (string) ($this->description ?? ''),
'author_id' => $this->user_id,
'author_name' => $this->user?->name ?? 'Skinbase',
'category' => $category,
'content_type' => $content_type,
'tags' => $tags,
'resolution' => $resolution,
'orientation' => $orientation,
'downloads' => (int) ($stat?->downloads ?? 0),
'likes' => (int) ($stat?->favorites ?? 0),
'views' => (int) ($stat?->views ?? 0),
'created_at' => $this->published_at?->toDateString() ?? $this->created_at?->toDateString() ?? '',
'is_public' => (bool) $this->is_public,
'is_approved' => (bool) $this->is_approved,
'awards' => [
'gold' => $awardStat?->gold_count ?? 0,
'silver' => $awardStat?->silver_count ?? 0,
'bronze' => $awardStat?->bronze_count ?? 0,
'score' => $awardStat?->score_total ?? 0,
],
];
}
// Scopes
public function scopePublic(Builder $query): Builder
{