1
0
mirror of https://github.com/bitwarden/web synced 2025-12-15 07:43:16 +00:00

UI tweaks for org invites

This commit is contained in:
Kyle Spearrin
2017-03-28 21:16:44 -04:00
parent 4d2cae0b0f
commit e12582c2c2
8 changed files with 62 additions and 22 deletions

View File

@@ -5,10 +5,10 @@ angular
$state, appSettings, $analytics) { $state, appSettings, $analytics) {
var returnState = $state.params.returnState; var returnState = $state.params.returnState;
var rememberedEmail = $cookies.get(appSettings.rememberedEmailCookieName); var rememberedEmail = $cookies.get(appSettings.rememberedEmailCookieName);
if (rememberedEmail) { if (rememberedEmail || $state.params.email) {
$scope.model = { $scope.model = {
email: rememberedEmail, email: $state.params.email ? $state.params.email : rememberedEmail,
rememberEmail: true rememberEmail: rememberedEmail !== null
}; };
} }

View File

@@ -7,7 +7,7 @@ angular
params: $state.params params: $state.params
}; };
if (!$state.params.organizationId || !$state.params.organizationUserId || !$state.params.token) { if (!$state.params.organizationId || !$state.params.organizationUserId || !$state.params.token || !$state.params.email) {
$state.go('frontend.login.info').then(function () { $state.go('frontend.login.info').then(function () {
toastr.error('Invalid parameters.'); toastr.error('Invalid parameters.');
}); });

View File

@@ -4,12 +4,14 @@ angular
.controller('accountsRegisterController', function ($scope, $location, apiService, cryptoService, validationService, .controller('accountsRegisterController', function ($scope, $location, apiService, cryptoService, validationService,
$analytics, $state) { $analytics, $state) {
var params = $location.search(); var params = $location.search();
var stateParams = $state.params;
$scope.returnState = $state.params.returnState; $scope.returnState = $state.params.returnState;
$scope.success = false; $scope.success = false;
$scope.model = { $scope.model = {
email: params.email email: params.email ? params.email : stateParams.email
}; };
$scope.readOnlyEmail = stateParams.email !== null;
$scope.registerPromise = null; $scope.registerPromise = null;
$scope.register = function (form) { $scope.register = function (form) {

View File

@@ -11,17 +11,24 @@
</div> </div>
<div ng-show="!loading && !accepting"> <div ng-show="!loading && !accepting">
<p class="login-box-msg">Join Organization</p> <p class="login-box-msg">Join Organization</p>
<p class="text-center"><strong>{{state.params.email}}</strong></p>
<p> <p>
You've been invited to join the ____ organization. To accept the invitation, you need to log in or You've been invited to join the an organization. To accept the invitation, you need to log in or
create a new bitwarden account. create a new bitwarden account.
</p> </p>
<hr /> <hr />
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-6">
<p><a ui-sref="frontend.login.info({returnState: state})" class="btn btn-primary btn-block btn-flat">Log In</a></p> <p>
<a ui-sref="frontend.login.info({returnState: state, email: state.params.email})"
class="btn btn-primary btn-block btn-flat">Log In</a>
</p>
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<p><a ui-sref="frontend.register({returnState: state})" class="btn btn-primary btn-block btn-flat">Create Account</a></p> <p>
<a ui-sref="frontend.register({returnState: state, email: state.params.email})"
class="btn btn-primary btn-block btn-flat">Create Account</a>
</p>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -22,7 +22,7 @@
<div class="form-group has-feedback" show-errors> <div class="form-group has-feedback" show-errors>
<label for="email" class="sr-only">Email</label> <label for="email" class="sr-only">Email</label>
<input type="email" id="email" name="Email" class="form-control" placeholder="Email" ng-model="model.email" <input type="email" id="email" name="Email" class="form-control" placeholder="Email" ng-model="model.email"
required api-field /> ng-readonly="readOnlyEmail" required api-field />
<span class="fa fa-envelope form-control-feedback"></span> <span class="fa fa-envelope form-control-feedback"></span>
<p class="help-block">You'll use your email address to log in.</p> <p class="help-block">You'll use your email address to log in.</p>
</div> </div>

View File

@@ -150,7 +150,8 @@ angular
templateUrl: 'app/accounts/views/accountsLogin.html', templateUrl: 'app/accounts/views/accountsLogin.html',
controller: 'accountsLoginController', controller: 'accountsLoginController',
params: { params: {
returnState: null returnState: null,
email: null
}, },
data: { data: {
bodyClass: 'login-page' bodyClass: 'login-page'
@@ -201,7 +202,8 @@ angular
templateUrl: 'app/accounts/views/accountsRegister.html', templateUrl: 'app/accounts/views/accountsRegister.html',
controller: 'accountsRegisterController', controller: 'accountsRegisterController',
params: { params: {
returnState: null returnState: null,
email: null
}, },
data: { data: {
pageTitle: 'Register', pageTitle: 'Register',
@@ -209,7 +211,7 @@ angular
} }
}) })
.state('frontend.organizationAccept', { .state('frontend.organizationAccept', {
url: '^/accept-organization?organizationId&organizationUserId&token', url: '^/accept-organization?organizationId&organizationUserId&token&email',
templateUrl: 'app/accounts/views/accountsOrganizationAccept.html', templateUrl: 'app/accounts/views/accountsOrganizationAccept.html',
controller: 'accountsOrganizationAcceptController', controller: 'accountsOrganizationAcceptController',
data: { data: {

View File

@@ -19,35 +19,45 @@
Loading... Loading...
</div> </div>
<div class="table-responsive" ng-show="users.length"> <div class="table-responsive" ng-show="users.length">
<table class="table table-striped table-hover"> <table class="table table-striped table-hover table-vmiddle">
<tbody> <tbody>
<tr ng-repeat="user in users | orderBy: ['name', 'email']"> <tr ng-repeat="user in users | orderBy: ['name', 'email']">
<td style="width: 70px;" valign="middle"> <td style="width: 70px;">
<div class="btn-group"> <div class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-cog"></i> <span class="caret"></span> <i class="fa fa-cog"></i> <span class="caret"></span>
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li> <li ng-show="user.status === 1">
<a href="javascript:void(0)" ng-click="confirm(user)">Confirm</a> <a href="javascript:void(0)" ng-click="confirm(user)">
<i class="fa fa-fw fa-check"></i> Confirm
</a>
</li>
<li ng-show="user.status === 0">
<a href="javascript:void(0)" ng-click="reinvite(user)">
<i class="fa fa-fw fa-envelope-o"></i> Re-send Invitation
</a>
</li>
<li>
<a href="javascript:void(0)" ng-click="delete(user)" class="text-red">
<i class="fa fa-fw fa-remove"></i> Remove
</a>
</li> </li>
<li><a href="javascript:void(0)" ng-click="reinvite(user)">Re-send Invitation</a></li>
<li><a href="javascript:void(0)" ng-click="delete(user)" class="text-danger">Remove</a></li>
</ul> </ul>
</div> </div>
</td> </td>
<td style="width: 45px;" valign="middle"> <td style="width: 45px;">
<img src="//www.gravatar.com/avatar/{{user.email | gravatar}}.jpg?s=45&d=mm" <img src="//www.gravatar.com/avatar/{{user.email | gravatar}}.jpg?s=45&d=mm"
class="img-circle" alt="User Image"> class="img-circle" alt="User Image">
</td> </td>
<td valign="middle"> <td>
<a href="javascript:void(0)" ng-click="edit(user.id)">{{user.email}}</a> <a href="javascript:void(0)" ng-click="edit(user.id)">{{user.email}}</a>
<div ng-if="user.name"><small class="text-muted">{{user.name}}</small></div> <div ng-if="user.name"><small class="text-muted">{{user.name}}</small></div>
</td> </td>
<td style="width: 100px;" valign="middle"> <td style="width: 100px;">
{{user.typeName}} {{user.typeName}}
</td> </td>
<td style="width: 100px;" valign="middle"> <td style="width: 100px;">
{{user.statusName}} {{user.statusName}}
</td> </td>
</tr> </tr>

View File

@@ -113,6 +113,15 @@ form .btn .loading-icon {
margin-right: 8px; margin-right: 8px;
} }
.dropdown-menu {
border-color: #ccc;
> li > a > .fa {
margin-right: 0;
margin-left: -5px;
}
}
/* Modals */ /* Modals */
.modal-footer { .modal-footer {
@@ -131,6 +140,10 @@ form .btn .loading-icon {
} }
} }
.table-vmiddle td {
vertical-align: middle !important;
}
/* Callouts */ /* Callouts */
.callout.callout-default { .callout.callout-default {
@@ -244,6 +257,12 @@ form .btn .loading-icon {
} }
} }
/* Typography */
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
}
/* Misc */ /* Misc */
.strike { .strike {