@bluechaine/print-designer 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/constants.ts","../../src/core/hiprint-paper-list.ts","../../src/constants/default-table-element.ts","../../src/types.ts","../../src/core/svp-element-provider.ts","../../src/core/providers.ts","../../src/core/hiprint-bridge.ts","../../src/core/print-client.ts"],"sourcesContent":["import type { PaperType, ToolDescriptor } from './types'\nimport { PANEL_ICONS, TOOL_ICONS } from './constants/icons'\n\nexport const DESIGN_CONTAINER_ID = 'hiprint-printTemplate'\nexport const SETTING_CONTAINER_ID = 'PrintElementOptionSetting'\nexport const PAGINATION_CLASS = 'hiprint-printPagination'\nexport const PAGINATION_SELECTOR = `.${PAGINATION_CLASS}`\n\nexport const DRAGGABLE_ITEM_CLASS = 'ep-draggable-item'\n\n/** Empty hiprint template JSON used by the JSON editor reset action. */\nexport const EMPTY_TEMPLATE_JSON = { panels: [] as any[] }\n\n/** Canvas zoom limits (fraction of 100%). */\nexport const ZOOM_MIN = 0.1\nexport const ZOOM_MAX = 2\nexport const ZOOM_STEP = 0.1\n\n/** Standard ISO paper sizes (in mm). \"自定义\" (Custom) keeps the current size. */\nexport const DEFAULT_PAPER_LIST: PaperType[] = [\n { type: '自定义', width: 0, height: 0 },\n { type: 'A1', width: 594, height: 841 },\n { type: 'A2', width: 420, height: 594 },\n { type: 'A3', width: 297, height: 420 },\n { type: 'A4', width: 210, height: 297 },\n { type: 'A5', width: 148, height: 210 },\n { type: 'A6', width: 105, height: 148 },\n { type: 'A7', width: 74, height: 105 },\n { type: 'B1', width: 707, height: 1000 },\n { type: 'B2', width: 500, height: 707 },\n { type: 'B3', width: 353, height: 500 },\n { type: 'B4', width: 250, height: 353 },\n { type: 'B5', width: 176, height: 250 },\n { type: 'B6', width: 125, height: 176 },\n { type: 'B7', width: 88, height: 125 },\n]\n\nexport const DEFAULT_FONT_LIST = [\n { title: '默认', value: '' },\n { title: '微软雅黑', value: 'Microsoft YaHei' },\n { title: '黑体', value: 'STHeitiSC-Light' },\n { title: '思源黑体', value: 'SourceHanSansCN-Normal' },\n { title: '宋体', value: 'SimSun' },\n { title: '楷体', value: 'STKaiti' },\n { title: 'Arial', value: 'Arial' },\n { title: 'Tahoma', value: 'Tahoma' },\n]\n\n/** Default drag-element catalogue rendered inside the DraggableEls panel. */\nexport interface ElementCatalogueItem {\n group: string\n key: string\n label: string\n /** Maps to the `tid` consumed by hiprint provider. */\n tid: string\n /** Iconify icon id for the drag tile. */\n icon?: string\n}\n\nexport const DEFAULT_ELEMENT_CATALOGUE: ElementCatalogueItem[] = [\n { group: '常规', key: 'text', label: '文本', tid: 'defaultModule.text' },\n { group: '常规', key: 'image', label: '图片', tid: 'defaultModule.image' },\n { group: '常规', key: 'barcode', label: 'barcode', tid: 'defaultModule.barcode' },\n { group: '常规', key: 'qrcode', label: 'qrcode', tid: 'defaultModule.qrcode' },\n { group: '常规', key: 'table', label: '表格', tid: 'defaultModule.table' },\n { group: '常规', key: 'html', label: 'html', tid: 'defaultModule.html' },\n { group: '辅助', key: 'hline', label: '横线', tid: 'defaultModule.hline' },\n { group: '辅助', key: 'vline', label: '竖线', tid: 'defaultModule.vline' },\n { group: '辅助', key: 'rect', label: '矩形', tid: 'defaultModule.rect' },\n { group: '辅助', key: 'oval', label: '椭圆', tid: 'defaultModule.oval' },\n]\n\n/**\n * 28 toolbar actions as required by `print设计器功能.md`.\n * Click handlers are wired against DesignerUtils, see Toolbar.vue.\n */\nexport const DEFAULT_TOOLBAR: ToolDescriptor[] = [\n { key: 'undo', i18n: 'tool.undo', icon: TOOL_ICONS.undo },\n { key: 'redo', i18n: 'tool.redo', icon: TOOL_ICONS.redo },\n { key: 'sep1', icon: '', separator: true },\n { key: 'alignLeft', i18n: 'tool.alignLeft', icon: TOOL_ICONS.alignLeft, needSelection: true },\n { key: 'alignCenter', i18n: 'tool.alignCenter', icon: TOOL_ICONS.alignCenter, needSelection: true },\n { key: 'alignRight', i18n: 'tool.alignRight', icon: TOOL_ICONS.alignRight, needSelection: true },\n { key: 'alignTop', i18n: 'tool.alignTop', icon: TOOL_ICONS.alignTop, needSelection: true },\n { key: 'alignMiddle', i18n: 'tool.alignMiddle', icon: TOOL_ICONS.alignMiddle, needSelection: true },\n { key: 'alignBottom', i18n: 'tool.alignBottom', icon: TOOL_ICONS.alignBottom, needSelection: true },\n { key: 'sep2', icon: '', separator: true },\n { key: 'moveTop', i18n: 'tool.moveTop', icon: TOOL_ICONS.moveTop, needSelection: true },\n { key: 'moveUp', i18n: 'tool.moveUp', icon: TOOL_ICONS.moveUp, needSelection: true },\n { key: 'moveDown', i18n: 'tool.moveDown', icon: TOOL_ICONS.moveDown, needSelection: true },\n { key: 'moveBottom', i18n: 'tool.moveBottom', icon: TOOL_ICONS.moveBottom, needSelection: true },\n { key: 'sep3', icon: '', separator: true },\n { key: 'flipH', i18n: 'tool.flipH', icon: TOOL_ICONS.flipH, needSelection: true },\n { key: 'flipV', i18n: 'tool.flipV', icon: TOOL_ICONS.flipV, needSelection: true },\n { key: 'sep4', icon: '', separator: true },\n { key: 'fontInc', i18n: 'tool.fontInc', icon: TOOL_ICONS.fontInc, needSelection: true },\n { key: 'fontDec', i18n: 'tool.fontDec', icon: TOOL_ICONS.fontDec, needSelection: true },\n { key: 'fontBold', i18n: 'tool.fontBold', icon: TOOL_ICONS.fontBold, needSelection: true },\n { key: 'fontUnbold', i18n: 'tool.fontUnbold', icon: TOOL_ICONS.fontUnbold, needSelection: true },\n { key: 'sep5', icon: '', separator: true },\n { key: 'lockToggle', display: 'lockToggle', icon: '', needSelection: true },\n { key: 'clone', i18n: 'tool.clone', icon: TOOL_ICONS.clone, needSelection: true },\n { key: 'copy', i18n: 'tool.copy', icon: TOOL_ICONS.copy, needSelection: true },\n { key: 'cut', i18n: 'tool.cut', icon: TOOL_ICONS.cut, needSelection: true },\n { key: 'paste', i18n: 'tool.paste', icon: TOOL_ICONS.paste },\n { key: 'delete', i18n: 'tool.delete', icon: TOOL_ICONS.delete, needSelection: true },\n { key: 'sep6', icon: '', separator: true },\n { key: 'zoomOut', i18n: 'tool.zoomOut', icon: TOOL_ICONS.zoomOut },\n { key: 'zoomPercent', display: 'zoomPercent', icon: '' },\n { key: 'zoomIn', i18n: 'tool.zoomIn', icon: TOOL_ICONS.zoomIn },\n { key: 'rotate', i18n: 'tool.rotate', icon: TOOL_ICONS.rotate, needSelection: true },\n { key: 'clear', i18n: 'tool.clear', icon: TOOL_ICONS.clear },\n { key: 'spacer', icon: '', separator: true },\n { key: 'panelDraggableEls', i18n: 'panel.draggableEls', icon: PANEL_ICONS.draggableEls, panelKey: 'draggableEls' },\n { key: 'panelMiniMap', i18n: 'panel.miniMap', icon: PANEL_ICONS.miniMap, panelKey: 'miniMap' },\n { key: 'panelPageStructure', i18n: 'panel.pageStructure', icon: PANEL_ICONS.pageStructure, panelKey: 'pageStructure' },\n { key: 'panelPageHistory', i18n: 'panel.pageHistory', icon: PANEL_ICONS.pageHistory, panelKey: 'pageHistory' },\n { key: 'panelProperties', i18n: 'panel.properties', icon: PANEL_ICONS.properties, panelKey: 'properties' },\n { key: 'sepPanels', icon: '', separator: true },\n { key: 'togglePanels', i18n: 'tool.togglePanels', icon: TOOL_ICONS.toggle },\n { key: 'sepLang', icon: '', separator: true },\n { key: 'langSelect', display: 'langSelect', icon: '' },\n]\n\nexport const STORAGE_PREFIX = 'svp:'\n","import { hiprint } from './hiprint-bridge'\nimport { DEFAULT_PAPER_LIST, DESIGN_CONTAINER_ID, SETTING_CONTAINER_ID } from '../constants'\nimport type { PaperType } from '../types'\n\nexport interface PaperListValue {\n type: string\n width: number\n height: number\n}\n\nlet defaultPaperList: PaperType[] = DEFAULT_PAPER_LIST\nlet patched = false\nconst templateRegistry = new Map<string, any>()\n\nexport function registerPrintTemplate(tpl: any) {\n const id = tpl?.id ?? tpl?.templateId\n if (id != null) templateRegistry.set(String(id), tpl)\n}\n\nfunction getJQuery(): any {\n return (window as any).jQuery || (window as any).$\n}\n\nexport function nearMm(a: number, b: number, eps = 1.5): boolean {\n return Math.abs(a - b) <= eps\n}\n\nexport function detectPaperType(\n width: number,\n height: number,\n list: PaperType[] = defaultPaperList,\n): string {\n const match = list.find(\n (p) => p.width > 0 && (\n (nearMm(p.width, width) && nearMm(p.height, height))\n || (nearMm(p.width, height) && nearMm(p.height, width))\n ),\n )\n return match?.type || '自定义'\n}\n\nfunction resolveTemplate(tplId: string): any | null {\n const cached = templateRegistry.get(tplId)\n if (cached) return cached\n try {\n const lib = (hiprint as any)?.instance ?? (hiprint as any)\n return lib?.getPrintTemplateById?.(tplId) ?? null\n } catch {\n return null\n }\n}\n\nexport function getTemplatePaperList(tpl?: any): PaperType[] {\n if (tpl?.getPaperList) {\n try {\n const list = tpl.getPaperList()\n if (Array.isArray(list) && list.length) return list\n } catch { /* ignore */ }\n }\n return defaultPaperList\n}\n\nexport function applyPaperList(\n tpl: any,\n value: PaperListValue,\n onApplied?: () => void,\n) {\n if (!tpl?.setPaper || !value) return\n const list = getTemplatePaperList(tpl)\n try {\n const preset = value.type !== '自定义'\n ? list.find((p) => p.type === value.type && p.width > 0)\n : null\n if (preset) {\n tpl.setPaper(String(preset.width), String(preset.height))\n } else if (value.width > 0 && value.height > 0) {\n tpl.setPaper(String(value.width), String(value.height))\n } else {\n return\n }\n const panel = tpl.editingPanel\n if (panel) panel.paperType = value.type || '自定义'\n onApplied?.()\n } catch (e) {\n console.warn('[hiprint-paper-list] setPaper failed', e)\n }\n}\n\nfunction buildPaperListValue(panel: any, list: PaperType[]): PaperListValue {\n const width = Number(panel?.mmwidth ?? panel?.width ?? 0)\n const height = Number(panel?.mmheight ?? panel?.height ?? 0)\n return {\n type: detectPaperType(width, height, list),\n width,\n height,\n }\n}\n\n/** Hiprint panel option item — 纸张列表 + 宽 + 高 (mm). */\nfunction PaperListOptionItem(this: any) {\n this.name = 'paperList'\n}\n\nPaperListOptionItem.prototype.createTarget = function (printTemplate: any) {\n const $ = getJQuery()\n if (!$) return $('<div />')\n\n this.printTemplate = printTemplate\n const wrapper = $('<div class=\"svp-hiprint-paper-list\" />')\n\n const typeRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">纸张列表</div>\n <div class=\"hiprint-option-item-field\">\n <select class=\"auto-submit svp-paper-type\"></select>\n </div>\n </div>`)\n\n const widthRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">宽</div>\n <div class=\"hiprint-option-item-field\">\n <input class=\"auto-submit svp-paper-width\" type=\"number\" min=\"1\" placeholder=\"宽(mm)\" />\n </div>\n </div>`)\n\n const heightRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">高</div>\n <div class=\"hiprint-option-item-field\">\n <input class=\"auto-submit svp-paper-height\" type=\"number\" min=\"1\" placeholder=\"高(mm)\" />\n </div>\n </div>`)\n\n this.typeSelect = typeRow.find('select')\n this.widthInput = widthRow.find('input')\n this.heightInput = heightRow.find('input')\n\n const list = getTemplatePaperList(printTemplate)\n list.forEach((p) => {\n this.typeSelect.append(\n $('<option />').attr('value', p.type).text(p.type),\n )\n })\n\n this.typeSelect.on('change', () => {\n const preset = list.find((p) => p.type === this.typeSelect.val())\n if (preset && preset.width > 0) {\n this.widthInput.val(preset.width)\n this.heightInput.val(preset.height)\n }\n })\n\n wrapper.append(typeRow, widthRow, heightRow)\n this.target = wrapper\n return wrapper\n}\n\nPaperListOptionItem.prototype.getValue = function (): PaperListValue {\n return {\n type: String(this.typeSelect?.val() || '自定义'),\n width: Number(this.widthInput?.val()) || 0,\n height: Number(this.heightInput?.val()) || 0,\n }\n}\n\nPaperListOptionItem.prototype.setValue = function (value: PaperListValue) {\n if (!value) return\n const $ = getJQuery()\n if (!$) return\n const list = getTemplatePaperList(this.printTemplate)\n list.forEach((p) => {\n if (!this.typeSelect.find(`option[value=\"${p.type}\"]`).length) {\n this.typeSelect.append($('<option />').attr('value', p.type).text(p.type))\n }\n })\n this.typeSelect.val(value.type || detectPaperType(value.width, value.height, list))\n this.widthInput.val(value.width || '')\n this.heightInput.val(value.height || '')\n}\n\nPaperListOptionItem.prototype.destroy = function () {\n this.target?.remove?.()\n}\n\n/** Hiprint panel option item — 打印方向 + 提示文案. */\nfunction OrientOptionItem(this: any) {\n this.name = 'orient'\n}\n\nOrientOptionItem.prototype.createTarget = function () {\n const $ = getJQuery()\n if (!$) return $('<div />')\n\n const wrapper = $('<div class=\"svp-hiprint-orient\" />')\n wrapper.append(\n $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">打印方向</div>\n <div class=\"hiprint-option-item-field\">\n <select class=\"auto-submit\">\n <option value=\"\">默认</option>\n <option value=\"1\">纵向</option>\n <option value=\"2\">横向</option>\n </select>\n </div>\n </div>`),\n )\n wrapper.append(\n $('<div class=\"hiprint-option-item-desc\">(仅自定义纸质有效)</div>'),\n )\n this.target = wrapper\n return this.target\n}\n\nOrientOptionItem.prototype.getValue = function () {\n const val = this.target?.find?.('select')?.val?.()\n if (val === '' || val == null) return undefined\n return parseFloat(String(val))\n}\n\nOrientOptionItem.prototype.setValue = function (value: any) {\n this.target?.find?.('select')?.val?.(value ?? '')\n}\n\nOrientOptionItem.prototype.destroy = function () {\n this.target?.remove?.()\n}\n\nconst WATERMARK_TIME_FORMATS = [\n 'YYYY-MM-DD HH:mm:ss',\n 'YYYY-MM-DD HH:mm',\n 'YYYY-MM-DD HH',\n 'YYYY-MM-DD',\n 'YYYY-MMMM',\n 'YYYY-MM',\n 'YYYY',\n]\n\n/** Hiprint panel option item — 水印功能 (one label + control per row). */\nfunction WatermarkOptionItem(this: any) {\n this.name = 'watermarkOptions'\n}\n\nWatermarkOptionItem.prototype.createTarget = function () {\n const $ = getJQuery()\n if (!$) return $('<div />')\n\n const wrapper = $('<div class=\"svp-hiprint-watermark\" />')\n wrapper.append($('<div class=\"hiprint-option-title\">水印功能</div>'))\n\n const contentRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">水印内容</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"text\" class=\"auto-submit\" placeholder=\"水印内容\" />\n </div>\n </div>`)\n\n const fillStyleRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">字体颜色</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"text\" class=\"auto-submit\" data-format=\"rgb\" data-opacity=\"0.3\" placeholder=\"字体颜色\" />\n </div>\n </div>`)\n\n const fontSizeRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">字体大小</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"range\" class=\"auto-submit\" min=\"10\" max=\"80\" placeholder=\"字体大小\" />\n </div>\n </div>`)\n\n const rotateRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">旋转角度</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"range\" class=\"auto-submit\" min=\"0\" max=\"180\" placeholder=\"旋转角度\" />\n </div>\n </div>`)\n\n const widthRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">水平密度</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"range\" class=\"auto-submit\" min=\"100\" max=\"800\" placeholder=\"水平密度\" />\n </div>\n </div>`)\n\n const heightRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">垂直密度</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"range\" class=\"auto-submit\" min=\"100\" max=\"800\" placeholder=\"垂直密度\" />\n </div>\n </div>`)\n\n const timestampRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">水印时间</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"checkbox\" class=\"auto-submit\" placeholder=\"水印时间\" />\n </div>\n </div>`)\n\n const formatRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">时间格式</div>\n <div class=\"hiprint-option-item-field\">\n <select class=\"auto-submit\"></select>\n </div>\n </div>`)\n\n const formatSelect = formatRow.find('select')\n formatSelect.append($('<option value=\"\">默认(YYYY-MM-DD HH:mm)</option>'))\n WATERMARK_TIME_FORMATS.forEach((fmt) => {\n formatSelect.append($(`<option value=\"${fmt}\">${fmt}</option>`))\n })\n\n wrapper.append(\n contentRow,\n fillStyleRow,\n fontSizeRow,\n rotateRow,\n widthRow,\n heightRow,\n timestampRow,\n formatRow,\n )\n\n this.content = contentRow.find('input')\n this.fillStyle = fillStyleRow.find('input')\n this.fontSize = fontSizeRow.find('input')\n this.rotate = rotateRow.find('input')\n this.width = widthRow.find('input')\n this.height = heightRow.find('input')\n this.timestamp = timestampRow.find('input')\n this.format = formatSelect\n this.target = wrapper\n return this.target\n}\n\nWatermarkOptionItem.prototype.getValue = function () {\n const format = this.format?.val?.()\n return {\n content: this.content?.val?.() || '',\n fillStyle: this.fillStyle?.val?.() || 'rgba(184, 184, 184, 0.3)',\n fontSize: `${parseInt(String(this.fontSize?.val?.() || '14'), 10)}px`,\n rotate: parseInt(String(this.rotate?.val?.() || '25'), 10),\n width: parseInt(String(this.width?.val?.() || '200'), 10),\n height: parseInt(String(this.height?.val?.() || '200'), 10),\n timestamp: !!this.timestamp?.is?.(':checked'),\n format: format ? String(format) : 'YYYY-MM-DD HH:mm',\n }\n}\n\nWatermarkOptionItem.prototype.setValue = function (value: any) {\n if (!value) value = {}\n this.content?.val?.(value.content || '')\n this.fillStyle?.val?.(value.fillStyle || 'rgba(184, 184, 184, 0.3)')\n try {\n this.fillStyle?.minicolors?.({\n format: 'rgb',\n opacity: true,\n theme: 'bootstrap',\n })\n } catch { /* minicolors optional until plugin ready */ }\n\n const fontSize = parseInt(String(value.fontSize || '14').replace(/px$/i, ''), 10) || 14\n this.fontSize?.val?.(fontSize)\n this.rotate?.val?.(value.rotate ?? 25)\n this.width?.val?.(value.width ?? 200)\n this.height?.val?.(value.height ?? 200)\n this.timestamp?.prop?.('checked', value.timestamp != null ? !!value.timestamp : false)\n this.format?.val?.(value.format || 'YYYY-MM-DD HH:mm')\n}\n\nWatermarkOptionItem.prototype.destroy = function () {\n this.target?.remove?.()\n}\n\n/** Hiprint panel / element option — 背景颜色 (row + minicolors). */\nfunction PanelBackgroundColorOptionItem(this: any) {\n this.name = 'backgroundColor'\n}\n\nPanelBackgroundColorOptionItem.prototype.createTarget = function () {\n const $ = getJQuery()\n if (!$) return $('<div />')\n\n const row = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">背景颜色</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"text\" class=\"auto-submit\" />\n </div>\n </div>`)\n\n this.input = row.find('input')\n this.target = row\n return this.target\n}\n\nPanelBackgroundColorOptionItem.prototype.getValue = function () {\n const val = this.input?.val?.()\n return val ? String(val) : undefined\n}\n\nPanelBackgroundColorOptionItem.prototype.setValue = function (value: any) {\n const color = value || '#ffffff'\n try {\n this.input?.minicolors?.({\n defaultValue: color,\n theme: 'bootstrap',\n })\n } catch { /* minicolors optional until plugin ready */ }\n this.input?.val?.(color)\n}\n\nPanelBackgroundColorOptionItem.prototype.css = function (target: any, value: any) {\n const $ = getJQuery()\n if (!$ || !target?.length) return null\n if (value) {\n $(target).css('background-color', value)\n return `background-color:${value}`\n }\n target[0].style.backgroundColor = ''\n return null\n}\n\nPanelBackgroundColorOptionItem.prototype.destroy = function () {\n this.target?.remove?.()\n}\n\nexport function applyPanelBackgroundColor(panel: any, color?: string) {\n if (!panel) return\n const value = color || '#ffffff'\n panel.backgroundColor = value\n const $ = getJQuery()\n const paper = panel.designPaper?.target\n || panel.target?.find?.('.hiprint-printPaper')\n || ($ && panel.target ? $(panel.target).find('.hiprint-printPaper') : null)\n if (paper?.css) {\n paper.css('background-color', value)\n } else if (paper?.length && paper[0]?.style) {\n paper[0].style.backgroundColor = value\n }\n}\n\n/** Hiprint panel option item — 排列填充纸张. */\nfunction PanelLayoutOptionItem(this: any) {\n this.name = 'panelLayoutOptions'\n}\n\nPanelLayoutOptionItem.prototype.createTarget = function () {\n const $ = getJQuery()\n if (!$) return $('<div />')\n\n const wrapper = $('<div class=\"svp-hiprint-panel-layout\" />')\n wrapper.append($('<div class=\"hiprint-option-title\">排列填充纸张</div>'))\n wrapper.append(\n $('<div class=\"hiprint-option-item-desc svp-panel-layout-hint\">小模板传数组&填充纸张宽高打印</div>'),\n )\n\n const layoutTypeRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">排列方式</div>\n <div class=\"hiprint-option-item-field\">\n <select class=\"auto-submit\">\n <option value=\"column\">纵向</option>\n <option value=\"row\">横向</option>\n </select>\n </div>\n </div>`)\n\n const layoutRowGapRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">垂直间距</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"number\" class=\"auto-submit\" placeholder=\"垂直间距mm\" />\n </div>\n </div>`)\n\n const layoutColumnGapRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">水平间距</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"number\" class=\"auto-submit\" placeholder=\"水平间距mm\" />\n </div>\n </div>`)\n\n const paperWidthRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">纸张宽度</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"number\" class=\"auto-submit\" placeholder=\"纸张宽度mm\" />\n </div>\n </div>`)\n\n const paperHeightRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">纸张高度</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"number\" class=\"auto-submit\" placeholder=\"纸张高度mm\" />\n </div>\n </div>`)\n\n const paperStyleRow = $(`<div class=\"hiprint-option-item hiprint-option-item-row\">\n <div class=\"hiprint-option-item-label\">纸张样式</div>\n <div class=\"hiprint-option-item-field\">\n <input type=\"text\" class=\"auto-submit\" placeholder=\"align-content:center;justify-content:center\" />\n </div>\n </div>`)\n\n wrapper.append(\n layoutTypeRow,\n layoutRowGapRow,\n layoutColumnGapRow,\n paperWidthRow,\n paperHeightRow,\n paperStyleRow,\n )\n\n this.layoutType = layoutTypeRow.find('select')\n this.layoutRowGap = layoutRowGapRow.find('input')\n this.layoutColumnGap = layoutColumnGapRow.find('input')\n this.paperWidth = paperWidthRow.find('input')\n this.paperHeight = paperHeightRow.find('input')\n this.paperStyle = paperStyleRow.find('input')\n this.target = wrapper\n return this.target\n}\n\nPanelLayoutOptionItem.prototype.getValue = function () {\n const num = (el: any) => parseInt(String(el?.val?.() || 0), 10) || 0\n return {\n layoutType: this.layoutType?.val?.() || 'column',\n layoutRowGap: num(this.layoutRowGap),\n layoutColumnGap: num(this.layoutColumnGap),\n paperWidth: num(this.paperWidth),\n paperHeight: num(this.paperHeight),\n paperStyle: this.paperStyle?.val?.() || '',\n }\n}\n\nPanelLayoutOptionItem.prototype.setValue = function (value: any) {\n if (!value) return\n this.layoutType?.val?.(value.layoutType || 'column')\n this.layoutRowGap?.val?.(value.layoutRowGap ?? '')\n this.layoutColumnGap?.val?.(value.layoutColumnGap ?? '')\n this.paperWidth?.val?.(value.paperWidth ?? '')\n this.paperHeight?.val?.(value.paperHeight ?? '')\n this.paperStyle?.val?.(value.paperStyle ?? '')\n}\n\nPanelLayoutOptionItem.prototype.destroy = function () {\n this.target?.remove?.()\n}\n\nfunction reorderPanelSettingOptions(\n options: Record<string, any>,\n panel: any,\n paperList: PaperListValue,\n) {\n const {\n paperList: _pl,\n panelLayoutOptions,\n backgroundColor: _bg,\n watermarkOptions,\n ...rest\n } = options\n\n return {\n paperList,\n ...rest,\n backgroundColor: panel.backgroundColor ?? _bg ?? '#ffffff',\n watermarkOptions,\n panelLayoutOptions,\n }\n}\n\nfunction ensurePaperListSupportOptionsFirst() {\n try {\n const cfg = (window as any).HIPRINT_CONFIG\n const instanceOpts = (hiprint as any)?.instance?.panel?.supportOptions\n const cfgOpts = cfg?.panel?.supportOptions\n const opts = instanceOpts || cfgOpts\n if (!Array.isArray(opts)) return\n const idx = opts.findIndex((o: any) => o.name === 'paperList')\n if (idx > 0) {\n const [item] = opts.splice(idx, 1)\n opts.unshift(item)\n } else if (idx < 0) {\n opts.unshift({ name: 'paperList', hidden: false })\n }\n if (!opts.some((o: any) => o.name === 'backgroundColor')) {\n const wmIdx = opts.findIndex((o: any) => o.name === 'watermarkOptions')\n const entry = { name: 'backgroundColor', hidden: false }\n if (wmIdx >= 0) opts.splice(wmIdx, 0, entry)\n else opts.push(entry)\n }\n } catch { /* ignore */ }\n}\n\nfunction patchPrintTemplatePaperList() {\n const proto = hiprint.PrintTemplate?.prototype\n if (!proto || proto.__svpPaperListPatched) return\n\n proto.setPaperList = function (list: PaperType[]) {\n this._paperList = Array.isArray(list) && list.length ? list : defaultPaperList\n }\n proto.getPaperList = function (): PaperType[] {\n return this._paperList || defaultPaperList\n }\n proto.__svpPaperListPatched = true\n}\n\nfunction patchPanelSettingTrigger(onPaperApplied?: (tpl: any) => void) {\n const bus = (window as any).hinnn?.event\n if (!bus || bus.__svpPaperListTriggerPatch) return\n\n const origTrigger = bus.trigger.bind(bus)\n bus.trigger = function (key: string, ...args: any[]) {\n if (\n typeof key === 'string'\n && key.startsWith('BuildCustomOptionSettingEventKey_')\n && args[0]?.options\n ) {\n const tplId = key.slice('BuildCustomOptionSettingEventKey_'.length)\n const tpl = resolveTemplate(tplId)\n const panel = tpl?.editingPanel\n if (panel) {\n const payload = args[0]\n const list = getTemplatePaperList(tpl)\n const paperList = buildPaperListValue(panel, list)\n payload.options = reorderPanelSettingOptions(payload.options, panel, paperList)\n const origCallback = payload.callback\n payload.callback = (values: any) => {\n if (values?.paperList && tpl) {\n applyPaperList(tpl, values.paperList, () => onPaperApplied?.(tpl))\n }\n if (values && 'backgroundColor' in values) {\n applyPanelBackgroundColor(panel, values.backgroundColor)\n }\n origCallback?.(values)\n }\n }\n }\n return origTrigger(key, ...args)\n }\n bus.__svpPaperListTriggerPatch = true\n}\n\n/**\n * Register paper-list panel options into hiprint (sv-print compatible).\n * Call once during hiprint init.\n */\nexport function setupHiprintPaperList(\n paperList: PaperType[] = DEFAULT_PAPER_LIST,\n onPaperApplied?: (tpl: any) => void,\n) {\n defaultPaperList = paperList.length ? paperList : DEFAULT_PAPER_LIST\n if (patched) return\n\n patchPrintTemplatePaperList()\n patchPanelSettingTrigger(onPaperApplied)\n\n try {\n hiprint.setConfig({\n optionItems: [\n PaperListOptionItem as any,\n OrientOptionItem as any,\n PanelBackgroundColorOptionItem as any,\n WatermarkOptionItem as any,\n PanelLayoutOptionItem as any,\n ],\n panel: {\n supportOptions: [\n { name: 'paperList', hidden: false },\n { name: 'backgroundColor', hidden: false },\n ],\n },\n })\n ensurePaperListSupportOptionsFirst()\n } catch (e) {\n console.warn('[hiprint-paper-list] setConfig failed', e)\n }\n\n patched = true\n}\n\nexport function assignTemplatePaperList(tpl: any, paperList?: PaperType[]) {\n if (!tpl?.setPaperList) return\n tpl.setPaperList(paperList?.length ? paperList : defaultPaperList)\n}\n\n/** Open panel-level hiprint settings (same as clicking blank paper). */\nexport function openPanelSetting() {\n if (typeof window === 'undefined') return\n\n const tryOpen = (attempt = 0) => {\n const $ = getJQuery()\n const host = document.getElementById(SETTING_CONTAINER_ID)\n const paper = document.querySelector(\n `#${DESIGN_CONTAINER_ID} .hiprint-printPaper`,\n ) as HTMLElement | null\n\n if (paper && host) {\n if ($) {\n $(paper).trigger('click')\n } else {\n paper.click()\n }\n return\n }\n\n if (attempt < 20) {\n requestAnimationFrame(() => tryOpen(attempt + 1))\n }\n }\n\n tryOpen()\n}\n","/** Table field list used when dragging a new table onto the canvas. */\nexport const DEFAULT_TABLE_FIELDS = [\n { text: 'id', field: 'id' },\n { text: '姓名', field: 'name' },\n { text: '性别', field: 'gender' },\n { text: '数量', field: 'count' },\n] as const\n\n/** Column layout from `template.json` — applied to `defaultModule.table`. */\nexport const DEFAULT_TABLE_COLUMNS = [\n [\n {\n width: 102.30000000000001,\n checked: true,\n fixed: false,\n rowspan: 1,\n colspan: 1,\n },\n {\n width: 102.30000000000001,\n title: '姓名',\n field: 'name',\n checked: true,\n columnId: 'name',\n fixed: false,\n rowspan: 1,\n colspan: 1,\n align: 'center',\n tableSummary: 'count',\n },\n {\n width: 102.30000000000001,\n title: '数量',\n field: 'count',\n checked: true,\n columnId: 'count',\n fixed: false,\n rowspan: 1,\n colspan: 1,\n align: 'center',\n tableSummary: 'sum',\n },\n {\n width: 102.30000000000001,\n checked: true,\n fixed: false,\n rowspan: 1,\n colspan: 1,\n },\n {\n width: 102.30000000000001,\n checked: true,\n fixed: false,\n rowspan: 1,\n colspan: 1,\n },\n {\n width: 85.25,\n title: '性别',\n field: 'gender',\n checked: false,\n columnId: 'gender',\n fixed: false,\n rowspan: 1,\n colspan: 1,\n },\n ],\n] as const\n\n/** Overrides merged into hiprint `defaultModule.table` element type. */\nexport const DEFAULT_TABLE_ELEMENT_TYPE = {\n tid: 'defaultModule.table',\n title: '表格',\n type: 'table',\n field: 'table',\n tableFooterRepeat: '',\n fields: DEFAULT_TABLE_FIELDS.map((f) => ({ ...f })),\n columns: DEFAULT_TABLE_COLUMNS.map((row) => row.map((col) => ({ ...col }))),\n editable: true,\n columnDisplayEditable: true,\n columnDisplayIndexEditable: true,\n columnTitleEditable: true,\n columnResizable: true,\n columnAlignEditable: true,\n isEnableEditField: true,\n isEnableContextMenu: true,\n isEnableInsertRow: true,\n isEnableDeleteRow: true,\n isEnableInsertColumn: true,\n isEnableDeleteColumn: true,\n isEnableMergeCell: true,\n groupFields: [] as string[],\n groupFooterFormatter: undefined as undefined,\n}\n","/**\n * Public types for vue3-print-designer.\n *\n * These mirror the shape of the sv-print component contract so that\n * existing templates and plugin authors can migrate with minimal friction.\n */\n\n/** A daisyUI-style theme descriptor. */\nexport interface ThemeType {\n /** Theme name. When omitted a stable hash of the colors is used. */\n theme?: string\n primaryColor: string\n primaryContent?: string\n secondaryColor?: string\n secondaryContent?: string\n accentColor?: string\n accentContent?: string\n neutralColor?: string\n neutralContent?: string\n base100?: string\n base200?: string\n base300?: string\n baseContent?: string\n info?: string\n infoContent?: string\n success?: string\n successContent?: string\n warning?: string\n warningContent?: string\n error?: string\n errorContent?: string\n}\n\n/** Configures how a single floating panel (DragBox) shows up. */\nexport type DragBoxMode = 'default' | 'top' | 'left' | 'bottom' | 'right' | 'fixed'\n\nexport interface DragBoxStyleOptions {\n mode?: DragBoxMode\n /** Inline css string. */\n style?: string\n /** Initial visibility. */\n show?: boolean\n /** Title shown in the header. */\n title?: string\n /** Other free-form payload available in slots. */\n other?: Record<string, unknown>\n}\n\n/** Per-panel style/visibility overrides. */\nexport interface StyleOption {\n paperBox?: DragBoxStyleOptions\n panels?: DragBoxStyleOptions\n draggableEls?: DragBoxStyleOptions\n options?: DragBoxStyleOptions\n pageStructure?: DragBoxStyleOptions\n history?: DragBoxStyleOptions\n miniMap?: DragBoxStyleOptions\n editableTools?: DragBoxStyleOptions\n zIndexTools?: DragBoxStyleOptions\n fontTools?: DragBoxStyleOptions\n zoomTools?: DragBoxStyleOptions\n rotateTools?: DragBoxStyleOptions\n}\n\n/** Header / toolbar / footer visibility switches. */\nexport interface ShowOption {\n showHeader?: boolean\n showToolbar?: boolean\n showFooter?: boolean\n showPower?: boolean\n}\n\nexport interface PaperType {\n type: string\n width: number\n height: number\n}\n\nexport interface ProviderMap {\n /** CSS selector hiprint should fill with draggable items. */\n container: string\n /** Provider value (typically the tid prefix). */\n value: string\n render?: (e: any[]) => any\n}\n\nexport interface PreviewOptions {\n showPdf?: boolean\n showImg?: boolean\n /** Show browser print button (window.print dialog). Default true. */\n showBrowserPrint?: boolean\n /** Show silent print (print2) button. Default false. */\n showPrint2?: boolean\n /** Alias of `showPrint2`. */\n showSilentPrint?: boolean\n /** Show batch print button (browser, no electron-hiprint). Default true. */\n showBatchPrint?: boolean\n /**\n * Show the print-client connect bar (status + connect button + printer\n * dropdown). Default false. When enabling silent print (`showPrint2`),\n * this bar is shown automatically.\n */\n showPrintClient?: boolean\n /** Default copies value for the batch input. Default 1. */\n defaultCopies?: number\n}\n\n// ---------------------------------------------------------------------------\n// Silent print / PrintClient\n// ---------------------------------------------------------------------------\n\nexport interface PrintClientConnectOptions {\n /** electron-hiprint host, e.g. `http://localhost:17521`. */\n host?: string\n token?: string\n /** Connection timeout in ms. Default 10000. */\n timeout?: number\n}\n\nexport interface PrintClientStatus {\n connected: boolean\n message?: string\n}\n\nexport interface PrinterInfo {\n name: string\n displayName?: string\n isDefault?: boolean\n /** Raw payload from hiprint when present. */\n [key: string]: unknown\n}\n\nexport interface ClientInfo {\n id?: string\n name?: string\n /** Raw payload from hiprint when present. */\n [key: string]: unknown\n}\n\nexport interface Print2Options {\n printer?: string\n title?: string\n /** Target client id when using transit proxy. */\n client?: string\n printByFragments?: boolean\n generateHTMLInterval?: number\n fragmentSize?: number\n sendInterval?: number\n /** Extra options forwarded to hiprint print2. */\n [key: string]: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Plugin / hook system (mirrors sv-print)\n// ---------------------------------------------------------------------------\n\nexport type Hook =\n | 'init'\n | 'ready'\n | 'documentShortcutKeys'\n | 'shortcutKeys'\n | 'createPrintElement'\n | 'beforePrint'\n | 'beforePrint2'\n | 'getOptionItem'\n | 'onDesigned'\n | 'onPreview'\n | 'newPrintTemplate'\n | 'newPanel'\n | (string & {})\n\nexport interface HookOptions {\n hook: Hook\n name: string\n description?: string\n priority?: number\n run: (...args: any[]) => any | Promise<any>\n}\n\nexport interface PluginOptions {\n name: string\n description?: string\n init?: (input: any) => any\n hooks: HookOptions[]\n config?: Record<string, unknown>\n leastHiprintVersion?: string\n}\n\n/** Convenience factory typing for plugin authors. */\nexport type PluginFactory<T = unknown> = (opts?: T) => PluginOptions\n\n/** A `Provider` adds custom draggable element types into hiprint. */\nexport abstract class Provider {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n abstract addElementTypes(ctx: any): void\n}\n\n// ---------------------------------------------------------------------------\n// Designer / event surface\n// ---------------------------------------------------------------------------\n\nexport interface Events {\n onSave?: (key: string, data: any) => boolean | void\n onEdit?: (data: any) => boolean | void\n onEditData?: (data: any) => boolean | void\n onKeyDownEvent?: (e: KeyboardEvent, utils: any) => boolean | void\n}\n\nexport interface DesignOptions {\n grid?: boolean\n activePanel?: boolean\n adaptToSize?: boolean\n}\n\nexport interface DesignerPrintTemplateOptions {\n template: any\n fontList?: any[]\n fields?: any[]\n onImageChooseClick?: (target: any) => void\n onZoomChange?: (scale: number) => void\n onPanelAddClick?: (panel: any, createPanel: any) => void\n onFunctionClick?: (option: any, printElement: any, event: any) => void\n dataMode?: 1 | 2\n history?: boolean\n onDataChanged?: (type: string, json: any) => void\n onUpdateError?: (e: any) => void\n settingContainer?: string\n designContainer?: string\n paginationContainer?: string\n}\n\nexport interface RulerStyle {\n show?: boolean\n scale?: number\n backgroundColor?: string\n fontColor?: string\n fontSize?: number\n tickColor?: string\n paperRectColor?: string\n}\n\n/** Public props accepted by <Designer />. */\nexport interface DesignerProps {\n autoConnect?: boolean\n config?: any\n providers?: Provider[]\n providerMap?: ProviderMap | ProviderMap[]\n plugins?: PluginOptions[]\n /** Either a template JSON or template options object. */\n template?: any\n templateOptions?: DesignerPrintTemplateOptions\n designOptions?: DesignOptions\n printData?: any\n templateKey?: string\n title?: string\n authKey?: string\n headerLogoHtml?: string\n headerTitle?: string\n headerNewEle?: boolean\n headerEleList?: HeaderEle[]\n headerNewMenu?: boolean\n headerMenuList?: HeaderMenu[]\n events?: Events\n tags?: string[]\n styleOption?: StyleOption\n showOption?: ShowOption\n paperList?: PaperType[]\n theme?: string | ThemeType | ThemeType[]\n themeList?: string[]\n pageStructureGridMode?: boolean\n miniMapOriginMode?: boolean\n rulerStyle?: RulerStyle\n previewOptions?: PreviewOptions\n onPreviewClick?: (e: MouseEvent) => boolean | void\n onZoomChange?: (scale: number) => void\n onImageChooseClick?: (target: any) => void\n customDataFun?: (data: any, field: string, printData?: any) => string | number | object\n onPanelAddClick?: (panel: any, createPanel: any) => void\n onFunctionClick?: (option: any, printElement: any, event: any) => void\n onBeforeDragIn?: (printTemplate: any, panel: any, printElement: any) => boolean | void\n}\n\n/** Custom item inside the Header element-category bar. */\nexport interface HeaderEle {\n key: string\n label: string\n /** Iconify icon id or legacy inline SVG. */\n icon?: string\n tid?: string\n onClick?: (e: MouseEvent) => void\n}\n\n/** Header dropdown menu entry. */\nexport interface HeaderMenu {\n key: string\n label: string\n icon?: string\n onClick?: () => void\n children?: HeaderMenu[]\n}\n\n/** Internal: tool descriptor used by Toolbar.vue. */\nexport interface ToolDescriptor {\n key: string\n /** i18n key for tooltip. */\n i18n?: string\n /** Direct label, takes precedence over `i18n`. */\n label?: string\n /** Iconify icon id (e.g. `lucide:copy`) or legacy inline SVG markup. */\n icon: string\n /** When true the tool is rendered as a separator. */\n separator?: boolean\n /** Hide the tool. */\n hidden?: boolean\n /** Disabled when there is no current selection. */\n needSelection?: boolean\n /** Only on mobile. */\n mobileOnly?: boolean\n /** Hidden on mobile. */\n desktopOnly?: boolean\n /** Toggle a floating panel's visibility. */\n panelKey?: 'draggableEls' | 'miniMap' | 'pageStructure' | 'pageHistory' | 'properties'\n /** Render as a read-only label instead of a button. */\n display?: 'zoomPercent' | 'langSelect' | 'lockToggle'\n /** Click handler runs against DesignerUtils. */\n onClick?: (utils: any, ev: MouseEvent) => void\n}\n\nexport type Lang = 'zh-CN' | 'en-US' | (string & {})\n\nexport interface DesignedEventPayload {\n hiprint: any\n designerUtils: any\n}\n","import { defaultElementTypeProvider } from 'vue-plugin-hiprint'\nimport { DEFAULT_TABLE_ELEMENT_TYPE } from '../constants/default-table-element'\nimport { Provider } from '../types'\n\nconst TABLE_TID = 'defaultModule.table'\n\nfunction rebuildTableColumns(type: any) {\n if (typeof type.createTableColumnArray !== 'function') return\n type.columns = []\n DEFAULT_TABLE_ELEMENT_TYPE.columns.forEach((row) => {\n type.columns.push(type.createTableColumnArray(row.map((col) => ({ ...col }))))\n })\n if (typeof type.makeColumnObj === 'function') {\n type.columnObj = type.makeColumnObj()\n }\n}\n\nfunction applyCustomTableType(current: any) {\n Object.assign(current, {\n title: DEFAULT_TABLE_ELEMENT_TYPE.title,\n type: DEFAULT_TABLE_ELEMENT_TYPE.type,\n field: DEFAULT_TABLE_ELEMENT_TYPE.field,\n fields: DEFAULT_TABLE_ELEMENT_TYPE.fields.map((f) => ({ ...f })),\n editable: DEFAULT_TABLE_ELEMENT_TYPE.editable,\n columnDisplayEditable: DEFAULT_TABLE_ELEMENT_TYPE.columnDisplayEditable,\n columnDisplayIndexEditable: DEFAULT_TABLE_ELEMENT_TYPE.columnDisplayIndexEditable,\n columnTitleEditable: DEFAULT_TABLE_ELEMENT_TYPE.columnTitleEditable,\n columnResizable: DEFAULT_TABLE_ELEMENT_TYPE.columnResizable,\n columnAlignEditable: DEFAULT_TABLE_ELEMENT_TYPE.columnAlignEditable,\n isEnableEditField: DEFAULT_TABLE_ELEMENT_TYPE.isEnableEditField,\n isEnableContextMenu: DEFAULT_TABLE_ELEMENT_TYPE.isEnableContextMenu,\n isEnableInsertRow: DEFAULT_TABLE_ELEMENT_TYPE.isEnableInsertRow,\n isEnableDeleteRow: DEFAULT_TABLE_ELEMENT_TYPE.isEnableDeleteRow,\n isEnableInsertColumn: DEFAULT_TABLE_ELEMENT_TYPE.isEnableInsertColumn,\n isEnableDeleteColumn: DEFAULT_TABLE_ELEMENT_TYPE.isEnableDeleteColumn,\n isEnableMergeCell: DEFAULT_TABLE_ELEMENT_TYPE.isEnableMergeCell,\n groupFields: [],\n groupFooterFormatter: undefined,\n groupFormatter: undefined,\n })\n rebuildTableColumns(current)\n return current\n}\n\n/**\n * Hiprint provider: built-in element types, with `defaultModule.table`\n * replaced by the project default table layout (`template.json`).\n */\nexport class SvpElementTypeProvider extends Provider {\n addElementTypes(context: any): void {\n new defaultElementTypeProvider().addElementTypes(context)\n if (typeof context.updateElementType === 'function') {\n context.updateElementType(TABLE_TID, applyCustomTableType)\n return\n }\n const current = context.getElementType?.(TABLE_TID)\n if (current) applyCustomTableType(current)\n }\n}\n","import type { Provider, ProviderMap } from '../types'\nimport { SvpElementTypeProvider } from './svp-element-provider'\n\nexport { defaultElementTypeProvider } from 'vue-plugin-hiprint'\nexport { SvpElementTypeProvider } from './svp-element-provider'\n\nexport function ensureProviders(providers?: Provider[]): Provider[] {\n if (providers && providers.length) return providers\n return [new SvpElementTypeProvider()]\n}\n\nexport function normalizeProviderMap(map?: ProviderMap | ProviderMap[]): ProviderMap[] {\n if (!map) return []\n return Array.isArray(map) ? map : [map]\n}\n","/**\n * Thin wrapper around `vue-plugin-hiprint` so the rest of the codebase\n * only needs to touch a stable surface.\n */\nimport * as VuePluginHiprint from 'vue-plugin-hiprint'\nimport { DEFAULT_PAPER_LIST } from '../constants'\nimport { setupHiprintPaperList } from './hiprint-paper-list'\nimport { ensureProviders } from './providers'\nimport type { PaperType, Provider } from '../types'\n\nconst plugin = VuePluginHiprint as Record<string, any>\nexport const hiprint = plugin.hiprint ?? plugin.default?.hiprint\nexport const defaultElementTypeProvider = plugin.defaultElementTypeProvider\n ?? plugin.default?.defaultElementTypeProvider\nexport const autoConnect = plugin.autoConnect ?? plugin.default?.autoConnect\nexport const disAutoConnect = plugin.disAutoConnect ?? plugin.default?.disAutoConnect\n\nlet initialized = false\n\nexport interface InitOptions {\n providers?: Provider[]\n autoConnect?: boolean\n config?: any\n paperList?: PaperType[]\n onPaperApplied?: (tpl: any) => void\n}\n\n/**\n * Initialise hiprint with at least one provider. Idempotent.\n */\nexport function initHiprint(options: InitOptions = {}): typeof hiprint {\n const providers = ensureProviders(options.providers)\n\n if (!initialized) {\n try {\n hiprint.init({ providers, ...(options.config ?? {}) })\n setupHiprintPaperList(\n options.paperList ?? DEFAULT_PAPER_LIST,\n options.onPaperApplied,\n )\n } catch (e) {\n console.error('[vue3-print-designer] hiprint.init failed', e)\n }\n initialized = true\n } else if (options.providers?.length) {\n // Re-register providers on subsequent init calls.\n try {\n // hiprint exposes `PrintElementTypeManager` whose `build` accepts\n // a provider list — calling it again is safe.\n options.providers.forEach((p) =>\n hiprint.PrintElementTypeManager?.build?.([p]),\n )\n } catch (e) {\n console.warn('[vue3-print-designer] re-build providers failed', e)\n }\n }\n\n if (options.autoConnect === false) {\n try { disAutoConnect() } catch (_) { /* ignore */ }\n }\n\n return hiprint\n}\n\n/**\n * Bind a selector list (e.g. `.ep-draggable-item`) into hiprint so the\n * elements become draggable. `vue-plugin-hiprint` exposes this via\n * `PrintElementTypeManager.buildByHtml`.\n */\nexport function buildByHtml(selectors: string[] | string): void {\n if (typeof window === 'undefined') return\n const $: any = (window as any).jQuery || (window as any).$\n if (!$) {\n console.warn('[vue3-print-designer] jQuery is required by hiprint but was not found on window')\n return\n }\n const list = Array.isArray(selectors) ? selectors : [selectors]\n list.forEach((sel) => {\n const $els = $(sel)\n if ($els.length) {\n try { hiprint.PrintElementTypeManager.buildByHtml($els) } catch (e) {\n console.warn('[vue3-print-designer] buildByHtml failed', sel, e)\n }\n }\n })\n}\n","import { hiprint, initHiprint, autoConnect, disAutoConnect } from './hiprint-bridge'\nimport { ensureProviders } from './providers'\nimport type {\n ClientInfo,\n Print2Options,\n PrintClientConnectOptions,\n PrintClientStatus,\n PrinterInfo,\n} from '../types'\n\nexport type Unsubscribe = () => void\n\nfunction normalizePrinterList(raw: unknown): PrinterInfo[] {\n if (!Array.isArray(raw)) return []\n return raw\n .map((item) => {\n if (typeof item === 'string') {\n return { name: item, displayName: item }\n }\n if (!item || typeof item !== 'object') return null\n const record = item as Record<string, unknown>\n const name = String(record.name ?? record.Name ?? '')\n if (!name) return null\n return {\n ...record,\n name,\n displayName: String(record.displayName ?? record.DisplayName ?? name),\n isDefault: Boolean(record.isDefault ?? record.IsDefault ?? record.default),\n } as PrinterInfo\n })\n .filter((item): item is PrinterInfo => item != null)\n}\n\nfunction normalizeClientList(raw: unknown): ClientInfo[] {\n if (!Array.isArray(raw)) return []\n return raw.filter((item) => item && typeof item === 'object') as ClientInfo[]\n}\n\nfunction buildPrint2Payload(options?: Print2Options): Record<string, unknown> {\n if (!options) {\n return { printer: '', title: 'print' }\n }\n const {\n printer,\n title,\n client,\n printByFragments,\n generateHTMLInterval,\n fragmentSize,\n sendInterval,\n ...rest\n } = options\n return {\n printer: printer ?? '',\n title: title ?? 'print',\n ...(client != null ? { client } : {}),\n ...(printByFragments != null ? { printByFragments } : {}),\n ...(generateHTMLInterval != null ? { generateHTMLInterval } : {}),\n ...(fragmentSize != null ? { fragmentSize } : {}),\n ...(sendInterval != null ? { sendInterval } : {}),\n ...rest,\n }\n}\n\nfunction readSocketConnected(): boolean {\n try {\n const ws = hiprint.hiwebSocket as Record<string, unknown> | undefined\n if (!ws) return false\n if (ws.opened === true || ws.connected === true) return true\n if (typeof ws.isConnected === 'function' && ws.isConnected()) return true\n return false\n } catch {\n return false\n }\n}\n\n/**\n * Headless print client wrapping vue-plugin-hiprint socket + print2 APIs.\n */\nexport class PrintClient {\n private static instance: PrintClient | null = null\n\n private status: PrintClientStatus = { connected: false }\n private initConfig: Record<string, unknown> = {}\n private connectPromise: Promise<PrintClientStatus> | null = null\n private connectionCallbacks = new Set<(status: PrintClientStatus) => void>()\n private printSuccessCallbacks = new Set<(data: unknown) => void>()\n private printErrorCallbacks = new Set<(data: unknown) => void>()\n\n static getInstance(): PrintClient {\n if (!PrintClient.instance) PrintClient.instance = new PrintClient()\n return PrintClient.instance\n }\n\n connect(options: PrintClientConnectOptions = {}): Promise<PrintClientStatus> {\n if (typeof window === 'undefined') {\n const status = { connected: false, message: 'PrintClient requires a browser environment.' }\n this.updateStatus(status)\n return Promise.resolve(status)\n }\n\n if (this.getStatus().connected) {\n return Promise.resolve(this.getStatus())\n }\n\n if (this.connectPromise) return this.connectPromise\n\n this.connectPromise = new Promise((resolve) => {\n const timeoutMs = options.timeout ?? 10_000\n let settled = false\n\n const finish = (status: PrintClientStatus) => {\n if (settled) return\n settled = true\n window.clearTimeout(timer)\n this.connectPromise = null\n this.updateStatus(status)\n resolve(status)\n }\n\n const timer = window.setTimeout(() => {\n finish({\n connected: false,\n message: 'Connection timeout. Is electron-hiprint running?',\n })\n }, timeoutMs)\n\n const config: Record<string, unknown> = { ...this.initConfig }\n if (options.host) config.host = options.host\n if (options.token) config.token = options.token\n this.initConfig = config\n\n initHiprint({\n providers: ensureProviders(),\n autoConnect: false,\n config,\n })\n\n try {\n if (options.host && typeof hiprint.hiwebSocket?.setHost === 'function') {\n hiprint.hiwebSocket.setHost(options.host, options.token)\n }\n } catch (e) {\n console.warn('[print-designer] hiwebSocket.setHost failed', e)\n }\n\n try {\n autoConnect((status: boolean, msg?: unknown) => {\n const message = typeof msg === 'string'\n ? msg\n : msg != null\n ? String(msg)\n : status\n ? undefined\n : 'Failed to connect to print client.'\n finish({ connected: !!status, message })\n })\n } catch (e) {\n finish({\n connected: false,\n message: e instanceof Error ? e.message : String(e),\n })\n }\n })\n\n return this.connectPromise\n }\n\n disconnect(): void {\n try { disAutoConnect() } catch { /* ignore */ }\n this.connectPromise = null\n this.updateStatus({ connected: false, message: 'Disconnected.' })\n }\n\n getStatus(): PrintClientStatus {\n const socketConnected = readSocketConnected()\n if (socketConnected && !this.status.connected) {\n this.status = { connected: true }\n }\n if (!socketConnected && this.status.connected) {\n this.status = { connected: false, message: this.status.message ?? 'Disconnected.' }\n }\n return { ...this.status }\n }\n\n getPrinterList(): PrinterInfo[] {\n try {\n const list = hiprint.hiwebSocket?.getPrinterList?.()\n return normalizePrinterList(list)\n } catch {\n return []\n }\n }\n\n getClients(): ClientInfo[] {\n try {\n const ws = hiprint.hiwebSocket as Record<string, unknown> | undefined\n if (!ws) return []\n if (Array.isArray(ws.clients)) return normalizeClientList(ws.clients)\n if (typeof ws.getClients === 'function') {\n return normalizeClientList(ws.getClients())\n }\n return []\n } catch {\n return []\n }\n }\n\n async printByTemplate(\n template: object,\n printData: object | object[],\n options?: Print2Options,\n ): Promise<void> {\n initHiprint({\n providers: ensureProviders(),\n autoConnect: false,\n config: this.initConfig,\n })\n const instance = new hiprint.PrintTemplate({ template })\n return this.printByInstance(instance, printData, options)\n }\n\n async printByInstance(\n printTemplate: any,\n printData: object | object[],\n options?: Print2Options,\n ): Promise<void> {\n if (!this.getStatus().connected) {\n throw new Error('[print-designer] Print client is not connected. Call connect() first.')\n }\n if (typeof printTemplate?.print2 !== 'function') {\n throw new Error('[print-designer] print2 is not available on the template instance.')\n }\n\n return new Promise((resolve, reject) => {\n const onSuccess = (data: unknown) => {\n cleanup()\n this.notifyPrintSuccess(data)\n resolve()\n }\n const onError = (data: unknown) => {\n cleanup()\n this.notifyPrintError(data)\n reject(data instanceof Error ? data : new Error(String(data ?? 'Print failed')))\n }\n const cleanup = () => {\n try { printTemplate.off?.('printSuccess', onSuccess) } catch { /* ignore */ }\n try { printTemplate.off?.('printError', onError) } catch { /* ignore */ }\n }\n\n try {\n printTemplate.on?.('printSuccess', onSuccess)\n printTemplate.on?.('printError', onError)\n printTemplate.print2(printData, buildPrint2Payload(options))\n } catch (e) {\n cleanup()\n reject(e)\n }\n })\n }\n\n onConnectionChange(callback: (status: PrintClientStatus) => void): Unsubscribe {\n this.connectionCallbacks.add(callback)\n return () => { this.connectionCallbacks.delete(callback) }\n }\n\n onPrintSuccess(callback: (data: unknown) => void): Unsubscribe {\n this.printSuccessCallbacks.add(callback)\n return () => { this.printSuccessCallbacks.delete(callback) }\n }\n\n onPrintError(callback: (data: unknown) => void): Unsubscribe {\n this.printErrorCallbacks.add(callback)\n return () => { this.printErrorCallbacks.delete(callback) }\n }\n\n private updateStatus(status: PrintClientStatus): void {\n this.status = status\n this.notifyConnectionChange(status)\n }\n\n private notifyConnectionChange(status: PrintClientStatus): void {\n this.connectionCallbacks.forEach((cb) => {\n try { cb(status) } catch (e) { console.error('[print-designer] connection listener failed', e) }\n })\n }\n\n private notifyPrintSuccess(data: unknown): void {\n this.printSuccessCallbacks.forEach((cb) => {\n try { cb(data) } catch (e) { console.error('[print-designer] printSuccess listener failed', e) }\n })\n }\n\n private notifyPrintError(data: unknown): void {\n this.printErrorCallbacks.forEach((cb) => {\n try { cb(data) } catch (e) { console.error('[print-designer] printError listener failed', e) }\n })\n }\n}\n\nexport function getPrintClient(): PrintClient {\n return PrintClient.getInstance()\n}\n"],"names":["_a","_b","_c","_d"],"mappings":"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"}
@@ -230,14 +230,15 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
230
230
  "onUpdate:template"?: ((...args: any[]) => any) | undefined;
231
231
  "onUpdate:printData"?: ((...args: any[]) => any) | undefined;
232
232
  }>, {
233
+ title: string;
233
234
  paperList: PaperType[];
234
235
  template: any;
235
- title: string;
236
+ autoConnect: boolean;
237
+ config: Record<string, any>;
236
238
  theme: string | ThemeType | ThemeType[];
237
239
  lang: string;
238
240
  printData: any;
239
241
  plugins: PluginOptions[];
240
- config: Record<string, any>;
241
242
  providers: Provider[];
242
243
  providerMap: ProviderMap | ProviderMap[];
243
244
  tags: string[];
@@ -248,7 +249,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
248
249
  headerEleList: HeaderEle[];
249
250
  showToolbar: boolean;
250
251
  catalogue: import("..").ElementCatalogueItem[];
251
- autoConnect: boolean;
252
252
  headerLogoHtml: string;
253
253
  headerTitle: string;
254
254
  styleOption: StyleOption;
@@ -469,11 +469,42 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
469
469
  t: (key: string, fallback?: string) => string;
470
470
  visible: import("vue").Ref<boolean, boolean>;
471
471
  html: import("vue").Ref<string, string>;
472
+ clientStatus: import("vue").Ref<{
473
+ connected: boolean;
474
+ message?: string | undefined;
475
+ }, import("..").PrintClientStatus | {
476
+ connected: boolean;
477
+ message?: string | undefined;
478
+ }>;
479
+ printers: import("vue").Ref<{
480
+ [x: string]: unknown;
481
+ name: string;
482
+ displayName?: string | undefined;
483
+ isDefault?: boolean | undefined;
484
+ }[], import("..").PrinterInfo[] | {
485
+ [x: string]: unknown;
486
+ name: string;
487
+ displayName?: string | undefined;
488
+ isDefault?: boolean | undefined;
489
+ }[]>;
490
+ selectedPrinter: import("vue").Ref<string, string>;
491
+ batchCopies: import("vue").Ref<number, number>;
492
+ batchPrinting: import("vue").Ref<boolean, boolean>;
493
+ batchDataRows: import("vue").ComputedRef<number>;
494
+ batchTotalPages: import("vue").ComputedRef<number>;
495
+ batchHintText: import("vue").ComputedRef<string>;
472
496
  canExportPdf: import("vue").ComputedRef<boolean>;
473
497
  canExportImage: import("vue").ComputedRef<boolean>;
474
- canPrint: import("vue").ComputedRef<boolean>;
498
+ canBrowserPrint: import("vue").ComputedRef<boolean>;
499
+ canSilentPrint: import("vue").ComputedRef<boolean>;
500
+ canBatchPrint: import("vue").ComputedRef<boolean>;
501
+ showPrintClientBar: import("vue").ComputedRef<boolean>;
502
+ formatPrinterLabel: (printer: import("..").PrinterInfo) => string;
475
503
  close: () => void;
504
+ toggleConnect: () => Promise<void>;
476
505
  onPrint: () => Promise<void>;
506
+ onSilentPrint: () => Promise<void>;
507
+ onBatchPrint: () => Promise<void>;
477
508
  onPdf: () => Promise<void>;
478
509
  onImage: () => Promise<void>;
479
510
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -1,5 +1,5 @@
1
1
  import { type PropType } from 'vue-demi';
2
- import type { PreviewOptions } from '../types';
2
+ import type { PreviewOptions, PrintClientStatus, PrinterInfo } from '../types';
3
3
  declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
4
4
  options: {
5
5
  type: PropType<PreviewOptions>;
@@ -9,11 +9,42 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
9
9
  t: (key: string, fallback?: string) => string;
10
10
  visible: import("vue").Ref<boolean, boolean>;
11
11
  html: import("vue").Ref<string, string>;
12
+ clientStatus: import("vue").Ref<{
13
+ connected: boolean;
14
+ message?: string | undefined;
15
+ }, PrintClientStatus | {
16
+ connected: boolean;
17
+ message?: string | undefined;
18
+ }>;
19
+ printers: import("vue").Ref<{
20
+ [x: string]: unknown;
21
+ name: string;
22
+ displayName?: string | undefined;
23
+ isDefault?: boolean | undefined;
24
+ }[], PrinterInfo[] | {
25
+ [x: string]: unknown;
26
+ name: string;
27
+ displayName?: string | undefined;
28
+ isDefault?: boolean | undefined;
29
+ }[]>;
30
+ selectedPrinter: import("vue").Ref<string, string>;
31
+ batchCopies: import("vue").Ref<number, number>;
32
+ batchPrinting: import("vue").Ref<boolean, boolean>;
33
+ batchDataRows: import("vue").ComputedRef<number>;
34
+ batchTotalPages: import("vue").ComputedRef<number>;
35
+ batchHintText: import("vue").ComputedRef<string>;
12
36
  canExportPdf: import("vue").ComputedRef<boolean>;
13
37
  canExportImage: import("vue").ComputedRef<boolean>;
14
- canPrint: import("vue").ComputedRef<boolean>;
38
+ canBrowserPrint: import("vue").ComputedRef<boolean>;
39
+ canSilentPrint: import("vue").ComputedRef<boolean>;
40
+ canBatchPrint: import("vue").ComputedRef<boolean>;
41
+ showPrintClientBar: import("vue").ComputedRef<boolean>;
42
+ formatPrinterLabel: (printer: PrinterInfo) => string;
15
43
  close: () => void;
44
+ toggleConnect: () => Promise<void>;
16
45
  onPrint: () => Promise<void>;
46
+ onSilentPrint: () => Promise<void>;
47
+ onBatchPrint: () => Promise<void>;
17
48
  onPdf: () => Promise<void>;
18
49
  onImage: () => Promise<void>;
19
50
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
@@ -0,0 +1,30 @@
1
+ export interface BatchPrintOptions {
2
+ /** Copies per record. Default 1. */
3
+ copies?: number;
4
+ /**
5
+ * Print one record per page. Default true. When false, all records are
6
+ * concatenated without page breaks (rarely useful, kept for parity).
7
+ */
8
+ pageBreak?: boolean;
9
+ /** Document title for the printed window. Default "print". */
10
+ title?: string;
11
+ /**
12
+ * Extra CSS to inject into the print iframe head. Useful when you need
13
+ * to override or extend `print-lock.css`.
14
+ */
15
+ styleHandler?: () => string;
16
+ /**
17
+ * Whether to clone `<link rel="stylesheet">` and `<style>` from the host
18
+ * document into the iframe. Default true (keeps print-lock.css working).
19
+ */
20
+ importCss?: boolean;
21
+ /** Called once the print dialog has been triggered. */
22
+ callback?: () => void;
23
+ /** Iframe load timeout in ms when the browser fails to fire load. */
24
+ timeout?: number;
25
+ }
26
+ /**
27
+ * Merge multiple records into a single HTML payload and open the browser
28
+ * print dialog once. Works without electron-hiprint.
29
+ */
30
+ export declare function batchPrint(printTemplate: any, printDataList: unknown[], options?: BatchPrintOptions): Promise<void>;
@@ -1,8 +1,9 @@
1
+ import { type BatchPrintOptions } from './batch-print';
1
2
  import { PluginManager } from './plugins';
2
3
  import { HistoryController } from './history';
3
4
  import { ShortcutsController } from './shortcuts';
4
5
  import type { PrintDataEditorModalHost } from './print-data-editor-modal';
5
- import type { DesignOptions, DesignerPrintTemplateOptions, Events, PluginOptions, Provider, ProviderMap } from '../types';
6
+ import type { DesignOptions, DesignerPrintTemplateOptions, Events, PluginOptions, Provider, ProviderMap, Print2Options, PrintClientStatus, PrinterInfo } from '../types';
6
7
  export interface DesignerUtilsOptions {
7
8
  connect?: boolean;
8
9
  config?: any;
@@ -111,7 +112,7 @@ export default class DesignerUtils {
111
112
  setPrintData(data: any): void;
112
113
  setPlugins(plugins?: PluginOptions[]): void;
113
114
  setConfig(config?: any): void;
114
- setConnect(connect?: boolean, _callback?: (status?: boolean, msg?: any) => void): void;
115
+ setConnect(connect?: boolean, callback?: (status?: boolean, msg?: any) => void): void;
115
116
  initProviders(providers?: Provider[]): void;
116
117
  buildByProvider(map?: ProviderMap | ProviderMap[], _clear?: boolean): void;
117
118
  buildByHtml(tags?: string[]): void;
@@ -149,7 +150,16 @@ export default class DesignerUtils {
149
150
  /** Import onto existing paper(s) without creating extra panels. */
150
151
  private applyImportTemplateJson;
151
152
  applyTemplateJson(json: any): void;
152
- getPrinterList(): any[];
153
+ getPrinterList(): PrinterInfo[];
154
+ getPrintClientStatus(): PrintClientStatus;
155
+ /**
156
+ * Browser-side batch print. Combines records into a single print job —
157
+ * works without electron-hiprint. `printDataList` can be a single
158
+ * object or an array; each record can also be printed multiple times
159
+ * via `options.copies`.
160
+ */
161
+ batchPrint(printDataList?: unknown | unknown[], options?: BatchPrintOptions): Promise<void>;
162
+ print2(printData?: any, options?: Print2Options): Promise<void>;
153
163
  setZoom(value: number): void;
154
164
  getZoom(): number;
155
165
  zoomIn(): void;
@@ -1,9 +1,8 @@
1
- /**
2
- * Thin wrapper around `vue-plugin-hiprint` so the rest of the codebase
3
- * only needs to touch a stable surface.
4
- */
5
- import { hiprint, defaultElementTypeProvider } from 'vue-plugin-hiprint';
6
1
  import type { PaperType, Provider } from '../types';
2
+ export declare const hiprint: any;
3
+ export declare const defaultElementTypeProvider: any;
4
+ export declare const autoConnect: any;
5
+ export declare const disAutoConnect: any;
7
6
  export interface InitOptions {
8
7
  providers?: Provider[];
9
8
  autoConnect?: boolean;
@@ -21,4 +20,3 @@ export declare function initHiprint(options?: InitOptions): typeof hiprint;
21
20
  * `PrintElementTypeManager.buildByHtml`.
22
21
  */
23
22
  export declare function buildByHtml(selectors: string[] | string): void;
24
- export { hiprint, defaultElementTypeProvider };
@@ -0,0 +1,30 @@
1
+ import type { ClientInfo, Print2Options, PrintClientConnectOptions, PrintClientStatus, PrinterInfo } from '../types';
2
+ export type Unsubscribe = () => void;
3
+ /**
4
+ * Headless print client wrapping vue-plugin-hiprint socket + print2 APIs.
5
+ */
6
+ export declare class PrintClient {
7
+ private static instance;
8
+ private status;
9
+ private initConfig;
10
+ private connectPromise;
11
+ private connectionCallbacks;
12
+ private printSuccessCallbacks;
13
+ private printErrorCallbacks;
14
+ static getInstance(): PrintClient;
15
+ connect(options?: PrintClientConnectOptions): Promise<PrintClientStatus>;
16
+ disconnect(): void;
17
+ getStatus(): PrintClientStatus;
18
+ getPrinterList(): PrinterInfo[];
19
+ getClients(): ClientInfo[];
20
+ printByTemplate(template: object, printData: object | object[], options?: Print2Options): Promise<void>;
21
+ printByInstance(printTemplate: any, printData: object | object[], options?: Print2Options): Promise<void>;
22
+ onConnectionChange(callback: (status: PrintClientStatus) => void): Unsubscribe;
23
+ onPrintSuccess(callback: (data: unknown) => void): Unsubscribe;
24
+ onPrintError(callback: (data: unknown) => void): Unsubscribe;
25
+ private updateStatus;
26
+ private notifyConnectionChange;
27
+ private notifyPrintSuccess;
28
+ private notifyPrintError;
29
+ }
30
+ export declare function getPrintClient(): PrintClient;
@@ -23,6 +23,18 @@ declare const _default: {
23
23
  printDataDeleteRow: string;
24
24
  printDataFieldKey: string;
25
25
  paper: string;
26
+ browserPrint: string;
27
+ silentPrint: string;
28
+ batchPrint: string;
29
+ batchPrinting: string;
30
+ batchCopies: string;
31
+ batchHint: string;
32
+ printClientConnected: string;
33
+ printClientDisconnected: string;
34
+ printClientConnect: string;
35
+ printClientDisconnect: string;
36
+ printClientNoPrinters: string;
37
+ defaultPrinter: string;
26
38
  };
27
39
  header: {
28
40
  title: string;
@@ -23,6 +23,18 @@ declare const _default: {
23
23
  printDataDeleteRow: string;
24
24
  printDataFieldKey: string;
25
25
  paper: string;
26
+ browserPrint: string;
27
+ silentPrint: string;
28
+ batchPrint: string;
29
+ batchPrinting: string;
30
+ batchCopies: string;
31
+ batchHint: string;
32
+ printClientConnected: string;
33
+ printClientDisconnected: string;
34
+ printClientConnect: string;
35
+ printClientDisconnect: string;
36
+ printClientNoPrinters: string;
37
+ defaultPrinter: string;
26
38
  };
27
39
  header: {
28
40
  title: string;
@@ -31,6 +31,11 @@ export { headerElementsFromCatalogue } from './constants/header-elements';
31
31
  export { DEFAULT_TABLE_COLUMNS, DEFAULT_TABLE_ELEMENT_TYPE, DEFAULT_TABLE_FIELDS, } from './constants/default-table-element';
32
32
  export { designerStore, setZoom, setPanelVisibility, togglePanel, toggleAllPanels, setSelection, } from './core/stores';
33
33
  export { readJSON, writeJSON, removeKey } from './core/storage';
34
+ export { getPrintClient, PrintClient } from './core/print-client';
35
+ export { batchPrint } from './core/batch-print';
36
+ export type { BatchPrintOptions } from './core/batch-print';
37
+ export type { Unsubscribe } from './core/print-client';
38
+ export { autoConnect, disAutoConnect } from './core/hiprint-bridge';
34
39
  export { useDesigner, provideDesigner, DESIGNER_INJECTION_KEY } from './composables/useDesigner';
35
40
  export { useDesignerUi } from './composables/useDesignerUi';
36
41
  export { useDragBox } from './composables/useDragBox';
@@ -0,0 +1,5 @@
1
+ export { PrintClient, getPrintClient } from './core/print-client';
2
+ export type { Unsubscribe } from './core/print-client';
3
+ export { initHiprint, hiprint, autoConnect, disAutoConnect } from './core/hiprint-bridge';
4
+ export { ensureProviders } from './core/providers';
5
+ export type { Print2Options, PrintClientConnectOptions, PrintClientStatus, PrinterInfo, ClientInfo, } from './types';
@@ -79,7 +79,58 @@ export interface ProviderMap {
79
79
  export interface PreviewOptions {
80
80
  showPdf?: boolean;
81
81
  showImg?: boolean;
82
+ /** Show browser print button (window.print dialog). Default true. */
83
+ showBrowserPrint?: boolean;
84
+ /** Show silent print (print2) button. Default false. */
82
85
  showPrint2?: boolean;
86
+ /** Alias of `showPrint2`. */
87
+ showSilentPrint?: boolean;
88
+ /** Show batch print button (browser, no electron-hiprint). Default true. */
89
+ showBatchPrint?: boolean;
90
+ /**
91
+ * Show the print-client connect bar (status + connect button + printer
92
+ * dropdown). Default false. When enabling silent print (`showPrint2`),
93
+ * this bar is shown automatically.
94
+ */
95
+ showPrintClient?: boolean;
96
+ /** Default copies value for the batch input. Default 1. */
97
+ defaultCopies?: number;
98
+ }
99
+ export interface PrintClientConnectOptions {
100
+ /** electron-hiprint host, e.g. `http://localhost:17521`. */
101
+ host?: string;
102
+ token?: string;
103
+ /** Connection timeout in ms. Default 10000. */
104
+ timeout?: number;
105
+ }
106
+ export interface PrintClientStatus {
107
+ connected: boolean;
108
+ message?: string;
109
+ }
110
+ export interface PrinterInfo {
111
+ name: string;
112
+ displayName?: string;
113
+ isDefault?: boolean;
114
+ /** Raw payload from hiprint when present. */
115
+ [key: string]: unknown;
116
+ }
117
+ export interface ClientInfo {
118
+ id?: string;
119
+ name?: string;
120
+ /** Raw payload from hiprint when present. */
121
+ [key: string]: unknown;
122
+ }
123
+ export interface Print2Options {
124
+ printer?: string;
125
+ title?: string;
126
+ /** Target client id when using transit proxy. */
127
+ client?: string;
128
+ printByFragments?: boolean;
129
+ generateHTMLInterval?: number;
130
+ fragmentSize?: number;
131
+ sendInterval?: number;
132
+ /** Extra options forwarded to hiprint print2. */
133
+ [key: string]: unknown;
83
134
  }
84
135
  export type Hook = 'init' | 'ready' | 'documentShortcutKeys' | 'shortcutKeys' | 'createPrintElement' | 'beforePrint' | 'beforePrint2' | 'getOptionItem' | 'onDesigned' | 'onPreview' | 'newPrintTemplate' | 'newPanel' | (string & {});
85
136
  export interface HookOptions {