in kahuna/public/js/components/gr-chips/gr-chip-input.js [46:150]
link: function(scope, element, attrs, [$grChipCtrl, $grChipsCtrl]) {
const [
onEnterExpr,
backspaceStartExpr,
deleteEndExpr
] = [
attrs.grChipInputOnEnter,
attrs.grChipInputBackspaceAtStart,
attrs.grChipInputDeleteAtEnd
].map(attr => attr && $parse(attr));
scope.$watchCollection(() => ({focusedItem: $grChipsCtrl.focusedItem,
caretStartOffset: $grChipsCtrl.caretStartOffset,
caretEndOffset: $grChipsCtrl.caretEndOffset}),
({focusedItem, caretStartOffset, caretEndOffset}) => {
// Focus self (unless already focused)
if (focusedItem === $grChipCtrl.chip) {
const selStart = element[0].selectionStart;
const selEnd = element[0].selectionEnd;
// Unless already focused at the same caret location
if (document.activeElement !== element[0] ||
selStart !== caretStartOffset ||
selEnd !== caretEndOffset) {
// Yield to avoid digest-within-digest of focus event
$timeout(() => {
element[0].focus();
element[0].setSelectionRange(caretStartOffset, caretEndOffset);
});
}
}
});
element.on('focus', () => {
// Caret position not set yet, yield to get it
$timeout(() => {
const selStart = element[0].selectionStart;
const selEnd = element[0].selectionEnd;
$grChipsCtrl.setFocusedChip($grChipCtrl.chip, selStart, selEnd);
});
});
element.on('blur', () => {
$grChipsCtrl.unsetFocusedChip($grChipCtrl.chip);
scope.$digest();
});
element.on('input', () => {
const selStart = element[0].selectionStart;
const selEnd = element[0].selectionEnd;
$grChipsCtrl.onChange();
$grChipsCtrl.setFocusedChip($grChipCtrl.chip, selStart, selEnd);
scope.$apply();
});
element.on('keydown', keyHandler(function({which, atInputStart, atInputEnd}) {
switch (which) {
case ENTER_KEY:
if (onEnterExpr) {
onEnterExpr(scope);
scope.$apply();
return true;
}
break;
case LEFT_KEY:
if (atInputStart) {
$grChipsCtrl.focusEndOfChipBefore($grChipCtrl.chip);
scope.$apply();
return true;
}
break;
case RIGHT_KEY:
if (atInputEnd) {
$grChipsCtrl.focusStartOfChipAfter($grChipCtrl.chip);
scope.$apply();
return true;
}
break;
case BACKSPACE_KEY:
if (atInputStart && backspaceStartExpr) {
backspaceStartExpr(scope);
scope.$apply();
return true;
}
break;
case DELETE_KEY:
if (atInputEnd && deleteEndExpr) {
deleteEndExpr(scope);
scope.$apply();
return true;
}
break;
// Emulate Home/End to go to start/end of input
case HOME_KEY:
$grChipsCtrl.focusStartOfFirstChip();
scope.$apply();
return true;
case END_KEY:
$grChipsCtrl.focusEndOfLastChip();
scope.$apply();
return true;
}
}));
}