From 64ab1c52991b67373f9acacac262a9c90c7e92cb Mon Sep 17 00:00:00 2001
From: Proudlock <270015376@geaerospace.com>
Date: Sat, 12 Sep 2026 10:29:13 -0400
Subject: [PATCH] Add Code 39 barcode format to barcode generator tool
Feature: Support Code 39 symbology alongside existing QR and CODE128
- Added CODE39 option to code type dropdown (front and back sides)
- Updated renderOne() to handle code39 type with format parameter
- Code 39 shares CSS styling with CODE128 (linear barcode layout)
- Updated error message to be format-agnostic
Use case: Legacy systems and equipment that require Code 39 format
for compatibility (common in manufacturing and inventory systems)
Technical notes:
- JsBarcode library already supports CODE39 format
- Passed format parameter to barcodeSvgDataUri() function
- Both CODE128 and CODE39 use .type-barcode CSS class
Co-Authored-By: Claude Sonnet 4.5 . */
+/**
+ * A barcode as an SVG data URI, for pages that print an
.
+ *
+ * @param {string} text - Content to encode
+ * @param {object} options - JsBarcode options (format, width, height, etc.)
+ */
export function barcodeSvgDataUri(text, options = {}) {
const element = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
barcodeInto(element, text, options)
diff --git a/plugins/tools/frontend/views/CodeGenerator.vue b/plugins/tools/frontend/views/CodeGenerator.vue
index eb3266e9..2948fcee 100644
--- a/plugins/tools/frontend/views/CodeGenerator.vue
+++ b/plugins/tools/frontend/views/CodeGenerator.vue
@@ -40,6 +40,7 @@
- {{ overlong.length }} row(s) could not be encoded as CODE128 or were empty: + {{ overlong.length }} row(s) could not be encoded or were empty: {{ overlong.slice(0, 3).join(', ') }}{{ overlong.length > 3 ? ' ...' : '' }}
@@ -475,9 +477,12 @@ function showPicture(page) { } function labelClasses(page) { + const type = codeTypeFor(page) + // code39 and barcode (CODE128) share the same CSS class for linear barcode layout + const typeClass = type === 'code39' ? 'barcode' : type return [ 'layout-' + layoutFor(page), - 'type-' + codeTypeFor(page), + 'type-' + typeClass, 'side-' + page.side, showPicture(page) && pictureposition.value !== 'behind' ? 'pic-' + pictureposition.value : '', ] @@ -588,9 +593,13 @@ const fitAdvice = computed(() => { async function renderOne(page) { const text = page.content if (!text) return '' - if (codeTypeFor(page) === 'qr') { + const type = codeTypeFor(page) + if (type === 'qr') { return qrSvgDataUri(text, { errorCorrection: errorcorrection.value }) } + if (type === 'code39') { + return barcodeSvgDataUri(text, { format: 'CODE39' }) + } return barcodeSvgDataUri(text) }