diff --git a/app.js b/app.js index c310399..5742327 100644 --- a/app.js +++ b/app.js @@ -33,6 +33,7 @@ websocket.initialize(server); // Static images mapping const staticImages = { + mulberry: 'am_mulberry_logo_wide_color.png' , home: 'payment.png', scan: 'Scanner.png', printer: 'Check.png', @@ -98,10 +99,17 @@ const defaultConfig = { type: "base64", value: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaQAAAWY" }, + printLogo: { + type: "base64", + value: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaQAAAWY" + }, + printURL: "www.mulberrypos.ru", footerLogoVisibility: "true", + bankMode: false, footerGreetingText: "Привет Игорь! ))", footerText: "Mulberry, OOO Demo ©2025", - primaryColor: "#002233" + primaryColor: "#002233", + secondaryColor: "#67777eff", }; // Routes diff --git a/public/css/receipt.css b/public/css/receipt.css index 8d47a3d..3361cce 100644 --- a/public/css/receipt.css +++ b/public/css/receipt.css @@ -1,40 +1,44 @@ body { - font-family: monospace; + font-family: monospace; /* background: #f5f5f5; */ display: flex; justify-content: center; padding: 20px; + font-size: large; margin: 0; } - + .receipt { - display: none; + display: none; width: 300px; background: white; padding: 25px; /* box-shadow: 0 0 10px rgba(0,0,0,0.1); */ - border-top: 5px solid #00b8d7; + /* border-top: 5px solid #00b8d7; */ } + .header { text-align: center; margin-bottom: 20px; } + .header h1 { color: #f03024; font-size: 24px; margin: 0; } + .header p { margin: 5px 0; color: #666; } -.datex-pay-logo{ +.datex-pay-logo { width: 250px; } -.mulberry-logo{ +.mulberry-logo { width: 100px; } @@ -42,19 +46,23 @@ body { border-top: 1px dashed #ccc; margin: 15px 0; } + .receipt-details { margin-bottom: 20px; font-size: smaller; } + .receipt-row { display: flex; justify-content: space-between; margin: 8px 0; } + .label { font-weight: bold; color: #333; } + .footer { text-align: center; font-size: 12px; @@ -65,55 +73,112 @@ body { .buttons { - display: flex; - gap: 10px; - margin-top: 20px; - justify-content: center; + display: flex; + gap: 10px; + margin-top: 20px; + justify-content: center; +} + +#payButton, +#cancelButton { + padding: 10px 20px; + border: none; + border-radius: 5px; + font-size: 16px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +#payButton { + background-color: #553285; + color: white; + +} + +#payButton:hover { + background-color: #cdbbe7; +} + +#cancelButton { + color: white; + border-style: solid; + background-color: #f3f3f3; + color: #553285; +} + +#cancelButton:hover { + background-color: #f7bef2; +} + + +.loading { + position: absolute; + top: 150px; + + display: none; + /* Hide loading circle by default */ + border: 4px solid #f3f3f3; + border-top: 4px solid #3498db; + border-radius: 50%; + width: 30px; + height: 30px; + animation: spin 1s linear infinite; + margin: 0 auto; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); } - #payButton, #cancelButton { - padding: 10px 20px; - border: none; - border-radius: 5px; - font-size: 16px; - cursor: pointer; - transition: background-color 0.3s ease; - } - - #payButton { - background-color: #4CAF50; /* Green */ - color: white; - } - - #payButton:hover { - background-color: #45a049; - } - - #cancelButton { - background-color: #f44336; /* Red */ - color: white; - } - - #cancelButton:hover { - background-color: #d32f2f; + 100% { + transform: rotate(360deg); } +} - .loading { - position: absolute; - top: 150px; +div#buttons { + width: 300px; + background: white; + padding: 25px; +} - display: none; /* Hide loading circle by default */ - border: 4px solid #f3f3f3; - border-top: 4px solid #3498db; - border-radius: 50%; - width: 30px; - height: 30px; - animation: spin 1s linear infinite; - margin: 0 auto; - } +/* .bearHolder{ + place-self: center; + justify-self: center; +} +.bear-image{ +height: 292px; +} */ - @keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } - } \ No newline at end of file +.bearHolder { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + /* Optional: set a specific height if needed */ + /* height: 300px; */ + + + overflow: hidden; /* Crop anything outside the container */ + height: 200px; /* Set your desired height */ +} + +.bear-image { + max-width: 64%; + max-height: 74%; + height: auto; + width: auto; + display: block; + transform: scale(1.8); + /* Removes extra space below image */ +} + +/* Fallback for older browsers (optional) */ +.bearHolder { + text-align: center; /* Fallback for very old browsers */ +} + +.bear-image { + margin: 0 auto; /* Fallback for very old browsers */ +} \ No newline at end of file diff --git a/public/css/style.css b/public/css/style.css index 1c6ae44..4ecd6f3 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -283,6 +283,27 @@ textarea { } +.receipt_container { + text-align: center; + margin-top: 29px; + width: 65%; + padding: 20px; + background: #f5f5f5; + justify-items: center; + padding: 20px; + border-radius: 10px; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.1); +} + +#printLogoPreview { + width: 144px; +} + +.printer_container { + display: flex ; + justify-content: space-around; +} + diff --git a/public/images/Mishka_like_0109.gif b/public/images/Mishka_like_0109.gif new file mode 100644 index 0000000..ca938dd Binary files /dev/null and b/public/images/Mishka_like_0109.gif differ diff --git a/public/js/presets.js b/public/js/presets.js new file mode 100644 index 0000000..917c4c9 --- /dev/null +++ b/public/js/presets.js @@ -0,0 +1,304 @@ +// // Simple JSON preset system +// const jsonPresets = { +// default: { +// type: "configuration", +// navItems: [ +// { +// navPage: "NAV_HOME", +// navName: "Оплата", +// icon: { type: "resource", value: "home" }, +// position: 0, +// enabled: true +// }, +// { +// navPage: "NAV_SCAN", +// navName: "Сканнер", +// icon: { type: "resource", value: "scan" }, +// position: 1, +// enabled: true +// }, +// { +// navPage: "NAV_PRINTER", +// navName: "Принтер", +// icon: { type: "resource", value: "printer" }, +// position: 2, +// enabled: true +// }, +// { +// navPage: "NAV_SETTINGS", +// navName: "Настройки", +// icon: { type: "resource", value: "settings" }, +// position: 3, +// enabled: true +// } +// ], +// mainLogo: { type: "resource", value: "mulberry" }, +// footerLogo: { type: "resource", value: "mulberry" }, +// printLogo: { type: "resource", value: "mulberry" }, +// printURL: "www.mulberrypos.ru", +// footerLogoVisibility: true, +// bankMode: false, +// footerGreetingText: "Hello!", +// footerText: "©Mulberry 2025", +// primaryColor: "#bb2aa1", +// SecondaryColor: "#4aa6d3" +// }, + + +// D30_bankmode_false: { +// type: "configuration", +// navItems: [ +// { +// navPage: "NAV_HOME", +// navName: "Оплата", +// icon: { type: "resource", value: "scan" }, +// position: 0, +// enabled: true +// }, +// { +// navPage: "NAV_SCAN", +// navName: "Сканнер", +// icon: { type: "resource", value: "scan" }, +// position: 1, +// enabled: true +// }, +// { +// navPage: "NAV_CASHIER", +// navName: "Касса", +// icon: { type: "resource", value: "cashier" }, +// position: 2, +// enabled: true +// }, +// { +// navPage: "NAV_SETTINGS", +// navName: "Настройки", +// icon: { type: "resource", value: "settings" }, +// position: 3, +// enabled: true +// } +// ], +// mainLogo: { type: "resource", value: "mulberry" }, +// footerLogo: { type: "resource", value: "mulberry" }, +// printLogo: { type: "resource", value: "mulberry" }, +// printURL: "www.mulberrypos.ru", +// footerLogoVisibility: true, +// bankMode: false, +// footerGreetingText: "Hello!", +// footerText: "©Mulberry 2025", +// primaryColor: "#bb2aa1", +// SecondaryColor: "#4aa6d3" +// }, + +// D30_bankmode_true: { +// type: "configuration", +// navItems: [ +// { +// navPage: "NAV_HOME", +// navName: "Оплата", +// icon: { type: "resource", value: "home" }, +// position: 0, +// enabled: true +// }, +// { +// navPage: "NAV_SCAN", +// navName: "Сканнер", +// icon: { type: "resource", value: "scan" }, +// position: 1, +// enabled: true +// }, +// { +// navPage: "NAV_CASHIER", +// navName: "Касса", +// icon: { type: "resource", value: "cashier" }, +// position: 2, +// enabled: true +// }, +// { +// navPage: "NAV_SETTINGS", +// navName: "Настройки", +// icon: { type: "resource", value: "settings" }, +// position: 3, +// enabled: true +// } +// ], +// mainLogo: { type: "resource", value: "mulberry" }, +// footerLogo: { type: "resource", value: "mulberry" }, +// printLogo: { type: "resource", value: "mulberry" }, +// printURL: "www.mulberrypos.ru", +// footerLogoVisibility: true, +// bankMode: true, +// footerGreetingText: "Hello!", +// footerText: "©Mulberry 2025", +// primaryColor: "#000000ff", +// SecondaryColor: "#6a6a6aff" +// }, + +// bank: { +// type: "configuration", +// navItems: [ +// { +// navPage: "NAV_HOME", +// navName: "Счета", +// icon: { type: "resource", value: "home" }, +// position: 0, +// enabled: true +// }, +// { +// navPage: "NAV_SCAN", +// navName: "Депозит", +// icon: { type: "resource", value: "scan" }, +// position: 1, +// enabled: true +// }, +// { +// navPage: "NAV_PRINTER", +// navName: "Чеки", +// icon: { type: "resource", value: "printer" }, +// position: 2, +// enabled: true +// }, +// { +// navPage: "NAV_SETTINGS", +// navName: "Безопасность", +// icon: { type: "resource", value: "settings" }, +// position: 3, +// enabled: true +// } +// ], +// mainLogo: { type: "resource", value: "citibank" }, +// footerLogo: { type: "resource", value: "citibank" }, +// printLogo: { type: "resource", value: "citibank" }, +// printURL: "www.bank.com", +// footerLogoVisibility: true, +// bankMode: true, +// footerGreetingText: "Добро пожаловать", +// footerText: "Банковский режим ©2025", +// primaryColor: "#0047AB", +// SecondaryColor: "#FFFFFF" +// }, +// minimal: { +// type: "configuration", +// navItems: [ +// { +// navPage: "NAV_HOME", +// navName: "Оплата", +// icon: { type: "resource", value: "home" }, +// position: 0, +// enabled: true +// }, +// { +// navPage: "NAV_SCAN", +// navName: "Сканнер", +// icon: { type: "resource", value: "scan" }, +// position: 1, +// enabled: true +// }, +// { +// enabled: false +// }, +// { +// enabled: false +// } +// ], +// mainLogo: { +// type: "base64", +// value: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADTSURBVDiNpZOxCsIwEEWfiaCToKODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg极简主义" +// }, +// footerLogo: { type: "resource", value: "mulberry" }, +// printLogo: { type: "resource", value: "mulberry" }, +// printURL: "", +// footerLogoVisibility: false, +// bankMode: false, +// footerGreetingText: "", +// footerText: "", +// primaryColor: "#333333", +// SecondaryColor: "#CCCCCC" +// } +// }; + +// // Function to apply JSON preset +// function applyJsonPreset(presetName) { +// if (!jsonPresets[presetName]) return; + +// const preset = jsonPresets[presetName]; +// const displayConfig = { +// ...preset, +// mainLogo: { +// type: preset.mainLogo.type, +// value: preset.mainLogo.value +// }, +// footerLogo: { +// type: preset.footerLogo.type, +// value: preset.footerLogo.value +// }, +// printLogo: { +// type: preset.printLogo.type, +// value: preset.printLogo.value +// } +// }; + +// document.getElementById('configLog').value = JSON.stringify(displayConfig, null, 2); +// } + +// // Function to send preset to device +// function sendPresetToDevice() { +// const presetSelector = document.getElementById('presetSelector'); +// const selectedPreset = presetSelector.value; + +// if (!selectedPreset) { +// console.log('Please select a preset first!'); + +// return; +// } + +// const presetConfig = jsonPresets[selectedPreset]; +// const topicSelect = document.querySelector('select[name="topic"]'); +// const selectedTopic = topicSelect.value; + +// if (!selectedTopic) { +// console.log('Please select a preset first!'); +// return; +// } + +// console.log('[DEBUG] Sending preset to device:', presetConfig); + +// fetch('/sendToDevice', { +// method: 'POST', +// headers: { 'Content-Type': 'application/json' }, +// body: JSON.stringify({ +// config: presetConfig, +// topic: selectedTopic +// }) +// }) +// .then(response => { +// if (!response.ok) { +// throw new Error('Network response was not ok'); +// } +// return response.json(); +// }) +// .then(data => { +// console.log('[DEBUG] Configuration published successfully'); +// }) +// .catch(err => { +// console.error('[ERROR] Publish failed:', err); + +// }); +// } + +// // Add event listeners when DOM is loaded +// document.addEventListener('DOMContentLoaded', function() { +// const presetSelector = document.getElementById('presetSelector'); +// const sendPresetBtn = document.getElementById('sendPresetBtn'); + +// if (presetSelector) { +// presetSelector.addEventListener('change', function() { +// if (this.value) { +// applyJsonPreset(this.value); +// } +// }); +// } + +// if (sendPresetBtn) { +// sendPresetBtn.addEventListener('click', sendPresetToDevice); +// } +// }); \ No newline at end of file diff --git a/public/js/script.js b/public/js/script.js index efb90e2..82b8708 100644 --- a/public/js/script.js +++ b/public/js/script.js @@ -50,7 +50,7 @@ document.addEventListener('DOMContentLoaded', function () { console.log('[DEBUG] Initializing form event listeners'); // Handle logo type toggling - document.querySelectorAll('[name="mainLogoType"], [name="footerLogoType"]').forEach(select => { + document.querySelectorAll('[name="mainLogoType"], [name="footerLogoType"], [name="printLogoType"] ').forEach(select => { select.addEventListener('change', function () { const type = this.value; console.log(`[DEBUG] Logo type changed to ${type}`); @@ -72,6 +72,7 @@ document.addEventListener('DOMContentLoaded', function () { select.dispatchEvent(new Event('change')); }); + @@ -204,7 +205,7 @@ document.addEventListener('DOMContentLoaded', function () { } catch (error) { console.error('[ERROR] Upload failed:', error); - alert('Error uploading image. Please try again.'); + } }); }); @@ -224,11 +225,6 @@ document.addEventListener('DOMContentLoaded', function () { const config = buildConfigObject(formData); console.log('[DEBUG] Final configuration:', config); - // Here you would typically send the config to your server - // fetch('/save-config', { method: 'POST', body: JSON.stringify(config) }) - // .then(response => response.json()) - // .then(data => console.log('Success:', data)) - // .catch(error => console.error('Error:', error)); fetch('/sendToDevice', { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -259,10 +255,14 @@ document.addEventListener('DOMContentLoaded', function () { navItems: [], mainLogo: getLogoConfig(formData, 'mainLogo'), footerLogo: getLogoConfig(formData, 'footerLogo'), + printLogo: getLogoConfig(formData, 'printLogo'), + printURL: formData.get('printURL'), footerLogoVisibility: formData.get('footerLogoVisibility') === 'on', + bankMode: formData.get('bankMode') === 'on', footerGreetingText: formData.get('footerGreetingText'), footerText: formData.get('footerText'), - primaryColor: formData.get('primaryColor') + primaryColor: formData.get('primaryColor'), + secondaryColor: formData.get('secondaryColor'), }; // Process navigation items @@ -289,7 +289,6 @@ document.addEventListener('DOMContentLoaded', function () { value = imageStore.getBase64(storageKey); } - // console.log(`[DEBUG] ${prefix} config - type: ${type}, value: ${value ? 'exists' : 'null'}`); return { type, value, @@ -453,6 +452,19 @@ document.addEventListener('DOMContentLoaded', function () { } } + // Update footer logo preview (similar to main logo) + const printLogoType = formData.get('printLogoType'); + if (printLogoType === 'resource') { + const logoValue = formData.get('printLogoResource'); + document.getElementById('printLogoPreview').src = imageStore.getStaticImage(logoValue); + } else if (printLogoType === 'base64') { + const storageKey = formData.get('printLogoValue'); + const base64Data = imageStore.getBase64(storageKey); + if (base64Data) { + document.getElementById('printLogoPreview').src = base64Data; + } + } + // NEW: Update footer visibility const footerLogoVisibility = formData.get('footerLogoVisibility') === 'on'; const footerLogoElement = document.getElementById('footerLogoPreview'); @@ -467,6 +479,13 @@ document.addEventListener('DOMContentLoaded', function () { footerGreetingElement.textContent = footerGreetingText; } + // NEW: Update footer greeting text + const printURL = formData.get('printURL') || 'www.mulberrypos.ru'; + const printURLElement = document.getElementById('printURLPreview'); + if (printURLElement) { + printURLElement.textContent = printURL; + } + // NEW: Update footer text const footerText = formData.get('footerText') || 'Mulberry ©2025'; const footerTextElement = document.getElementById('footerText'); @@ -476,6 +495,7 @@ document.addEventListener('DOMContentLoaded', function () { // Update primary color preview const primaryColor = formData.get('primaryColor') || '#002233'; + const secondaryColor = formData.get('secondaryColor') ||'#85969fff' ; const previewButtons = document.querySelectorAll('.preview-button'); previewButtons.forEach(button => { button.style.backgroundColor = primaryColor; @@ -511,6 +531,10 @@ document.addEventListener('DOMContentLoaded', function () { footerLogo: { type: config.footerLogo.type, value: config.footerLogo.value ? '[...base64 data...]' : null + }, + printLogo: { + type: config.printLogo.type, + value: config.printLogo.value ? '[...base64 data...]' : null } }; @@ -539,9 +563,15 @@ document.addEventListener('DOMContentLoaded', function () { } + + + + // Initialize the application initializeForm(); updateConfigLog(); updatePreview(); -}); \ No newline at end of file +}); + + \ No newline at end of file diff --git a/translations.js b/translations.js index c5a3849..1fa75aa 100644 --- a/translations.js +++ b/translations.js @@ -22,14 +22,14 @@ const translations = { receiptNumber: "Квитанция №", paymentType: "Тип оплаты:", testPayment: "Тестовый платеж:", - paymentAddress: "АДРЕС ПЛАТЕЖА:", - issueDate: "ДАТА ВЫПУСКА:", + paymentAddress: "Адрес:", + issueDate: "Дата:", total: "ИТОГО:", thankYou: "Спасибо за использование Mulberry", transactionId: "ID транзакции:", status: "Статус:", - receiptRejected: "Квитанция отклонена", - paymentDate: "ДАТА ПЛАТЕЖА:", + receiptRejected: "Операция отклонена", + paymentDate: "Дата платежа:", amountToPay: "Сумма к оплате:", cancel: "Отмена", pay: "Оплатить", diff --git a/views/index.ejs b/views/index.ejs index 307a922..e13276f 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -19,9 +19,26 @@
Receipt #00123
+ + <% if (defaultConfig.printLogo) { %> +Total ............ 10.00$
+ <% if (defaultConfig.printURL) { %> + + <% } %> + +