Files
labelprint/lib/label_repository.rb
T
randy 148f7dc248
deploy / deploy (push) Successful in 10s
Unified /labels page (badges, edit, preview), mnemonic ESC/POS parser for the raw receipt field
- Saved labels/receipts now show on one page instead of split across
  Shipping labels and Receipts, each with a badge for its type/printer,
  Edit (name+content, in place), Print, and Delete.
- ZPL labels get a real visual preview via Labelary's public render API;
  ESC/POS ones show their raw content (no good general preview for that).
- The Receipts free-text field only ever encoded whatever was typed as
  literal printable characters -- pasting mnemonic ESC/POS notation
  (ESC/GS/LF as command names, 0xNN as raw bytes) just printed as text
  instead of being interpreted. Added a small line-based parser for that
  notation (ReceiptBuilder#raw appends already-resolved bytes verbatim),
  verified byte-for-byte against an example with align/bold/barcode/cut.
2026-09-13 11:21:46 +02:00

57 lines
1.4 KiB
Ruby

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 update(id, name:, content:)
label = find(id)
return nil unless label
label['name'] = name
label['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