Add transfer search and OneDrive-style Files storage UI.
Deploy Ladill Transfer / deploy (push) Successful in 29s
Deploy Ladill Transfer / deploy (push) Successful in 29s
Transfers now lists all shares with filters and pagination; Files becomes a selectable cloud view with download, share, delete, move, and open-in-email actions. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\QrCode;
|
||||
use App\Support\Qr\QrTypeCatalog;
|
||||
use App\Models\Transfer;
|
||||
use App\Models\TransferFile;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\View\View;
|
||||
@@ -28,28 +28,49 @@ class SearchController extends Controller
|
||||
/** @return list<array{type: string, title: string, subtitle: string, url: string}> */
|
||||
private function results(string $q): array
|
||||
{
|
||||
$account = ladill_account();
|
||||
$like = '%'.$q.'%';
|
||||
$results = [];
|
||||
|
||||
return ladill_account()->qrCodes()
|
||||
->whereIn('type', QrTypeCatalog::eventsTypes())
|
||||
->where(function ($query) use ($like): void {
|
||||
$query->where('label', 'like', $like)
|
||||
->orWhere('short_code', 'like', $like)
|
||||
->orWhere('destination_url', 'like', $like);
|
||||
Transfer::query()
|
||||
->where('user_id', $account->id)
|
||||
->where('status', '!=', Transfer::STATUS_DELETED)
|
||||
->where(function ($query) use ($like) {
|
||||
$query->where('title', 'like', $like)
|
||||
->orWhere('message', 'like', $like)
|
||||
->orWhere('recipient_email', 'like', $like);
|
||||
})
|
||||
->orderByDesc('updated_at')
|
||||
->limit(15)
|
||||
->withCount('files')
|
||||
->latest()
|
||||
->limit(8)
|
||||
->get()
|
||||
->map(function (QrCode $code): array {
|
||||
$content = $code->content();
|
||||
|
||||
return [
|
||||
'type' => $code->type === QrCode::TYPE_EVENT ? 'event' : 'programme',
|
||||
'title' => $content['name'] ?? $code->label,
|
||||
'subtitle' => $code->typeLabel().' · '.$code->publicUrl(),
|
||||
'url' => route('events.show', $code),
|
||||
->each(function (Transfer $transfer) use (&$results) {
|
||||
$results[] = [
|
||||
'type' => 'transfer',
|
||||
'title' => $transfer->title,
|
||||
'subtitle' => $transfer->files_count.' file'.($transfer->files_count === 1 ? '' : 's').' · '.$transfer->billingStatusLabel(),
|
||||
'url' => route('transfer.transfers.show', $transfer),
|
||||
];
|
||||
})
|
||||
->all();
|
||||
});
|
||||
|
||||
TransferFile::query()
|
||||
->whereHas('transfer', fn ($inner) => $inner
|
||||
->where('user_id', $account->id)
|
||||
->where('status', '!=', Transfer::STATUS_DELETED))
|
||||
->where('original_name', 'like', $like)
|
||||
->with('transfer')
|
||||
->latest()
|
||||
->limit(8)
|
||||
->get()
|
||||
->each(function (TransferFile $file) use (&$results) {
|
||||
$results[] = [
|
||||
'type' => 'file',
|
||||
'title' => $file->original_name,
|
||||
'subtitle' => $file->humanSize().' · '.$file->transfer->title,
|
||||
'url' => route('transfer.files.index', ['folder' => $file->transfer_id, 'q' => $file->original_name]),
|
||||
];
|
||||
});
|
||||
|
||||
return array_slice($results, 0, 15);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user