blob: 55a5829b6a7f94ee6f917be936850b286ab0439f [file] [log] [blame]
Akron5d4f2e42024-12-16 09:10:27 +01001/**
2 * Add integer values to the virtual corpus
3 */
4"use strict";
5
6define(['util'], function () {
7
8 return {
9 /**
10 * Create new integer value helper.
11 */
12 create : function () {
13 const a = arguments;
14 let value = 0;
15
16 // Set value
17 if (a.length >= 1) {
18 if (a[0] !== undefined)
19 value = a[0];
20 };
21
22 return Object.create(this)._init(value);
23 },
24
25
26 // Initialize the integer value
27 _init : function (value) {
28 this.value(value);
29 return this;
30 },
31
32 /**
33 * Get or set the integer value.
34 */
35 value : function (val) {
36 if (arguments.length === 1) {
37
38 if (typeof val != "number")
39 val = parseInt(val);
40
41 if (isNaN(val))
42 val = 0;
43
44 this._value = val;
45 this._update();
46 };
47 return this._value;
48 },
49
50
51 // Update dom element
52 _update : function () {
53 if (this._el === undefined)
54 return;
55
56 this._value = this._input.value;
57 },
58
59
60 /**
61 * Store the integer value.
62 * This method should be overwritten.
63 * The method receives the value.
64 */
65 store : function (v) {},
66
67
68 /**
69 * Put focus on element
70 */
71 focus : function () {
72 this._el.children[0].focus();
73 },
74
75
76 /**
77 * Get the associated dom element.
78 */
79 element : function () {
80 if (this._el !== undefined)
81 return this._el;
82
83 // Create element
84 const e = this._el = document.createElement('div');
85 e.setAttribute('tabindex', 0);
86 e.style.outline = 0;
87
88 const cl = e.classList;
89 cl.add('value');
90
91 // Add input field
92 this._input = e.addE('input');
93 this._input.setAttribute("type", "number");
94
95 if (this.value() !== undefined) {
96 this._input.value = this.value();
97 };
98
99 // If the focus is not on the text field anymore,
100 // delegate focus to
101 this._input.addEventListener(
102 'blur',
103 function (ev) {
104 const t = this;
105 if (!t._inField) {
106 t.value(t._input.value);
107 t.store(t.value());
108 };
109 ev.halt();
110 }.bind(this)
111 );
112
113 // Workaround to check the click is in the field
114 e.addEventListener(
115 'mousedown',
116 function () {
117 this._inField = true;
118 }.bind(this)
119 );
120
121 e.addEventListener(
122 'mouseup',
123 function () {
124 this._inField = false;
125 this._input.focus();
126 }.bind(this)
127 );
128
129 this._input.addEventListener(
130 'keypress',
131 function (ev) {
132 const t = this;
133 if (ev.keyCode == 13) {
134 t.value(t._input.value);
135 t.store(t.value());
136 return false;
137 };
138 }.bind(this)
139 );
140
141 return e;
142 }
143 };
144});