|
1 | 1 | /*! |
2 | 2 | * ui-select |
3 | 3 | * http://github.com/angular-ui/ui-select |
4 | | - * Version: 0.8.1 - 2014-10-07T21:36:20.165Z |
| 4 | + * Version: 0.8.2 - 2014-10-09T23:29:49.713Z |
5 | 5 | * License: MIT |
6 | 6 | */ |
7 | 7 |
|
|
27 | 27 | END: 35, |
28 | 28 | BACKSPACE: 8, |
29 | 29 | DELETE: 46, |
| 30 | + COMMAND: 91, |
30 | 31 | isControl: function (e) { |
31 | 32 | var k = e.which; |
32 | 33 | switch (k) { |
| 34 | + case KEY.COMMAND: |
33 | 35 | case KEY.SHIFT: |
34 | 36 | case KEY.CTRL: |
35 | 37 | case KEY.ALT: |
|
190 | 192 | ctrl.activate = function(initSearchValue, avoidReset) { |
191 | 193 | if (!ctrl.disabled && !ctrl.open) { |
192 | 194 | if(!avoidReset) _resetSearchInput(); |
| 195 | + ctrl.focusser.prop('disabled', true); //Will reactivate it on .close() |
193 | 196 | ctrl.open = true; |
194 | 197 | ctrl.activeMatchIndex = -1; |
195 | 198 |
|
|
309 | 312 | }; |
310 | 313 |
|
311 | 314 | ctrl.isActive = function(itemScope) { |
312 | | - return ctrl.items.indexOf(itemScope[ctrl.itemProperty]) === ctrl.activeIndex; |
| 315 | + return ctrl.open && ctrl.items.indexOf(itemScope[ctrl.itemProperty]) === ctrl.activeIndex; |
313 | 316 | }; |
314 | 317 |
|
315 | 318 | ctrl.isDisabled = function(itemScope) { |
| 319 | + |
| 320 | + if (!ctrl.open) return; |
| 321 | + |
316 | 322 | var itemIndex = ctrl.items.indexOf(itemScope[ctrl.itemProperty]); |
317 | 323 | var isDisabled = false; |
318 | 324 | var item; |
|
327 | 333 | }; |
328 | 334 |
|
329 | 335 | // When the user clicks on an item inside the dropdown |
330 | | - ctrl.select = function(item) { |
| 336 | + ctrl.select = function(item, skipFocusser) { |
331 | 337 |
|
332 | | - if (!item._uiSelectChoiceDisabled) { |
| 338 | + if (item === undefined || !item._uiSelectChoiceDisabled) { |
333 | 339 | var locals = {}; |
334 | 340 | locals[ctrl.parserResult.itemName] = item; |
335 | 341 |
|
|
344 | 350 | } else { |
345 | 351 | ctrl.selected = item; |
346 | 352 | } |
347 | | - ctrl.close(); |
| 353 | + ctrl.close(skipFocusser); |
348 | 354 | } |
349 | 355 | }; |
350 | 356 |
|
351 | 357 | // Closes the dropdown |
352 | | - ctrl.close = function() { |
353 | | - if (ctrl.open) { |
354 | | - _resetSearchInput(); |
355 | | - ctrl.open = false; |
| 358 | + ctrl.close = function(skipFocusser) { |
| 359 | + if (!ctrl.open) return; |
| 360 | + _resetSearchInput(); |
| 361 | + ctrl.open = false; |
| 362 | + if (!ctrl.multiple){ |
356 | 363 | $timeout(function(){ |
357 | | - ctrl.focusser[0].focus(); |
| 364 | + ctrl.focusser.prop('disabled', false); |
| 365 | + if (!skipFocusser) ctrl.focusser[0].focus(); |
358 | 366 | },0,false); |
359 | 367 | } |
360 | 368 | }; |
|
368 | 376 |
|
369 | 377 | // Remove item from multiple select |
370 | 378 | ctrl.removeChoice = function(index){ |
| 379 | + var removedChoice = ctrl.selected[index]; |
| 380 | + var locals = {}; |
| 381 | + locals[ctrl.parserResult.itemName] = removedChoice; |
| 382 | + |
371 | 383 | ctrl.selected.splice(index, 1); |
372 | 384 | ctrl.activeMatchIndex = -1; |
373 | 385 | ctrl.sizeSearchInput(); |
| 386 | + |
| 387 | + ctrl.onRemoveCallback($scope, { |
| 388 | + $item: removedChoice, |
| 389 | + $model: ctrl.parserResult.modelMapper($scope, locals) |
| 390 | + }); |
374 | 391 | }; |
375 | 392 |
|
376 | 393 | ctrl.getPlaceholder = function(){ |
|
402 | 419 | else if (ctrl.activeIndex > 0) { ctrl.activeIndex--; } |
403 | 420 | break; |
404 | 421 | case KEY.TAB: |
405 | | - //TODO: Que hacemos en modo multiple? |
406 | | - if (!ctrl.multiple) ctrl.select(ctrl.items[ctrl.activeIndex]); |
| 422 | + if (!ctrl.multiple || ctrl.open) ctrl.select(ctrl.items[ctrl.activeIndex], true); |
407 | 423 | break; |
408 | 424 | case KEY.ENTER: |
409 | 425 | if(ctrl.open){ |
|
497 | 513 | if(ctrl.multiple && KEY.isHorizontalMovement(key)){ |
498 | 514 | processed = _handleMatchSelection(key); |
499 | 515 | } |
500 | | - |
| 516 | + |
501 | 517 | if (!processed && ctrl.items.length > 0) { |
502 | 518 | processed = _handleDropDownSelection(key); |
503 | 519 | } |
|
519 | 535 | _searchInput.on('blur', function() { |
520 | 536 | $timeout(function() { |
521 | 537 | ctrl.activeMatchIndex = -1; |
522 | | - ctrl.activeIndex = 0; |
523 | 538 | }); |
524 | 539 | }); |
525 | 540 |
|
|
580 | 595 |
|
581 | 596 | var searchInput = element.querySelectorAll('input.ui-select-search'); |
582 | 597 |
|
583 | | - $select.multiple = angular.isDefined(attrs.multiple); |
| 598 | + $select.multiple = (angular.isDefined(attrs.multiple)) ? (attrs.multiple === '') ? true : (attrs.multiple.toLowerCase() === 'true') : false; |
584 | 599 |
|
585 | 600 | $select.onSelectCallback = $parse(attrs.onSelect); |
| 601 | + $select.onRemoveCallback = $parse(attrs.onRemove); |
586 | 602 |
|
587 | 603 | //From view --> model |
588 | 604 | ngModel.$parsers.unshift(function (inputValue) { |
|
692 | 708 | e.preventDefault(); |
693 | 709 | e.stopPropagation(); |
694 | 710 | $select.select(undefined); |
695 | | - scope.$digest(); |
| 711 | + scope.$apply(); |
696 | 712 | return; |
697 | 713 | } |
698 | 714 |
|
|
0 commit comments