link: function()

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;
                }
            }));
        }