Redesign: clear active nav state, Shipping labels + Receipts get free-text/raw print, shared label repository
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:
randy committed 2026-09-13 11:11:12 +02:00
1 parent afae57aff4
commit 66e2e7a5c0
8 files changed
+226 -53

No files matched your search

+46
View File
@@ -0,0 +1,46 @@
require 'json'
require 'securerandom'
require 'fileutils'
# Simple file-backed store for reusable ZPL/ESC-POS label templates -- one
# JSON file per label under DIR, similar in spirit to brother_ql_web's own
# label repository. No per-printer targeting yet (type just says which print
# path to use); that can be added once labels can target any of the five
# printers via the Brother API.
class LabelRepository
def initialize(dir)
@dir = dir
FileUtils.mkdir_p(@dir)
end
# type: "zpl" or "escpos"
def all(type: nil)
Dir.glob(File.join(@dir, '*.json')).map { |f| JSON.parse(File.read(f)) }
.select { |l| type.nil? || l['type'] == type }
.sort_by { |l| l['name'].downcase }
end
def find(id)
path = path_for(id)
return nil unless File.exist?(path)
JSON.parse(File.read(path))
end
def save(name:, type:, content:)
id = SecureRandom.uuid
label = { 'id' => id, 'name' => name, 'type' => type, 'content' => content }
File.write(path_for(id), JSON.generate(label))
label
end
def delete(id)
File.delete(path_for(id)) if File.exist?(path_for(id))
end
private
def path_for(id)
File.join(@dir, "#{id}.json")
end
end