deploy / deploy (push) Successful in 10s
- 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.
57 lines
1.4 KiB
Ruby
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
|