Files
Mark Gregory f09a680531 Marketplace package catalogue
* Modules, themes, and extensions
* Publisher profiles and verification metadata
* Installed-package tracking
* Semantic version compatibility checks
* PHP, Laravel, and Content Manager compatibility checks
* Dependency resolution
* SHA-256 checksum validation
* Package signature requirements
* Installation and update history
* Enable and disable controls
* Removal handling
* Rollback records
* Licence records
* Marketplace administration UI
* Authenticated REST endpoints
* Console audit and synchronisation commands
* Permissions and sidebar integration
* Feature tests
2026-07-24 13:49:14 +01:00

98 lines
3.7 KiB
PHP

<x-layouts.app :title="__('Marketplace')">
<div class="flex h-full w-full flex-1 flex-col gap-6 rounded-xl">
<div class="flex flex-wrap items-center justify-between gap-3">
<div>
<flux:heading size="xl">Marketplace</flux:heading>
<flux:subheading>
Discover verified modules, themes and extensions.
</flux:subheading>
</div>
<flux:button
:href="route('administration.marketplace.installed')"
wire:navigate
>
Installed packages
</flux:button>
</div>
<form method="GET" class="grid gap-3 md:grid-cols-[1fr_220px_auto]">
<flux:input
name="search"
value="{{ request('search') }}"
placeholder="Search packages"
/>
<flux:select name="type">
<option value="">All types</option>
@foreach (config('marketplace.supported_types', []) as $type)
<option
value="{{ $type }}"
{{ request('type') === $type ? 'selected' : '' }}
>
{{ \Illuminate\Support\Str::headline($type) }}
</option>
@endforeach
</flux:select>
<flux:button type="submit">Filter</flux:button>
</form>
<div class="grid gap-4 lg:grid-cols-2">
@forelse ($packages as $package)
<article class="rounded-xl border p-5">
<div class="flex justify-between gap-4">
<div>
<div class="flex items-center gap-2">
<h2 class="font-semibold">{{ $package->name }}</h2>
@if ($package->is_featured)
<flux:badge color="amber">Featured</flux:badge>
@endif
</div>
<p class="mt-1 text-sm text-zinc-500">
{{ $package->package_name }}
· {{ \Illuminate\Support\Str::headline($package->type) }}
· {{ $package->latest_version ?: 'No release' }}
</p>
</div>
@can('marketplace.install')
<form
method="POST"
action="{{ route('administration.marketplace.install', $package) }}"
>
@csrf
<flux:button type="submit" size="sm" variant="primary">
Install
</flux:button>
</form>
@endcan
</div>
<p class="mt-4 text-sm">{{ $package->description }}</p>
@if ($package->publisher)
<p class="mt-3 text-xs text-zinc-500">
Published by {{ $package->publisher->name }}
@if ($package->publisher->is_verified)
· Verified
@endif
</p>
@endif
</article>
@empty
<div class="col-span-full rounded-xl border p-8 text-center text-zinc-500">
No marketplace packages found.
</div>
@endforelse
</div>
{{ $packages->links() }}
</div>
</x-layouts.app>