1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
odoo.define('indoteknik_custom.buffered_scanner', function (require) {
'use strict';
console.log('✅ Indoteknik_Custom JS Loaded');
var GAP_MS = 120;
var MIN_LEN = 3;
var COMMIT_TIMEOUT = 180;
var buffer = '';
var last = 0;
var timer = null;
function reset() {
buffer = '';
last = 0;
if (timer) { clearTimeout(timer); timer = null; }
}
function isCodeProduct(el) {
return el && el instanceof HTMLInputElement && el.name === 'code_product';
}
function commit() {
var el = document.activeElement;
if (!isCodeProduct(el)) { reset(); return; }
if (buffer.length >= MIN_LEN) {
el.value = buffer;
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
}
reset();
}
document.addEventListener('keydown', function (e) {
var el = document.activeElement;
if (!isCodeProduct(el)) return;
var key = e.key;
// ENTER mengakhiri scan
if (key === 'Enter') {
e.preventDefault();
commit();
return;
}
// abaikan tombol kontrol (Shift, Tab, Arrow, Backspace, dll.)
if (key.length !== 1) return;
var now = performance.now();
var gap = now - (last || now);
last = now;
if (!buffer || gap <= GAP_MS) {
// bagian dari "scan cepat" → tangani sendiri (hindari karakter hilang)
e.preventDefault();
buffer += key;
if (timer) clearTimeout(timer);
timer = setTimeout(function () {
// auto-commit jika scanner tidak mengirim Enter
commit();
}, COMMIT_TIMEOUT);
} else {
// jeda besar → kemungkinan manual. Kalau mau benar-benar melarang,
// buka komentar 2 baris di bawah.
// e.preventDefault();
// e.stopPropagation();
reset(); // keluar dari mode buffer agar manual normal
}
}, true);
document.addEventListener('focusin', function (e) {
if (isCodeProduct(e.target)) reset();
}, true);
});
|