otsdaq_utilities  v2_05_02_indev
keybindings.js
1 var Keybindings = function(table){
2  this.table = table; //hold Tabulator object
3  this.watchKeys = null;
4  this.pressedKeys = null;
5  this.keyupBinding = false;
6  this.keydownBinding = false;
7 };
8 
9 Keybindings.prototype.initialize = function(){
10  var bindings = this.table.options.keybindings,
11  mergedBindings = {};
12 
13  this.watchKeys = {};
14  this.pressedKeys = [];
15 
16  if(bindings !== false){
17 
18  for(let key in this.bindings){
19  mergedBindings[key] = this.bindings[key];
20  }
21 
22  if(Object.keys(bindings).length){
23 
24  for(let key in bindings){
25  mergedBindings[key] = bindings[key];
26  }
27  }
28 
29  this.mapBindings(mergedBindings);
30  this.bindEvents();
31  }
32 };
33 
34 Keybindings.prototype.mapBindings = function(bindings){
35  var self = this;
36 
37  for(let key in bindings){
38 
39  if(this.actions[key]){
40 
41  if(bindings[key]){
42 
43  if(typeof bindings[key] !== "object"){
44  bindings[key] = [bindings[key]];
45  }
46 
47  bindings[key].forEach(function(binding){
48  self.mapBinding(key, binding);
49  });
50  }
51 
52  }else{
53  console.warn("Key Binding Error - no such action:", key);
54  }
55  }
56 };
57 
58 Keybindings.prototype.mapBinding = function(action, symbolsList){
59  var self = this;
60 
61  var binding = {
62  action: this.actions[action],
63  keys: [],
64  ctrl: false,
65  shift: false,
66  };
67 
68  var symbols = symbolsList.toString().toLowerCase().split(" ").join("").split("+");
69 
70  symbols.forEach(function(symbol){
71  switch(symbol){
72  case "ctrl":
73  binding.ctrl = true;
74  break;
75 
76  case "shift":
77  binding.shift = true;
78  break;
79 
80  default:
81  symbol = parseInt(symbol);
82  binding.keys.push(symbol);
83 
84  if(!self.watchKeys[symbol]){
85  self.watchKeys[symbol] = [];
86  }
87 
88  self.watchKeys[symbol].push(binding);
89  }
90  });
91 };
92 
93 Keybindings.prototype.bindEvents = function(){
94  var self = this;
95 
96  this.keyupBinding = function(e){
97  var code = e.keyCode;
98  var bindings = self.watchKeys[code];
99 
100  if(bindings){
101 
102  self.pressedKeys.push(code);
103 
104  bindings.forEach(function(binding){
105  self.checkBinding(e, binding);
106  });
107  }
108  };
109 
110  this.keydownBinding = function(e){
111  var code = e.keyCode;
112  var bindings = self.watchKeys[code];
113 
114  if(bindings){
115 
116  var index = self.pressedKeys.indexOf(code);
117 
118  if(index > -1){
119  self.pressedKeys.splice(index, 1);
120  }
121  }
122  };
123 
124  this.table.element.addEventListener("keydown", this.keyupBinding);
125 
126  this.table.element.addEventListener("keyup", this.keydownBinding);
127 };
128 
129 Keybindings.prototype.clearBindings = function(){
130  if(this.keyupBinding){
131  this.table.element.removeEventListener("keydown", this.keyupBinding);
132  }
133 
134  if(this.keydownBinding){
135  this.table.element.removeEventListener("keyup", this.keydownBinding);
136  }
137 };
138 
139 
140 Keybindings.prototype.checkBinding = function(e, binding){
141  var self = this,
142  match = true;
143 
144  if(e.ctrlKey == binding.ctrl && e.shiftKey == binding.shift){
145  binding.keys.forEach(function(key){
146  var index = self.pressedKeys.indexOf(key);
147 
148  if(index == -1){
149  match = false;
150  }
151  });
152 
153  if(match){
154  binding.action.call(self, e);
155  }
156 
157  return true;
158  }
159 
160  return false;
161 };
162 
163 //default bindings
164 Keybindings.prototype.bindings = {
165  navPrev:"shift + 9",
166  navNext:9,
167  navUp:38,
168  navDown:40,
169  scrollPageUp:33,
170  scrollPageDown:34,
171  scrollToStart:36,
172  scrollToEnd:35,
173  undo:"ctrl + 90",
174  redo:"ctrl + 89",
175  copyToClipboard:"ctrl + 67",
176 };
177 
178 //default actions
179 Keybindings.prototype.actions = {
180  keyBlock:function(e){
181  e.stopPropagation();
182  e.preventDefault();
183  },
184  scrollPageUp:function(e){
185  var rowManager = this.table.rowManager,
186  newPos = rowManager.scrollTop - rowManager.height,
187  scrollMax = rowManager.element.scrollHeight;
188 
189  e.preventDefault();
190 
191  if(rowManager.displayRowsCount){
192  if(newPos >= 0){
193  rowManager.element.scrollTop = newPos;
194  }else{
195  rowManager.scrollToRow(rowManager.getDisplayRows()[0]);
196  }
197  }
198 
199  this.table.element.focus();
200  },
201  scrollPageDown:function(e){
202  var rowManager = this.table.rowManager,
203  newPos = rowManager.scrollTop + rowManager.height,
204  scrollMax = rowManager.element.scrollHeight;
205 
206  e.preventDefault();
207 
208  if(rowManager.displayRowsCount){
209  if(newPos <= scrollMax){
210  rowManager.element.scrollTop = newPos;
211  }else{
212  rowManager.scrollToRow(rowManager.getDisplayRows()[rowManager.displayRowsCount - 1]);
213  }
214  }
215 
216  this.table.element.focus();
217 
218  },
219  scrollToStart:function(e){
220  var rowManager = this.table.rowManager;
221 
222  e.preventDefault();
223 
224  if(rowManager.displayRowsCount){
225  rowManager.scrollToRow(rowManager.getDisplayRows()[0]);
226  }
227 
228  this.table.element.focus();
229  },
230  scrollToEnd:function(e){
231  var rowManager = this.table.rowManager;
232 
233  e.preventDefault();
234 
235  if(rowManager.displayRowsCount){
236  rowManager.scrollToRow(rowManager.getDisplayRows()[rowManager.displayRowsCount - 1]);
237  }
238 
239  this.table.element.focus();
240  },
241  navPrev:function(e){
242  var cell = false;
243 
244  if(this.table.modExists("edit")){
245  cell = this.table.modules.edit.currentCell;
246 
247  if(cell){
248  e.preventDefault();
249  cell.nav().prev();
250  }
251  }
252  },
253 
254  navNext:function(e){
255  var cell = false;
256  var newRow = this.table.options.tabEndNewRow;
257  var nav;
258 
259  if(this.table.modExists("edit")){
260  cell = this.table.modules.edit.currentCell;
261 
262  if(cell){
263  e.preventDefault();
264 
265  nav = cell.nav();
266 
267  if(!nav.next()){
268  if(newRow){
269  if(newRow === true){
270  newRow = this.table.addRow({})
271  }else{
272  if(typeof newRow == "function"){
273  newRow = this.table.addRow(newRow(cell.row.getComponent()))
274  }else{
275  newRow = this.table.addRow(newRow)
276  }
277  }
278 
279  newRow.then(() => {
280  nav.next();
281  });
282  }
283  }
284  }
285  }
286  },
287 
288  navLeft:function(e){
289  var cell = false;
290 
291  if(this.table.modExists("edit")){
292  cell = this.table.modules.edit.currentCell;
293 
294  if(cell){
295  e.preventDefault();
296  cell.nav().left();
297  }
298  }
299  },
300 
301  navRight:function(e){
302  var cell = false;
303 
304  if(this.table.modExists("edit")){
305  cell = this.table.modules.edit.currentCell;
306 
307  if(cell){
308  e.preventDefault();
309  cell.nav().right();
310  }
311  }
312  },
313 
314  navUp:function(e){
315  var cell = false;
316 
317  if(this.table.modExists("edit")){
318  cell = this.table.modules.edit.currentCell;
319 
320  if(cell){
321  e.preventDefault();
322  cell.nav().up();
323  }
324  }
325  },
326 
327  navDown:function(e){
328  var cell = false;
329 
330  if(this.table.modExists("edit")){
331  cell = this.table.modules.edit.currentCell;
332 
333  if(cell){
334  e.preventDefault();
335  cell.nav().down();
336  }
337  }
338  },
339 
340  undo:function(e){
341  var cell = false;
342  if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){
343 
344  cell = this.table.modules.edit.currentCell;
345 
346  if(!cell){
347  e.preventDefault();
348  this.table.modules.history.undo();
349  }
350  }
351  },
352 
353  redo:function(e){
354  var cell = false;
355  if(this.table.options.history && this.table.modExists("history") && this.table.modExists("edit")){
356 
357  cell = this.table.modules.edit.currentCell;
358 
359  if(!cell){
360  e.preventDefault();
361  this.table.modules.history.redo();
362  }
363  }
364  },
365 
366  copyToClipboard:function(e){
367  if(!this.table.modules.edit.currentCell){
368  if(this.table.modExists("clipboard", true)){
369  this.table.modules.clipboard.copy(!this.table.options.selectable || this.table.options.selectable == "highlight" ? "active" : "selected", null, null, null, true);
370  }
371  }
372  },
373 };
374 
375 
376 Tabulator.prototype.registerModule("keybindings", Keybindings);