Initial Ladill Frontdesk release with deploy pipeline.
Visitor management app with SSO, kiosk, badges, reports, and Gitea CI deploy to frontdesk.ladill.com. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Frontdesk;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Controllers\Frontdesk\Concerns\ScopesToAccount;
|
||||
use App\Models\Visit;
|
||||
use App\Services\Frontdesk\BadgeRenderService;
|
||||
use App\Services\Frontdesk\FrontdeskPermissions;
|
||||
use App\Services\Printers\PrinterManager;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\View\View;
|
||||
|
||||
class BadgeController extends Controller
|
||||
{
|
||||
use ScopesToAccount;
|
||||
|
||||
public function editTemplate(Request $request): View
|
||||
{
|
||||
$this->authorizeAbility($request, 'settings.view');
|
||||
$organization = $this->organization($request);
|
||||
$canManage = app(FrontdeskPermissions::class)->isAdmin($this->member($request));
|
||||
|
||||
return view('frontdesk.badges.template', [
|
||||
'organization' => $organization,
|
||||
'canManage' => $canManage,
|
||||
'template' => array_merge(
|
||||
config('frontdesk.default_badge_template', []),
|
||||
$organization->settings['badge_template'] ?? [],
|
||||
),
|
||||
'sampleVisit' => Visit::owned($this->ownerRef($request))
|
||||
->where('organization_id', $organization->id)
|
||||
->where('status', Visit::STATUS_CHECKED_IN)
|
||||
->with(['visitor', 'host'])
|
||||
->latest('checked_in_at')
|
||||
->first(),
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateTemplate(Request $request): RedirectResponse
|
||||
{
|
||||
$this->authorizeAbility($request, 'settings.manage');
|
||||
$organization = $this->organization($request);
|
||||
|
||||
$validated = $request->validate([
|
||||
'show_photo' => ['boolean'],
|
||||
'show_qr' => ['boolean'],
|
||||
'show_host' => ['boolean'],
|
||||
'show_company' => ['boolean'],
|
||||
'show_type' => ['boolean'],
|
||||
'primary_color' => ['nullable', 'string', 'max:7'],
|
||||
'footer_text' => ['nullable', 'string', 'max:255'],
|
||||
]);
|
||||
|
||||
$settings = $organization->settings ?? [];
|
||||
$settings['badge_template'] = [
|
||||
'show_photo' => $request->boolean('show_photo'),
|
||||
'show_qr' => $request->boolean('show_qr'),
|
||||
'show_host' => $request->boolean('show_host'),
|
||||
'show_company' => $request->boolean('show_company'),
|
||||
'show_type' => $request->boolean('show_type'),
|
||||
'primary_color' => $validated['primary_color'] ?? '#0d9488',
|
||||
'footer_text' => $validated['footer_text'] ?? '',
|
||||
];
|
||||
|
||||
$organization->update(['settings' => $settings]);
|
||||
|
||||
return back()->with('success', 'Badge template saved.');
|
||||
}
|
||||
|
||||
public function preview(Request $request, Visit $visit, BadgeRenderService $badges): View
|
||||
{
|
||||
$this->authorizeAbility($request, 'visits.view');
|
||||
$this->authorizeOwner($request, $visit);
|
||||
|
||||
$visit->load(['visitor', 'host', 'organization']);
|
||||
|
||||
return view('frontdesk.badges.render', [
|
||||
'visit' => $visit,
|
||||
'template' => $badges->templateFor($visit->organization),
|
||||
'photoUrl' => $badges->photoUrl($visit),
|
||||
'qrSvg' => $visit->qr_token ? app(\App\Services\Frontdesk\QrCodeService::class)->svg($visit, 120) : null,
|
||||
'autoPrint' => false,
|
||||
'preview' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
public function print(Request $request, Visit $visit, PrinterManager $printers)
|
||||
{
|
||||
$this->authorizeAbility($request, 'visits.view');
|
||||
$this->authorizeOwner($request, $visit);
|
||||
|
||||
$rendered = $printers->renderBadge($visit, $request->query('driver'));
|
||||
|
||||
return response($rendered['content'], 200, [
|
||||
'Content-Type' => 'text/html; charset=UTF-8',
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user