|
1 | 1 | (function () {
|
2 | 2 | "use strict";
|
3 | 3 |
|
| 4 | + var KEY = { |
| 5 | + TAB: 9, |
| 6 | + ENTER: 13, |
| 7 | + ESC: 27, |
| 8 | + SPACE: 32, |
| 9 | + LEFT: 37, |
| 10 | + UP: 38, |
| 11 | + RIGHT: 39, |
| 12 | + DOWN: 40, |
| 13 | + SHIFT: 16, |
| 14 | + CTRL: 17, |
| 15 | + ALT: 18, |
| 16 | + PAGE_UP: 33, |
| 17 | + PAGE_DOWN: 34, |
| 18 | + HOME: 36, |
| 19 | + END: 35, |
| 20 | + BACKSPACE: 8, |
| 21 | + DELETE: 46, |
| 22 | + isControl: function (e) { |
| 23 | + var k = e.which; |
| 24 | + switch (k) { |
| 25 | + case KEY.SHIFT: |
| 26 | + case KEY.CTRL: |
| 27 | + case KEY.ALT: |
| 28 | + return true; |
| 29 | + } |
| 30 | + |
| 31 | + if (e.metaKey) return true; |
| 32 | + |
| 33 | + return false; |
| 34 | + }, |
| 35 | + isFunctionKey: function (k) { |
| 36 | + k = k.which ? k.which : k; |
| 37 | + return k >= 112 && k <= 123; |
| 38 | + }, |
| 39 | + isVerticalMovement: function (k){ |
| 40 | + return ~[KEY.UP, KEY.DOWN].indexOf(k); |
| 41 | + }, |
| 42 | + isHorizontalMovement: function (k){ |
| 43 | + return ~[KEY.LEFT,KEY.RIGHT,KEY.BACKSPACE,KEY.DELETE].indexOf(k); |
| 44 | + } |
| 45 | + }; |
| 46 | + |
4 | 47 | /**
|
5 | 48 | * Add querySelectorAll() to jqLite.
|
6 | 49 | *
|
|
261 | 304 | });
|
262 | 305 |
|
263 | 306 | if(ctrl.multiple){
|
264 |
| - if(!_itemInSelected(item)){ |
265 |
| - ctrl.selected.push(item); |
266 |
| - ctrl.sizeSearchInput(); |
267 |
| - } |
| 307 | + ctrl.selected.push(item); |
| 308 | + ctrl.sizeSearchInput(); |
268 | 309 | } else {
|
269 | 310 | ctrl.selected = item;
|
270 | 311 | }
|
|
306 | 347 | }, 0, false);
|
307 | 348 | };
|
308 | 349 |
|
309 |
| - var Key = { |
310 |
| - Enter: 13, |
311 |
| - Tab: 9, |
312 |
| - Up: 38, |
313 |
| - Down: 40, |
314 |
| - Left: 37, |
315 |
| - Right: 39, |
316 |
| - Backspace: 8, |
317 |
| - Delete: 46, |
318 |
| - Escape: 27 |
319 |
| - }; |
320 |
| - |
321 |
| - Key.verticalMovement = [Key.Up,Key.Down]; |
322 |
| - Key.horizontalMovement = [Key.Left,Key.Right,Key.Backspace,Key.Delete]; |
323 |
| - |
324 | 350 | function _handleDropDownSelection(key) {
|
325 | 351 | var processed = true;
|
326 | 352 | switch (key) {
|
327 |
| - case Key.Down: |
| 353 | + case KEY.DOWN: |
328 | 354 | if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode
|
329 | 355 | else if (ctrl.activeIndex < ctrl.items.length - 1) { ctrl.activeIndex++; }
|
330 | 356 | break;
|
331 |
| - case Key.Up: |
| 357 | + case KEY.UP: |
332 | 358 | if (!ctrl.open && ctrl.multiple) ctrl.activate(false, true); //In case its the search input in 'multiple' mode
|
333 | 359 | else if (ctrl.activeIndex > 0) { ctrl.activeIndex--; }
|
334 | 360 | break;
|
335 |
| - case Key.Tab: |
| 361 | + case KEY.TAB: |
336 | 362 | //TODO: Que hacemos en modo multiple?
|
337 | 363 | if (!ctrl.multiple) ctrl.select(ctrl.items[ctrl.activeIndex]);
|
338 | 364 | break;
|
339 |
| - case Key.Enter: |
| 365 | + case KEY.ENTER: |
340 | 366 | if(ctrl.open){
|
341 | 367 | ctrl.select(ctrl.items[ctrl.activeIndex]);
|
342 | 368 | } else {
|
343 | 369 | ctrl.activate(false, true); //In case its the search input in 'multiple' mode
|
344 | 370 | }
|
345 | 371 | break;
|
346 |
| - case Key.Escape: |
| 372 | + case KEY.ESC: |
347 | 373 | ctrl.close();
|
348 | 374 | break;
|
349 | 375 | default:
|
|
364 | 390 | prev = ctrl.activeMatchIndex-1,
|
365 | 391 | newIndex = curr;
|
366 | 392 |
|
367 |
| - if(caretPosition > 0 || (ctrl.search.length && key == Key.Right)) return false; |
| 393 | + if(caretPosition > 0 || (ctrl.search.length && key == KEY.RIGHT)) return false; |
368 | 394 |
|
369 | 395 | ctrl.close();
|
370 | 396 |
|
371 |
| - function __getNewIndex(){ |
| 397 | + function getNewActiveMatchIndex(){ |
372 | 398 | switch(key){
|
373 |
| - case Key.Left: |
| 399 | + case KEY.LEFT: |
374 | 400 | // Select previous/first item
|
375 | 401 | if(~ctrl.activeMatchIndex) return prev;
|
376 | 402 | // Select last item
|
377 | 403 | else return last;
|
378 | 404 | break;
|
379 |
| - case Key.Right: |
| 405 | + case KEY.RIGHT: |
380 | 406 | // Open drop-down
|
381 | 407 | if(!~ctrl.activeMatchIndex || curr === last){
|
382 | 408 | ctrl.activate();
|
|
385 | 411 | // Select next/last item
|
386 | 412 | else return next;
|
387 | 413 | break;
|
388 |
| - case Key.Backspace: |
| 414 | + case KEY.BACKSPACE: |
389 | 415 | // Remove selected item and select previous/first
|
390 | 416 | if(~ctrl.activeMatchIndex){
|
391 | 417 | ctrl.removeChoice(curr);
|
|
394 | 420 | // Select last item
|
395 | 421 | else return last;
|
396 | 422 | break;
|
397 |
| - case Key.Delete: |
| 423 | + case KEY.DELETE: |
398 | 424 | // Remove selected item and select next item
|
399 | 425 | if(~ctrl.activeMatchIndex){
|
400 | 426 | ctrl.removeChoice(ctrl.activeMatchIndex);
|
|
404 | 430 | }
|
405 | 431 | }
|
406 | 432 |
|
407 |
| - newIndex = __getNewIndex(); |
| 433 | + newIndex = getNewActiveMatchIndex(); |
408 | 434 |
|
409 | 435 | if(!ctrl.selected.length || newIndex === false) ctrl.activeMatchIndex = -1;
|
410 | 436 | else ctrl.activeMatchIndex = Math.min(last,Math.max(first,newIndex));
|
|
417 | 443 |
|
418 | 444 | var key = e.which;
|
419 | 445 |
|
420 |
| - // if(~[Key.Escape,Key.Tab].indexOf(key)){ |
| 446 | + // if(~[KEY.ESC,KEY.TAB].indexOf(key)){ |
421 | 447 | // //TODO: SEGURO?
|
422 | 448 | // ctrl.close();
|
423 | 449 | // }
|
424 | 450 |
|
425 | 451 | $scope.$apply(function() {
|
426 | 452 | var processed = false;
|
427 | 453 |
|
428 |
| - if(ctrl.multiple && ~Key.horizontalMovement.indexOf(key)){ |
| 454 | + if(ctrl.multiple && KEY.isHorizontalMovement(key)){ |
429 | 455 | processed = _handleMatchSelection(key);
|
430 | 456 | }
|
431 | 457 |
|
432 | 458 | if (!processed && ctrl.items.length > 0) {
|
433 | 459 | processed = _handleDropDownSelection(key);
|
434 | 460 | }
|
435 | 461 |
|
436 |
| - if (processed && key != Key.Tab) { |
| 462 | + if (processed && key != KEY.TAB) { |
437 | 463 | //TODO Check si el tab selecciona aun correctamente
|
438 | 464 | //Crear test
|
439 | 465 | e.preventDefault();
|
440 | 466 | e.stopPropagation();
|
441 | 467 | }
|
442 | 468 | });
|
443 | 469 |
|
444 |
| - if(~Key.verticalMovement.indexOf(key) && ctrl.items.length > 0){ |
| 470 | + if(KEY.isVerticalMovement(key) && ctrl.items.length > 0){ |
445 | 471 | _ensureHighlightVisible();
|
446 | 472 | }
|
447 | 473 |
|
|
454 | 480 | });
|
455 | 481 | });
|
456 | 482 |
|
457 |
| - function _itemInSelected(item){ |
458 |
| - var match = false; |
459 |
| - angular.forEach(ctrl.selected,function(value){ |
460 |
| - // We need to use angular.equals for when an initially selected item lacks $$hashKey and stuff. |
461 |
| - if(angular.equals(item,value)) match = true; |
462 |
| - }); |
463 |
| - |
464 |
| - return match; |
465 |
| - } |
466 |
| - |
467 | 483 | function _getCaretPosition(el) {
|
468 | 484 | if(angular.isNumber(el.selectionStart)) return el.selectionStart;
|
469 | 485 | // selectionStart is not supported in IE8 and we don't want hacky workarounds so we compromise
|
|
634 | 650 |
|
635 | 651 | });
|
636 | 652 |
|
637 |
| - //TODO Refactor to reuse the KEY object from uiSelectCtrl |
638 |
| - var KEY = { |
639 |
| - TAB: 9, |
640 |
| - ENTER: 13, |
641 |
| - ESC: 27, |
642 |
| - SPACE: 32, |
643 |
| - LEFT: 37, |
644 |
| - UP: 38, |
645 |
| - RIGHT: 39, |
646 |
| - DOWN: 40, |
647 |
| - SHIFT: 16, |
648 |
| - CTRL: 17, |
649 |
| - ALT: 18, |
650 |
| - PAGE_UP: 33, |
651 |
| - PAGE_DOWN: 34, |
652 |
| - HOME: 36, |
653 |
| - END: 35, |
654 |
| - BACKSPACE: 8, |
655 |
| - DELETE: 46, |
656 |
| - isArrow: function (k) { |
657 |
| - k = k.which ? k.which : k; |
658 |
| - switch (k) { |
659 |
| - case KEY.LEFT: |
660 |
| - case KEY.RIGHT: |
661 |
| - case KEY.UP: |
662 |
| - case KEY.DOWN: |
663 |
| - return true; |
664 |
| - } |
665 |
| - return false; |
666 |
| - }, |
667 |
| - isControl: function (e) { |
668 |
| - var k = e.which; |
669 |
| - switch (k) { |
670 |
| - case KEY.SHIFT: |
671 |
| - case KEY.CTRL: |
672 |
| - case KEY.ALT: |
673 |
| - return true; |
674 |
| - } |
675 |
| - |
676 |
| - if (e.metaKey) return true; |
677 |
| - |
678 |
| - return false; |
679 |
| - }, |
680 |
| - isFunctionKey: function (k) { |
681 |
| - k = k.which ? k.which : k; |
682 |
| - return k >= 112 && k <= 123; |
683 |
| - } |
684 |
| - }; |
685 |
| - |
686 | 653 | }
|
687 | 654 |
|
688 | 655 |
|
|
0 commit comments