Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added autofocus support for input items in modal template #67

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

lexbailey
Copy link

I'm new to Angular and Bootstrap and was looking at this modal service. It mostly does what I wanted but it would only autofocus the input box the first time it appeared. I have added some code that looks for any inputs with the autofocus attribute, if it finds one then it focuses it.

At the moment this relies on a timeout. It doesn't work without the timeout but there may be a better way to get it to happen at the correct time, I don't know enough about angular or bootstrap to be able to come up with a better way.

The complex example should now autofocus the name box.

@coveralls
Copy link

Coverage Status

Coverage decreased (-7.58%) to 92.42% when pulling fc630e9 on danieljabailey:master into beb2c50 on dwmkerr:master.

@dwmkerr
Copy link
Owner

dwmkerr commented Feb 19, 2016

@danieljabailey Hi Daniel, thanks for this. If there is an element with an autofocus field elsewhere in the document tree, for example before and after the modal, this could interfere with the logic yes?

@lexbailey
Copy link
Author

@dwmkerr Yeah, probably but it doesn't make much sense to have two things set to autofocus. You can only focus one of them at a time anyway.

@Xample
Copy link

Xample commented Feb 25, 2016

interesting branch, however I would refocus on the last element which was focused before the modal to open up.

Before we open the modal:

// Keep the current focused element
self.previousFocus = document.activeElement;

Right after we close it

// Set the focus back to the kept element (if any)
self.previousFocus && self.previousFocus.focus();

@rolek
Copy link

rolek commented Nov 4, 2016

My solution to this is:

//  We now have a modal object...
                    var modal = {
                        controller: modalController,
                        scope: modalScope,
                        element: modalElement,
                        close: closeDeferred.promise,
                        closed: closedDeferred.promise
                    };
                    angular.forEach(modalElement.find('input'), function(input) {
                        if (input.attributes.getNamedItem('autofocus')) {
                            input.focus();
                        }               
                    });
                    //  ...which is passed to the caller via the promise.
                    deferred.resolve(modal);

This allows you to have multiple modal templates on a single page and autofocus will work in each of them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants