Migrate HickLab3D dashboard and add production auto deployment
Deploy HickLab3D Dashboard / Deploy to production (push) Failing after 19s

This commit is contained in:
Hickmeister
2026-10-10 18:51:23 +01:00
parent 8410a50f26
commit 88dd00551f
974 changed files with 14609 additions and 162573 deletions
+10
View File
@@ -0,0 +1,10 @@
@extends('layouts.app')
@section('title', 'Add printer')
@section('content')
<form method="post" action="{{ route('printers.store') }}" class="grid max-w-2xl gap-5 rounded-2xl border border-slate-800 bg-slate-900 p-6">@csrf
@foreach([['printerName','Printer name','Bambu X1 Carbon'],['printerIp','IP address','192.168.1.100'],['serialNumber','Serial number','Printer serial'],['mqttPassword','Access code','Printer access code']] as [$name,$label,$placeholder])
<label class="grid gap-2 text-sm font-medium">{{ $label }}<input name="{{ $name }}" type="{{ $name === 'mqttPassword' ? 'password' : 'text' }}" value="{{ old($name) }}" placeholder="{{ $placeholder }}" required class="rounded-xl border border-slate-700 bg-slate-950 px-4 py-3 outline-none focus:border-brand"></label>
@endforeach
<div class="flex gap-3"><button class="rounded-xl bg-brand px-5 py-3 font-semibold text-slate-950">Save printer</button><a href="{{ route('printers.index') }}" class="rounded-xl border border-slate-700 px-5 py-3">Cancel</a></div>
</form>
@endsection
+15
View File
@@ -0,0 +1,15 @@
@extends('layouts.app')
@section('title', 'Print farm')
@section('content')
<div class="flex flex-wrap items-end justify-between gap-4"><div><p class="text-xs font-bold uppercase tracking-[.2em] text-brand">Production</p><h2 class="mt-2 text-2xl font-bold">BamBuddy printers</h2><p class="mt-1 text-slate-400">Live state, progress and temperatures from the workshop.</p></div><a href="{{ config('services.bambuddy.url') }}" target="_blank" rel="noopener noreferrer" class="rounded-xl border border-brand/40 px-4 py-3 text-sm font-semibold text-brand hover:bg-brand/10">Open BamBuddy ↗</a></div>
@if($integrationError)<div role="alert" class="rounded-xl border border-amber-500/30 bg-amber-500/10 p-4 text-sm text-amber-200">{{ $integrationError }}</div>@endif
<div class="grid gap-4 lg:grid-cols-2">@forelse($printers as $printer)
@php $live = $printer['live'] ?? []; $progress = min(100, max(0, (float) ($live['progress'] ?? 0))); $printerErrors = is_array($live['hms_errors'] ?? null) ? $live['hms_errors'] : []; @endphp
<article class="rounded-2xl border border-slate-800 bg-slate-900 p-6"><div class="flex justify-between gap-3"><div><h3 class="text-lg font-semibold">{{ $printer['name'] ?? 'Printer' }}</h3><p class="text-sm text-slate-400">{{ $printer['model'] ?? 'Bambu printer' }}</p></div><span @class(['h-fit rounded-full px-3 py-1 text-xs font-semibold', 'bg-brand/10 text-brand' => ($live['connected'] ?? false), 'bg-amber-500/10 text-amber-200' => ! ($live['connected'] ?? false)])>{{ $live['state'] ?? $printer['status'] ?? 'Unavailable' }}</span></div>
<div class="mt-6 flex items-end justify-between gap-4"><div><p class="text-sm text-slate-400">Current job</p><p class="mt-1 max-w-sm truncate font-medium">{{ $live['current_print'] ?? $live['subtask_name'] ?? 'No active job' }}</p></div><strong class="text-2xl">{{ number_format($progress, 0) }}%</strong></div>
<div class="mt-3 h-2 overflow-hidden rounded-full bg-slate-800"><div class="h-full rounded-full bg-brand" style="width: {{ $progress }}%"></div></div>
<dl class="mt-5 grid grid-cols-3 gap-3 text-sm"><div class="rounded-xl bg-slate-950 p-3"><dt class="text-slate-400">Nozzle</dt><dd class="mt-1 font-semibold">{{ isset($live['temperatures']['nozzle']) ? $live['temperatures']['nozzle'].'°C' : '—' }}</dd></div><div class="rounded-xl bg-slate-950 p-3"><dt class="text-slate-400">Bed</dt><dd class="mt-1 font-semibold">{{ isset($live['temperatures']['bed']) ? $live['temperatures']['bed'].'°C' : '—' }}</dd></div><div class="rounded-xl bg-slate-950 p-3"><dt class="text-slate-400">Remaining</dt><dd class="mt-1 font-semibold">{{ isset($live['remaining_time']) ? $live['remaining_time'].' min' : '—' }}</dd></div></dl>
@if(count($printerErrors))<p class="mt-4 rounded-lg border border-rose-500/30 bg-rose-500/10 p-3 text-sm text-rose-200">{{ count($printerErrors) }} printer alert{{ count($printerErrors) === 1 ? '' : 's' }} · {{ $printerErrors[0]['description'] ?? 'Open BamBuddy for details' }}</p>@endif
</article>
@empty<div class="rounded-2xl border border-dashed border-slate-700 p-10 text-slate-400">No printers returned by BamBuddy.</div>@endforelse</div>
@endsection