2015-07-20 00:09:47 -07:00
<!-- Modal add user -->
2016-02-11 12:50:02 +01:00
< div class = "modal fade" id = "userAddModal" tabindex = "-1" role = "dialog" >
2015-07-20 00:09:47 -07:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2016-02-11 12:50:02 +01:00
< h4 class = "modal-title" > Add User< / h4 >
2015-07-20 00:09:47 -07:00
< / div >
< div class = "modal-body" >
2016-02-11 12:50:02 +01:00
< form name = "useradd_form" role = "form" ng-submit = "doAdd()" autocomplete = "off" >
< input type = "password" style = "display: none;" >
< div class = "form-group" ng-class = "{ 'has-error': (useradd_form.email.$dirty && useradd_form.email.$invalid) || (!useradd_form.email.$dirty && useradd.error.email) }" >
< label class = "control-label" > Email< / label >
< div class = "control-label" ng-show = "(!useradd_form.email.$dirty && useradd.error.email) || (useradd_form.email.$dirty && useradd_form.email.$invalid) || (!useradd_form.email.$dirty && useradd.error.email)" >
< small ng-show = "useradd_form.email.$error.required" > An email is required< / small >
< small ng-show = "useradd_form.email.$error.email" > This is not a valid email< / small >
< small ng-show = "!useradd_form.email.$dirty && useradd.error.email" > {{ useradd.error.email }}< / small >
2015-07-20 00:09:47 -07:00
< / div >
2016-04-01 16:49:06 +02:00
< input type = "email" class = "form-control" ng-model = "useradd.email" name = "email" id = "inputUserAddEmail" required autofocus >
< / div >
2016-01-19 23:58:52 -08:00
2016-06-02 13:32:45 +02:00
< div class = "form-group" ng-class = "{ 'has-error': (useradd_form.username.$dirty && useradd_form.username.$invalid) || (!useradd_form.username.$dirty && useradd.error.username) }" >
< label class = "control-label" > Username (optional)< / label >
< div class = "control-label" ng-show = "(!useradd_form.username.$dirty && useradd.error.username) || (useradd_form.username.$dirty && useradd_form.username.$invalid) || (!useradd_form.username.$dirty && useradd.error.username)" >
< small ng-show = "useradd_form.username.$error.username" > This is not a valid username< / small >
< small ng-show = "!useradd_form.username.$dirty && useradd.error.username" > {{ useradd.error.username }}< / small >
< / div >
2016-06-21 11:59:26 -05:00
< input type = "text" class = "form-control" ng-model = "useradd.username" name = "username" id = "inputUserAddUsername" placeholder = "If empty, user can choose on sign up" >
2016-06-02 13:32:45 +02:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (useradd_form.displayName.$dirty && useradd_form.displayName.$invalid) || (!useradd_form.displayName.$dirty && useradd.error.displayName) }" >
< label class = "control-label" > Display Name (optional)< / label >
< div class = "control-label" ng-show = "(!useradd_form.displayName.$dirty && useradd.error.displayName) || (useradd_form.displayName.$dirty && useradd_form.displayName.$invalid) || (!useradd_form.displayName.$dirty && useradd.error.displayName)" >
< small ng-show = "useradd_form.displayName.$error.displayName" > This is not a valid displayName< / small >
< small ng-show = "!useradd_form.displayName.$dirty && useradd.error.displayName" > {{ useradd.error.displayName }}< / small >
< / div >
2016-06-21 11:59:26 -05:00
< input type = "text" class = "form-control" ng-model = "useradd.displayName" name = "displayName" id = "inputUserAddDisplayName" placeholder = "If empty, user can choose on sign up" >
2016-06-02 13:32:45 +02:00
< / div >
2016-02-11 12:50:02 +01:00
< div class = "checkbox" >
< label >
< input type = "checkbox" ng-model = "useradd.sendInvite" id = "inputUserAddSendInvite" > Send invite
< / label >
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "useradd_form.$invalid || useradd.busy" / >
2015-07-20 00:09:47 -07:00
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
< button type = "button" class = "btn btn-success" ng-click = "doAdd()" ng-disabled = "useradd_form.$invalid || useradd.busy" > < i class = "fa fa-spinner fa-pulse" ng-show = "useradd.busy" > < / i > Add User< / button >
< / div >
< / div >
< / div >
< / div >
<!-- Modal remove user -->
2016-02-11 12:50:02 +01:00
< div class = "modal fade" id = "userRemoveModal" tabindex = "-1" role = "dialog" >
2015-07-20 00:09:47 -07:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2016-02-11 12:50:02 +01:00
< h4 class = "modal-title" > Delete user {{ userremove.userInfo.username }}< / h4 >
2015-07-20 00:09:47 -07:00
< / div >
< div class = "modal-body" >
2016-02-11 12:50:02 +01:00
< form name = "userremove_form" role = "form" ng-submit = "doUserRemove()" autocomplete = "off" >
< input type = "password" style = "display: none;" >
< div class = "form-group" ng-class = "{ 'has-error': (userremove_form.username.$dirty && userremove_form.username.$invalid) || (!userremove_form.username.$dirty && userremove.error.username) }" >
2016-04-03 01:42:06 +02:00
< label class = "control-label" > Just to be sure you really want to delete this user, please type the username or email< / label >
2016-02-11 12:50:02 +01:00
< div class = "control-label" ng-show = "(!userremove_form.username.$dirty && userremove.error.username) || (userremove_form.username.$dirty && userremove_form.username.$invalid)" >
2016-04-03 01:42:06 +02:00
< small ng-show = "userremove_form.username.$dirty && userremove_form.username.$error.required" > A username is required< / small >
< small ng-show = "!userremove_form.username.$dirty && userremove.error.username" > Username or Email does not match< / small >
2015-07-20 00:09:47 -07:00
< / div >
2016-04-03 01:42:06 +02:00
< input type = "text" class = "form-control" ng-model = "userremove.username" id = "inputUserRemoveUsername" name = "username" placeholder = "Username or Email" required autofocus >
2016-02-11 12:50:02 +01:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (userremove_form.password.$dirty && userremove_form.password.$invalid) || (!userremove_form.password.$dirty && userremove.error.password)}" >
< label class = "control-label" > Give your password to verify that you are performing that action< / label >
< div class = "control-label" ng-show = "(!userremove_form.password.$dirty && userremove.error.password) || (userremove_form.password.$dirty && userremove_form.password.$invalid)" >
< small ng-show = "userremove_form.password.$error.required && !userremove.error.password" > A password is required< / small >
< small ng-show = "!useradd_form.email.$dirty && userremove.error.password" > {{ userremove.error.password }}< / small >
2015-07-20 00:09:47 -07:00
< / div >
2016-02-11 12:50:02 +01:00
< input type = "password" class = "form-control" ng-model = "userremove.password" id = "inputUserRemovePassword" name = "password" placeholder = "Password" required >
< / div >
< input class = "hide" type = "submit" ng-disabled = "userremove_form.$invalid || userremove.busy" / >
2016-01-16 17:38:18 +01:00
< / form >
2015-07-20 00:09:47 -07:00
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
< button type = "button" class = "btn btn-danger" ng-click = "doUserRemove()" ng-disabled = "userremove_form.$invalid || userremove.busy" > < i class = "fa fa-spinner fa-pulse" ng-show = "userremove.busy" > < / i > Delete< / button >
< / div >
< / div >
< / div >
< / div >
2016-01-25 13:28:30 +01:00
<!-- Modal edit user -->
2016-02-11 12:50:02 +01:00
< div class = "modal fade" id = "userEditModal" tabindex = "-1" role = "dialog" >
2016-01-25 13:28:30 +01:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2016-02-11 12:50:02 +01:00
< h4 class = "modal-title" > Edit user {{ useredit.userInfo.username }}< / h4 >
2016-01-25 13:28:30 +01:00
< / div >
< div class = "modal-body" >
2016-02-10 14:40:29 +01:00
< form name = "useredit_form" role = "form" ng-submit = "doUserEdit()" autocomplete = "off" >
2016-02-11 12:50:02 +01:00
< input type = "password" style = "display: none;" >
2016-09-28 12:12:37 +02:00
< div class = "form-group" ng-show = "useredit.userInfo.alternateEmail" >
2016-02-11 12:50:02 +01:00
< label class = "control-label" > Email< / label >
2016-09-28 12:12:37 +02:00
< input type = "email" class = "form-control" ng-model = "useredit.userInfo.email" disabled >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': (useredit_form.email.$dirty && useredit_form.email.$invalid) || (!useredit_form.email.$dirty && useredit.error.email) }" >
< label class = "control-label" ng-show = "useredit.userInfo.alternateEmail" uib-tooltip = "Email used for password recovery" > Alternate Email< / label >
< label class = "control-label" ng-hide = "useredit.userInfo.alternateEmail" > Email< / label >
2016-02-11 12:50:02 +01:00
< div class = "control-label" ng-show = "(!useredit_form.email.$dirty && useredit.error.email) || (useredit_form.email.$dirty && useredit_form.email.$invalid) || (!useredit_form.email.$dirty && useredit.error.email)" >
< small ng-show = "useredit_form.email.$error.required" > An email is required< / small >
< small ng-show = "useredit_form.email.$error.email" > This is not a valid email< / small >
< small ng-show = "!useredit_form.email.$dirty && useredit.error.email" > {{ useredit.error.email }}< / small >
2016-01-25 14:28:47 +01:00
< / div >
2016-02-11 12:50:02 +01:00
< input type = "email" class = "form-control" ng-model = "useredit.email" name = "email" required >
< / div >
< div class = "form-group" >
< label class = "control-label" > Groups< / label >
< div >
2016-02-25 23:20:55 +01:00
< span ng-repeat = "group in groups | ignoreAdminGroup" ng-show = "group.id !== 'admin'" >
2016-02-11 12:50:02 +01:00
< button class = "btn btn-default" type = "button" ng-click = "userEditToggleGroup(group);" ng-class = "{ 'btn-primary': (useredit.groupIds.indexOf(group.id) !== -1) }" > {{ group.name }}< / button >
< / span >
2016-02-10 14:26:04 +01:00
< / div >
2016-06-02 10:55:34 -07:00
< div ng-show = "groups.length <= 1" > No groups available.< / div >
2016-02-11 12:50:02 +01:00
< / div >
2016-06-01 06:23:08 -07:00
< div class = "form-group" ng-show = "useredit.userInfo.username && (config.isDev || config.isCustomDomain)" >
2016-05-29 23:02:01 -07:00
< label class = "control-label" > Email aliases< / label >
2016-06-10 12:04:40 -07:00
< div class = "input-group form-inline" >
< tag-input class = "form-group form-control" placeholder = 'Separate aliases by comma' taglist = 'useredit.aliases' > < / tag-input >
< div class = "input-group-addon" >
@{{ config.fqdn }}
< / div >
< / div >
2016-05-29 23:02:01 -07:00
< / div >
< br / >
2016-02-26 18:08:46 +01:00
< div class = "form-group" ng-hide = "isMe(useredit.userInfo)" >
2016-02-26 11:02:43 +01:00
< div class = "checkbox" >
< label >
< input type = "checkbox" ng-model = "useredit.superuser" > Allow this user to manage apps, groups and other users
< / label >
< / div >
< / div >
2016-02-11 12:50:02 +01:00
< input class = "hide" type = "submit" ng-disabled = "useredit_form.$invalid || useredit.busy" / >
2016-01-25 13:28:30 +01:00
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
2016-02-25 15:24:42 -08:00
< button type = "button" class = "btn btn-success" ng-click = "doUserEdit()" ng-disabled = "useredit_form.$invalid || useredit.busy" > < i class = "fa fa-spinner fa-pulse" ng-show = "useredit.busy" > < / i > Save< / button >
2016-01-25 13:28:30 +01:00
< / div >
< / div >
< / div >
< / div >
2016-02-10 16:24:25 +01:00
<!-- Modal add group -->
< div class = "modal fade" id = "groupAddModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > Add Group< / h4 >
< / div >
< div class = "modal-body" >
2016-02-10 16:43:23 +01:00
< form name = "groupAddForm" role = "form" novalidate ng-submit = "groupAdd.submit()" autocomplete = "off" >
< div class = "form-group" ng-class = "{ 'has-error': (groupAddForm.name.$dirty && groupAddForm.name.$invalid) || (!groupAddForm.name.$dirty && groupAdd.error.name) }" >
2016-02-10 16:37:58 +01:00
< label class = "control-label" for = "groupAddName" > Name< / label >
2016-02-10 16:43:23 +01:00
< div class = "control-label" ng-show = "(!groupAddForm.name.$dirty && groupAdd.error.name) || (groupAddForm.name.$dirty && groupAddForm.name.$invalid) || (!groupAddForm.name.$dirty && groupAdd.error.name)" >
2016-02-10 16:24:25 +01:00
< small ng-show = "groupAddForm.name.$error.required" > A name is required< / small >
< small ng-show = "groupAddForm.name.$error.minlength" > The name is too short< / small >
< small ng-show = "groupAddForm.name.$error.maxlength" > The name is too long< / small >
2016-02-10 16:43:23 +01:00
< small ng-show = "!groupAddForm.name.$dirty && groupAdd.error.name" > {{ groupAdd.error.name }}< / small >
2016-02-10 16:24:25 +01:00
< / div >
2016-02-10 16:43:23 +01:00
< input type = "text" class = "form-control" ng-model = "groupAdd.name" id = "groupAddName" name = "name" ng-maxlength = "200" ng-minlength = "2" required autofocus >
2016-02-10 16:24:25 +01:00
< / div >
2016-02-10 16:59:24 +01:00
< input class = "hide" type = "submit" ng-disabled = "groupAddForm.$invalid || groupAdd.busy" / >
2016-02-10 16:24:25 +01:00
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2016-02-10 16:43:23 +01:00
< button type = "button" class = "btn btn-success" ng-click = "groupAdd.submit()" ng-disabled = "groupAddForm.$invalid || groupAdd.busy" > < i class = "fa fa-spinner fa-pulse" ng-show = "groupAdd.busy" > < / i > Add Group< / button >
2016-02-10 16:24:25 +01:00
< / div >
< / div >
< / div >
< / div >
2016-02-10 16:59:24 +01:00
<!-- Modal remove group -->
< div class = "modal fade" id = "groupRemoveModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2016-02-10 17:23:42 +01:00
< h4 class = "modal-title" > Delete group {{ groupRemove.group.name }}< / h4 >
2016-02-10 16:59:24 +01:00
< / div >
< div class = "modal-body" >
2016-02-13 12:42:38 +01:00
< div ng-show = "groupRemove.memberCount" class = "text-danger" >
2016-02-26 08:43:59 -08:00
< b > This group still has {{ groupRemove.memberCount }} member(s). Are you sure this group is not used?< / b >
2016-02-13 12:42:38 +01:00
< br / >
< br / >
< / div >
2016-02-10 16:59:24 +01:00
< form name = "groupRemoveForm" role = "form" novalidate ng-submit = "groupRemove.submit()" autocomplete = "off" >
< input type = "password" style = "display: none;" >
< div class = "form-group" ng-class = "{ 'has-error': (groupRemoveForm.password.$dirty && groupRemoveForm.password.$invalid) || (!groupRemoveForm.password.$dirty && groupRemove.error.password)}" >
< label class = "control-label" for = "groupRemovePasswordInput" > Give your password to verify that you are performing that action< / label >
< div class = "control-label" ng-show = "(!groupRemoveForm.password.$dirty && groupRemove.error.password) || (groupRemoveForm.password.$dirty && groupRemoveForm.password.$invalid)" >
< small ng-show = "groupRemoveForm.password.$error.required && !groupRemove.error.password" > A password is required< / small >
< small ng-show = "!groupRemoveForm.password.$dirty && groupRemove.error.password" > {{ groupRemove.error.password }}< / small >
< / div >
2016-02-10 17:12:58 +01:00
< input type = "password" class = "form-control" ng-model = "groupRemove.password" id = "groupRemovePasswordInput" name = "password" placeholder = "Password" required autofocus >
2016-02-10 16:59:24 +01:00
< / div >
< input class = "hide" type = "submit" ng-disabled = "groupRemoveForm.$invalid || groupRemove.busy" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
< button type = "button" class = "btn btn-danger" ng-click = "groupRemove.submit()" ng-disabled = "groupRemoveForm.$invalid || groupRemove.busy" > < i class = "fa fa-spinner fa-pulse" ng-show = "groupRemove.busy" > < / i > Delete< / button >
< / div >
< / div >
< / div >
< / div >
2016-04-04 18:21:45 +02:00
<!-- Modal invite sent -->
< div class = "modal fade" id = "inviteSentModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > Invite Sent< / h4 >
< / div >
< div class = "modal-body" >
2016-04-04 18:35:38 +02:00
< p > An email has been sent to < b > {{ inviteSent.email }}< / b > .< / p >
2016-04-04 18:21:45 +02:00
< p > You can also share this invite link directly.< / p >
2016-04-04 18:35:38 +02:00
< p ng-click-select > {{ inviteSent.setupLink }}< / p >
2016-04-04 18:21:45 +02:00
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Ok< / button >
< / div >
< / div >
< / div >
< / div >
2016-02-26 10:53:41 +01:00
< div class = "content-large" >
2015-08-12 13:48:55 +02:00
< br / >
2015-07-20 00:09:47 -07:00
< div >
< div class = "text-left" >
2016-01-26 19:40:57 +01:00
< h1 > Users < button class = "btn btn-primary btn-outline pull-right" ng-click = "showUserAdd()" > < i class = "fa fa-user-plus" > < / i > New User< / button > < / h1 >
2015-07-20 00:09:47 -07:00
< / div >
< / div >
< div class = "card card-large" >
< div class = "grid-item-top" >
< div class = "row ng-hide" ng-show = "!ready" >
< div class = "col-lg-12 text-center" >
< h2 > < i class = "fa fa-spinner fa-pulse" > < / i > < / h2 >
< / div >
< / div >
< div class = "row animateMeOpacity ng-hide" ng-show = "ready" >
< div class = "col-lg-12" >
< table class = "table table-hover" >
< thead >
< tr >
2016-02-25 15:53:36 +01:00
< th style = "width: 1px;" > < / th >
2015-07-20 00:09:47 -07:00
< th style = "" > User< / th >
2016-02-26 13:10:29 +01:00
< th style = "" class = "text-left hidden-xs hidden-sm" > Groups< / th >
2016-02-26 10:53:41 +01:00
< th style = "width: 100px" class = "text-right" > Actions< / th >
2015-07-20 00:09:47 -07:00
< / tr >
< / thead >
< tbody >
< tr ng-repeat = "user in users" >
2016-02-25 15:53:36 +01:00
< td >
2016-07-14 12:48:21 +02:00
< i class = "fa fa-briefcase arrow" ng-show = "user.admin" uib-tooltip = "This user can manage apps, groups and other users" > < / i >
2016-02-25 15:53:36 +01:00
< / td >
2016-02-26 10:53:41 +01:00
< td class = "hand elide-table-cell" ng-click = "showUserEdit(user)" >
2015-07-20 00:09:47 -07:00
{{ user.username }}
< span class = "text-muted" > {{ user.email }}< / span >
< / td >
2016-02-26 13:10:29 +01:00
< td class = "text-left hand elide-table-cell hidden-xs hidden-sm" ng-click = "showUserEdit(user)" >
2016-02-26 10:53:41 +01:00
< span class = "group-badge" ng-repeat = "groupId in user.groupIds | ignoreAdminGroup" > {{ groupId }}< / span >
2015-07-20 00:09:47 -07:00
< / td >
2016-02-26 10:53:41 +01:00
< td class = "text-right no-wrap" style = "vertical-align: bottom" >
2016-02-10 17:35:40 +01:00
< button ng-show = "!isMe(user)" class = "btn btn-xs btn-default" ng-click = "sendInvite(user)" title = "Send Invite" > < i class = "fa fa-paper-plane-o" > < / i > < / button >
< button class = "btn btn-xs btn-default" ng-click = "showUserEdit(user)" title = "Edit User Profile" > < i class = "fa fa-pencil" > < / i > < / button >
< button ng-show = "!isMe(user)" class = "btn btn-xs btn-danger" ng-click = "showUserRemove(user)" title = "Remove User" > < i class = "fa fa-trash-o" > < / i > < / button >
2015-07-20 00:09:47 -07:00
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
< / div >
2016-02-10 15:15:09 +01:00
< br / >
< div >
< div class = "text-left" >
2016-02-10 16:43:23 +01:00
< h1 > Groups < button class = "btn btn-primary btn-outline pull-right" ng-click = "groupAdd.show()" > < i class = "fa fa-plus" > < / i > New Group< / button > < / h1 >
2016-02-10 15:15:09 +01:00
< / div >
< / div >
< div class = "card card-large" >
< div class = "grid-item-top" >
< div class = "row ng-hide" ng-show = "!ready" >
< div class = "col-lg-12 text-center" >
< h2 > < i class = "fa fa-spinner fa-pulse" > < / i > < / h2 >
< / div >
< / div >
< div class = "row animateMeOpacity ng-hide" ng-show = "ready" >
< div class = "col-lg-12" >
< table class = "table table-hover" >
< thead >
< tr >
< th style = "" > Name< / th >
< th style = "width: 300px" class = "text-right" > Actions< / th >
< / tr >
< / thead >
< tbody >
2016-02-25 15:54:30 +01:00
< tr ng-repeat = "group in groups | ignoreAdminGroup" >
2016-02-10 15:15:09 +01:00
< td class = "text-overflow: ellipsis; white-space: nowrap;" >
2016-02-25 15:54:30 +01:00
{{ group.name }}
2016-02-10 15:15:09 +01:00
< / td >
< td class = "text-right" style = "vertical-align: bottom" >
2016-02-25 15:54:30 +01:00
< button class = "btn btn-xs btn-danger" ng-click = "groupRemove.show(group)" title = "Remove Group" > < i class = "fa fa-trash-o" > < / i > < / button >
2016-02-10 15:15:09 +01:00
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
< / div >
2016-01-19 23:58:52 -08:00
< / div >
2016-06-07 15:58:53 +02:00
<!-- Offset the footer -->
< br / > < br / >