Make sign in a modal dialog box rather than a separate page

This commit is contained in:
Eelco Dolstra 2013-11-05 13:13:02 +01:00
parent 299ac07cbc
commit bd927eba66
4 changed files with 48 additions and 65 deletions

View file

@ -18,39 +18,19 @@ __PACKAGE__->config->{namespace} = '';
sub login :Local :Args(0) :ActionClass('REST::ForBrowsers') { } sub login :Local :Args(0) :ActionClass('REST::ForBrowsers') { }
sub login_GET {
my ($self, $c) = @_;
my $baseurl = $c->uri_for('/');
my $referer = $c->request->referer;
$c->session->{referer} = $referer if defined $referer && $referer =~ m/^($baseurl)/;
$c->stash->{template} = 'login.tt';
}
sub login_POST { sub login_POST {
my ($self, $c) = @_; my ($self, $c) = @_;
my $username; my $username = $c->stash->{params}->{username} // "";
my $password; my $password = $c->stash->{params}->{password} // "";
$username = $c->stash->{params}->{username}; error($c, "You must specify a user name.") if $username eq "";
$password = $c->stash->{params}->{password}; error($c, "You must specify a password.") if $password eq "";
if ($username && $password) { accessDenied($c, "Bad username or password.")
if ($c->authenticate({username => $username, password => $password})) { if !$c->authenticate({username => $username, password => $password});
if ($c->request->looks_like_browser) {
backToReferer($c); $self->status_ok($c, entity => { });
} else {
currentUser_GET($self, $c);
}
} else {
$self->status_forbidden($c, message => "Bad username or password.");
if ($c->request->looks_like_browser) {
login_GET($self, $c);
}
}
}
} }

View file

@ -146,6 +146,45 @@
</script> </script>
[% END %] [% END %]
[% IF !c.user_exists %]
<div id="hydra-signin" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
<form class="form-horizontal">
<div class="modal-body">
<div class="control-group">
<label class="control-label">User name</label>
<div class="controls">
<input type="text" class="span3" name="username" value=""/>
</div>
</div>
<div class="control-group">
<label class="control-label">Password</label>
<div class="controls">
<input type="password" class="span3" name="password" value=""/>
</div>
</div>
</div>
<div class="modal-footer">
<button id="do-signin" class="btn btn-primary">Sign in</button>
<button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
</div>
</form>
</div>
<script>
$("#do-signin").click(function() {
requestJSON({
url: "[% c.uri_for('/login') %]",
data: $(this).parents("form").serialize(),
type: 'POST',
success: function(data) {
window.location.reload();
}
});
return false;
});
</script>
[% END %]
</body> </body>
</html> </html>

View file

@ -1,36 +0,0 @@
[% WRAPPER layout.tt title="Sign in" %]
[% PROCESS common.tt %]
[% IF c.user_exists %]
<p class="alert alert-info">
You are already signed in as <tt>[% HTML.escape(c.user.username) %]</tt>.
</p>
[% ELSE %]
<form class="form-horizontal" method="post" action="[% c.uri_for('/login') %]">
<fieldset>
<div class="control-group">
<label class="control-label">User name</label>
<div class="controls">
<input type="text" class="span3" name="username" value=""/>
</div>
</div>
<div class="control-group">
<label class="control-label">Password</label>
<div class="controls">
<input type="password" class="span3" name="password" value=""/>
</div>
</div>
<div class="form-actions">
<input type="submit" name="login" value="Sign in" class="btn btn-primary" />
</div>
</fieldset>
</form>
[% END %]
[% END %]

View file

@ -128,7 +128,7 @@
</li> </li>
<li class="divider"></li> <li class="divider"></li>
<li> <li>
<a href="[% c.uri_for('/login') %]">Sign in with a Hydra account</a> <a href="#hydra-signin" data-toggle="modal">Sign in with a Hydra account</a>
</li> </li>
[% END %] [% END %]
[% END %] [% END %]