Redesign: clear active nav state, Shipping labels + Receipts get free-text/raw print, shared label repository
deploy / deploy (push) Successful in 10s
deploy / deploy (push) Successful in 10s
- Home page is now just the print server overview, no more unrelated network links (3D printers, Cockpit) left over from when this was a general landing page. - Navbar shows which section is active; Brother's per-printer buttons now live under a dedicated Brother nav item instead of always-visible. - Shipping labels: paste raw ZPL directly (no need to save to a file first), with a Labelary preview link alongside it. - Receipts: paste already-formatted ESC/POS text directly, printed as-is. - Both can save what they just printed into a shared label repository (lib/label_repository.rb, one JSON file per label under data/labels/) for reprinting later -- saving happens independently of whether the print itself succeeds, so a failed/offline printer doesn't lose the content.
This commit is contained in:
1 parent
afae57aff4
commit
66e2e7a5c0
8 files changed
+226
-53
No files matched your search
+14
-9
@@ -7,21 +7,26 @@
|
||||
<div class="collapse navbar-collapse" id="navbarNavDropdown">
|
||||
<ul class="navbar-nav me-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/">Home</a>
|
||||
<a class="nav-link <%= 'active' if request.path == '/' %>" href="/">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/upload">Shipping labels</a>
|
||||
<a class="nav-link <%= 'active' if request.path.start_with?('/brother') %>" href="/brother">Brother</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="/epson">Receipts</a>
|
||||
<a class="nav-link <%= 'active' if request.path == '/upload' %>" href="/upload">Shipping labels</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link <%= 'active' if request.path == '/epson' %>" href="/epson">Receipts</a>
|
||||
</li>
|
||||
</ul>
|
||||
<span class="navbar-text me-2">Brother:</span>
|
||||
<div class="d-flex gap-1">
|
||||
<% BROTHER_PRINTERS.each do |key, info| %>
|
||||
<a href="/brother/<%= key %>/" class="btn btn-sm <%= request.path.start_with?("/brother/#{key}/") ? 'btn-primary' : 'btn-outline-secondary' %>"><%= info[:label].sub('Brother ', '') %></a>
|
||||
<% end %>
|
||||
</div>
|
||||
<% if request.path.start_with?('/brother') %>
|
||||
<span class="navbar-text me-2">Printer:</span>
|
||||
<div class="d-flex gap-1">
|
||||
<% BROTHER_PRINTERS.each do |key, info| %>
|
||||
<a href="/brother/<%= key %>/" class="btn btn-sm <%= request.path.start_with?("/brother/#{key}/") ? 'btn-primary' : 'btn-outline-secondary' %>"><%= info[:label].sub('Brother ', '') %></a>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
@@ -1,3 +1,4 @@
|
||||
<h5>Formatted receipt</h5>
|
||||
<form action="/epson/print" method="POST">
|
||||
<div class="mb-3">
|
||||
<label for="title" class="form-label">Title (bold, centered)</label>
|
||||
@@ -13,3 +14,42 @@
|
||||
</div>
|
||||
<button class="btn btn-secondary" type="submit">Print</button>
|
||||
</form>
|
||||
|
||||
<hr class="mt-4">
|
||||
|
||||
<h5>Free text (already-formatted ESC/POS)</h5>
|
||||
<p>Sent as-is (just reset + code page prefix and a trailing cut), no title/body template applied.</p>
|
||||
<form action="/epson/raw" method="POST">
|
||||
<div class="mb-3">
|
||||
<textarea name="content" class="form-control" rows="8" style="font-family: monospace;"></textarea>
|
||||
</div>
|
||||
<div class="row g-2 align-items-end">
|
||||
<div class="col-auto">
|
||||
<label for="save_as_escpos" class="form-label">Save as (optional)</label>
|
||||
<input name="save_as" class="form-control" type="text" id="save_as_escpos" placeholder="receipt name" />
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<button class="btn btn-secondary" type="submit">Print</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<% if @labels && !@labels.empty? %>
|
||||
<hr class="mt-4">
|
||||
<h5>Saved receipts</h5>
|
||||
<div class="list-group">
|
||||
<% @labels.each do |label| %>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<%= label['name'] %>
|
||||
<div class="d-flex gap-2">
|
||||
<form action="/labels/<%= label['id'] %>/print" method="POST">
|
||||
<button class="btn btn-sm btn-secondary" type="submit">Print</button>
|
||||
</form>
|
||||
<form action="/labels/<%= label['id'] %>/delete" method="POST">
|
||||
<button class="btn btn-sm btn-outline-danger" type="submit">Delete</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
+8
-44
@@ -1,47 +1,11 @@
|
||||
<div class="card" >
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Brother Label Designer</h5>
|
||||
<p class="card-text">A web service to print labels on Brother QL label printers.</p>
|
||||
<a href="http://rpi-printserver.local:8560/labeldesigner" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">QL-560</a>
|
||||
<a href="http://rpi-printserver.local:8700/labeldesigner" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">QL-700</a>
|
||||
<a href="http://rpi-printserver.local:9100/labeldesigner" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">QL-1100</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card" >
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Cockpit</h5>
|
||||
<p class="card-text">Cockpit is a web-based graphical interface for servers, intended for everyone</p>
|
||||
<a href="https://rpi-printserver.local:9090" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">Go</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card" >
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">ZPL Viewer</h5>
|
||||
<p class="card-text">An useful tool for labels in ZPL format.</p>
|
||||
<a href="https://labelary.com/viewer.html" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">Go</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card" >
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Creality Sonic Pad</h5>
|
||||
<p class="card-text">3D Printer</p>
|
||||
<a href="http://spad-9088.local" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">Fluidd</a>
|
||||
<a href="http://spad-9088.local:8819" class="btn btn-outline-secondary" target="_blank" rel="noopener noreferrer">Mainsail</a>
|
||||
<a href="http://spad-9088.local:7125" class="btn btn-outline-secondary" target="_blank" rel="noopener noreferrer">Moonraker</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card" >
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Bigtreetech Pad 7 CNC</h5>
|
||||
<p class="card-text">CNC</p>
|
||||
<a href="http://btt-pad7-cnc.local" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">Mainsail</a>
|
||||
<a href="http://btt-pad7-cnc.local:7125" class="btn btn-outline-secondary" target="_blank" rel="noopener noreferrer">Moonraker</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card" >
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Bigtreetech Pad 7 CAN</h5>
|
||||
<p class="card-text">CAN</p>
|
||||
<a href="http://rpi-btt-pad7-can.local" class="btn btn-secondary" target="_blank" rel="noopener noreferrer">Mainsail</a>
|
||||
<h5 class="card-title">Print server</h5>
|
||||
<p class="card-text">Connected printers:</p>
|
||||
<ul>
|
||||
<li>Datamax-ONeil E4204B Mark III (ZPL, 100x150) -- <a href="/upload">Shipping labels</a></li>
|
||||
<li>Epson TM-T20II (ESC/POS) -- <a href="/epson">Receipts</a></li>
|
||||
<li>Brother QL-560, QL-700, QL-1100 -- <a href="/brother">Brother</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@@ -9,3 +9,45 @@
|
||||
<form action="/test-print" method="POST" class="mt-3">
|
||||
<button class="btn btn-outline-secondary" type="submit">Print test label</button>
|
||||
</form>
|
||||
|
||||
<hr class="mt-4">
|
||||
|
||||
<h5>Free text ZPL</h5>
|
||||
<p>
|
||||
<a href="https://labelary.com/viewer.html" target="_blank" rel="noopener noreferrer">Labelary ZPL viewer</a>
|
||||
(preview/build ZPL before pasting it here)
|
||||
</p>
|
||||
<form action="/shipping/zpl" method="POST">
|
||||
<div class="mb-3">
|
||||
<textarea name="zpl" class="form-control" rows="8" placeholder="^XA...^XZ" style="font-family: monospace;"></textarea>
|
||||
</div>
|
||||
<div class="row g-2 align-items-end">
|
||||
<div class="col-auto">
|
||||
<label for="save_as_zpl" class="form-label">Save as (optional)</label>
|
||||
<input name="save_as" class="form-control" type="text" id="save_as_zpl" placeholder="label name" />
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<button class="btn btn-secondary" type="submit">Print</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<% if @labels && !@labels.empty? %>
|
||||
<hr class="mt-4">
|
||||
<h5>Saved labels</h5>
|
||||
<div class="list-group">
|
||||
<% @labels.each do |label| %>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<%= label['name'] %>
|
||||
<div class="d-flex gap-2">
|
||||
<form action="/labels/<%= label['id'] %>/print" method="POST">
|
||||
<button class="btn btn-sm btn-secondary" type="submit">Print</button>
|
||||
</form>
|
||||
<form action="/labels/<%= label['id'] %>/delete" method="POST">
|
||||
<button class="btn btn-sm btn-outline-danger" type="submit">Delete</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
Reference in new issue
Block a user