summaryrefslogtreecommitdiff
path: root/indoteknik_custom/static/src/js/check_product_barcode.js
blob: 2fddc61625b15ad409d01426404311656076f79d (plain)
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);
});