function directive()

in modules/frontend/app/directives/retain-selection.directive.js [29:73]


    function directive(scope, elem) {
        elem.on('keydown', function(evt) {
            const key = evt.which;
            const ctrlDown = evt.ctrlKey || evt.metaKey;
            const input = this;
            let start = input.selectionStart;

            if (promise)
                $timeout.cancel(promise);

            promise = $timeout(() => {
                let setCursor = false;

                // Handle Backspace[8].
                if (key === 8 && start > 0) {
                    start -= 1;

                    setCursor = true;
                }
                // Handle Del[46].
                else if (key === 46)
                    setCursor = true;
                // Handle: Caps Lock[20], Tab[9], Shift[16], Ctrl[17], Alt[18], Esc[27], Enter[13], Arrows[37..40], Home[36], End[35], Ins[45], PgUp[33], PgDown[34], F1..F12[111..124], Num Lock[], Scroll Lock[145].
                else if (!(key === 8 || key === 9 || key === 13 || (key > 15 && key < 20) || key === 27 ||
                    (key > 32 && key < 41) || key === 45 || (key > 111 && key < 124) || key === 144 || key === 145)) {
                    // Handle: Ctrl + [A[65], C[67], V[86]].
                    if (!(ctrlDown && (key === 65 || key === 67 || key === 86))) {
                        start += 1;

                        setCursor = true;
                    }
                }

                if (setCursor)
                    input.setSelectionRange(start, start);

                promise = null;
            });
        });

        // Removes bound events in the element itself when the scope is destroyed
        scope.$on('$destroy', function() {
            elem.off('keydown');
        });
    }