2018-01-22 13:01:38 -08:00
<!-- Modal add user -->
< div class = "modal fade" id = "userAddModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > Add User< / h4 >
< / div >
< div class = "modal-body" >
< form name = "useradd_form" role = "form" ng-submit = "useradd.submit()" autocomplete = "off" >
2018-06-11 14:16:52 -07:00
< 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" > Full Name< / 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 name< / small >
< small ng-show = "!useradd_form.displayName.$dirty && useradd.error.displayName" > {{ useradd.error.displayName }}< / small >
< / div >
< input type = "text" class = "form-control" ng-model = "useradd.displayName" name = "displayName" id = "inputUserAddDisplayName" ng-required autofocus autocomplete = "off" >
< / div >
2018-01-22 13:01:38 -08:00
< 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 >
< / div >
2018-06-11 14:16:52 -07:00
< input type = "email" class = "form-control" ng-model = "useradd.email" name = "email" id = "inputUserAddEmail" required >
2018-01-22 13:01:38 -08:00
< / div >
< 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< / 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 >
2018-06-11 14:16:52 -07:00
< input type = "text" class = "form-control" ng-model = "useradd.username" name = "username" id = "inputUserAddUsername" placeholder = "Optional. If not provided, user can pick during sign up" >
2018-01-22 13:01:38 -08:00
< / div >
2018-07-24 22:38:53 -07:00
< div class = "form-group" >
< label class = "control-label" > Groups< / label >
< div class = "control-label" >
2018-07-26 23:42:38 -07:00
< div ng-show = "groups.length === 0" > No groups available.< / div >
< multiselect ng-show = "groups.length !== 0" ng-model = "useradd.selectedGroups" options = "group.name for group in groups" data-compare-by = "name" data-multiple = "true" > < / multiselect >
2018-07-24 22:38:53 -07:00
< / div >
< / div >
< div class = "form-group" >
< div class = "checkbox" >
< label >
2019-09-04 11:05:38 -07:00
< input type = "checkbox" ng-model = "useradd.admin" > User is an administrator < sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/user-management/#administrators" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
2018-07-24 22:38:53 -07:00
< / label >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< div class = "checkbox" >
< label >
< input type = "checkbox" ng-model = "useradd.sendInvite" id = "inputUserAddSendInvite" > Send an invitation email now
< / label >
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "useradd_form.$invalid || useradd.busy" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2018-11-16 17:03:21 +01:00
< button type = "button" class = "btn btn-success" ng-click = "useradd.submit()" ng-disabled = "useradd_form.$invalid || useradd.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "useradd.busy" > < / i > Add User< / button >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< / div >
< / div >
<!-- Modal remove user -->
< div class = "modal fade" id = "userRemoveModal" tabindex = "-1" role = "dialog" >
2019-05-13 23:55:54 +02:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > Delete user {{ userremove.userInfo.username || userremove.userInfo.email }}< / h4 >
< / div >
< div class = "modal-body" >
2019-05-20 18:58:46 -07:00
After deletion, the user will not be able to access the dashboard or login to any of the apps. Note that any user data inside
the apps is not removed.
< br >
2019-05-13 23:55:54 +02: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 = "userremove.submit()" ng-disabled = "userremove.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "userremove.busy" > < / i > Delete< / button >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-05-13 23:55:54 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
<!-- Modal edit user -->
< div class = "modal fade" id = "userEditModal" tabindex = "-1" role = "dialog" >
2019-08-30 13:32:20 +02:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > Edit user {{ useredit.userInfo.username || useredit.userInfo.email }}< / h4 >
< / div >
< div class = "modal-body" >
< div ng-show = "useredit.source" >
< p class = "text-warning" > This user is synced from the external LDAP directory.< / p >
2019-10-25 15:25:46 -07:00
< p > < label > Display Name< / label > < br / > < input type = "text" class = "form-control" ng-disabled = "true" ng-model = "useredit.displayName" >
< p > < label > Email< / label > < br / > < input type = "text" class = "form-control" ng-disabled = "true" ng-model = "useredit.email" > < / p >
2019-08-30 13:32:20 +02:00
< / div >
< form name = "useredit_form" role = "form" ng-submit = "useredit.submit()" autocomplete = "off" >
< div class = "form-group" ng-hide = "useredit.source" ng-class = "{ 'has-error': (useredit_form.displayName.$dirty && useredit_form.displayName.$invalid) || (!useredit_form.displayName.$dirty && useredit.error.displayName) }" >
< label class = "control-label" > Display Name< / label >
< div class = "control-label" ng-show = "(!useredit_form.displayName.$dirty && useredit.error.displayName) || (useredit_form.displayName.$dirty && useredit_form.displayName.$invalid) || (!useredit_form.displayName.$dirty && useredit.error.displayName)" >
< small ng-show = "useredit_form.displayName.$error.required" > Name is required< / small >
< small ng-show = "!useredit_form.displayName.$dirty && useredit.error.displayName" > {{ useredit.error.displayName }}< / small >
2018-01-22 13:01:38 -08:00
< / div >
2019-08-30 13:32:20 +02:00
< input type = "text" class = "form-control" ng-model = "useredit.displayName" name = "displayName" required autofocus autocomplete = "off" >
< / div >
< div class = "form-group" ng-hide = "useredit.source" ng-class = "{ 'has-error': (useredit_form.email.$dirty && useredit_form.email.$invalid) || (!useredit_form.email.$dirty && useredit.error.email) }" >
< label class = "control-label" > Primary email< / label >
< 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 >
2018-01-22 13:01:38 -08:00
< / div >
2019-08-30 13:32:20 +02:00
< input type = "email" class = "form-control" ng-model = "useredit.email" name = "email" required >
< / div >
< div class = "form-group" ng-hide = "useredit.source" ng-class = "{ 'has-error': (useredit_form.fallbackEmail.$dirty && useredit_form.fallbackEmail.$invalid) || (!useredit_form.fallbackEmail.$dirty && useredit.error.fallbackEmail) }" >
< label class = "control-label" > Password recovery email< / label >
< div class = "control-label" ng-show = "(!useredit_form.fallbackEmail.$dirty && useredit.error.fallbackEmail) || (useredit_form.fallbackEmail.$dirty && useredit_form.fallbackEmail.$invalid) || (!useredit_form.fallbackEmail.$dirty && useredit.error.fallbackEmail)" >
< small ng-show = "useredit_form.fallbackEmail.$error.required" > An email is required< / small >
< small ng-show = "useredit_form.fallbackEmail.$error.fallbackEmail" > This is not a valid email< / small >
< small ng-show = "!useredit_form.fallbackEmail.$dirty && useredit.error.fallbackEmail" > {{ useredit.error.fallbackEmail }}< / small >
2018-01-22 13:01:38 -08:00
< / div >
2019-08-30 13:32:20 +02:00
< input type = "fallbackEmail" class = "form-control" ng-model = "useredit.fallbackEmail" name = "fallbackEmail" required >
< / div >
< div class = "form-group" >
< label class = "control-label" > Groups< / label >
< div class = "control-label" >
< div ng-show = "groups.length === 0" > No groups available.< / div >
< multiselect ng-show = "groups.length !== 0" ng-model = "useredit.selectedGroups" options = "group.name for group in groups" data-compare-by = "name" data-multiple = "true" > < / multiselect >
< / div >
< / div >
< div class = "form-group" ng-hide = "isMe(useredit.userInfo)" >
< div class = "checkbox" >
< label >
2019-09-04 11:05:38 -07:00
< input type = "checkbox" ng-model = "useredit.admin" > User is an administrator < sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/user-management/#administrators" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
2019-08-30 13:32:20 +02:00
< / label >
< / div >
< / div >
< div class = "form-group" ng-hide = "isMe(useredit.userInfo)" >
< div class = "checkbox" >
< label >
2019-09-04 11:05:38 -07:00
< input type = "checkbox" ng-model = "useredit.active" > User is active < sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/user-management/#disabling-a-user" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
2019-08-30 13:32:20 +02:00
< / label >
< / div >
< / div >
< input class = "hide" type = "submit" ng-disabled = "useredit_form.$invalid || useredit.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-success" ng-click = "useredit.submit()" ng-disabled = "useredit_form.$invalid || useredit.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "useredit.busy" > < / i > Save< / button >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-08-30 13:32:20 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
<!-- 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" >
< 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) }" >
< label class = "control-label" for = "groupAddName" > Name< / label >
< div class = "control-label" ng-show = "(!groupAddForm.name.$dirty && groupAdd.error.name) || (groupAddForm.name.$dirty && groupAddForm.name.$invalid) || (!groupAddForm.name.$dirty && groupAdd.error.name)" >
< 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 >
< small ng-show = "!groupAddForm.name.$dirty && groupAdd.error.name" > {{ groupAdd.error.name }}< / small >
< / div >
< input type = "text" class = "form-control" ng-model = "groupAdd.name" id = "groupAddName" name = "name" ng-maxlength = "200" ng-minlength = "1" required autofocus >
< / div >
2018-08-05 22:19:54 -07:00
< div class = "form-group" >
< label class = "control-label" > Users< / label >
< div class = "control-label" >
< multiselect ng-model = "groupAdd.selectedUsers" options = "(user.username || user.email) for user in users" data-compare-by = "email" data-multiple = "true" > < / multiselect >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< input class = "hide" type = "submit" ng-disabled = "groupAddForm.$invalid || groupAdd.busy" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Cancel< / button >
2018-11-16 17:03:21 +01:00
< button type = "button" class = "btn btn-success" ng-click = "groupAdd.submit()" ng-disabled = "groupAddForm.$invalid || groupAdd.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "groupAdd.busy" > < / i > Add Group< / button >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< / div >
< / div >
2018-06-18 17:45:09 -07:00
<!-- Modal edit group -->
< div class = "modal fade" id = "groupEditModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > Edit group {{ groupEdit.groupInfo.name }}< / h4 >
< / div >
< div class = "modal-body" >
< form name = "groupEdit_form" role = "form" ng-submit = "groupEdit.submit()" autocomplete = "off" >
2018-07-24 22:20:00 -07:00
< div class = "form-group" ng-class = "{ 'has-error': groupEditForm.groupName.$invalid }" >
2018-06-18 17:45:09 -07:00
< label class = "control-label" > Group name< / label >
< input type = "text" class = "form-control" ng-model = "groupEdit.name" name = "groupName" ng-disabled = "groupEdit.busy" autofocus >
< / div >
2018-07-24 22:20:00 -07:00
< div class = "form-group" >
< label class = "control-label" > Users< / label >
< div class = "control-label" >
2018-07-26 23:42:38 -07:00
< multiselect ng-model = "groupEdit.selectedUsers" options = "(user.username || user.email) for user in users" data-compare-by = "email" data-multiple = "true" > < / multiselect >
2018-07-24 22:20:00 -07:00
< / div >
< / div >
2018-06-18 17:45:09 -07:00
< input class = "hide" type = "submit" ng-disabled = "groupEdit_form.$invalid || useredit.busy" / >
< / form >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
2018-11-16 17:03:21 +01:00
< button type = "button" class = "btn btn-success" ng-click = "groupEdit.submit()" ng-disabled = "groupEdit_form.$invalid || groupEdit.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "groupEdit.busy" > < / i > Save< / button >
2018-06-18 17:45:09 -07:00
< / div >
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
<!-- Modal remove group -->
< div class = "modal fade" id = "groupRemoveModal" tabindex = "-1" role = "dialog" >
2019-05-13 23:55:54 +02:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< h4 class = "modal-title" > Delete group {{ groupRemove.group.name }}< / h4 >
< / div >
< div class = "modal-body" >
< div ng-show = "groupRemove.memberCount" class = "text-danger" >
< b > This group still has {{ groupRemove.memberCount }} member(s). Are you sure this group is not used?< / b >
< br / >
< br / >
2018-01-22 13:01:38 -08:00
< / div >
2019-05-13 23:55:54 +02: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 = "groupRemove.submit()" ng-disabled = "groupRemove.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "groupRemove.busy" > < / i > Delete< / button >
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-05-13 23:55:54 +02:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2018-08-17 16:01:40 -07:00
<!-- Modal invite -->
< div class = "modal fade" id = "invitationModal" tabindex = "-1" role = "dialog" >
2018-01-22 13:01:38 -08:00
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2018-08-27 15:08:09 -07:00
< h4 class = "modal-title" > Setup link for User {{invitation.user.username || invitation.user.email}}< / h4 >
2018-01-22 13:01:38 -08:00
< / div >
< div class = "modal-body" >
2018-08-27 11:43:17 -07:00
< p > Use the link below to setup {{ invitation.user.username || invitation.user.email }}'s account or reset their password:< / p >
2018-01-22 13:01:38 -08:00
< div class = "input-group" >
2018-08-17 16:01:40 -07:00
< input type = "text" id = "setupLinkInput" class = "form-control" ng-value = "invitation.setupLink" readonly / >
2018-01-22 13:01:38 -08:00
< span class = "input-group-btn" >
< button class = "btn btn-default" id = "setupLinkButton" type = "button" data-clipboard-target = "#setupLinkInput" > < i class = "fa fa-clipboard" > < / i > < / button >
< / span >
2018-08-27 15:40:23 -07:00
< / div >
< br / >
2018-01-22 13:01:38 -08:00
< / div >
< div class = "modal-footer" >
2018-08-17 16:01:40 -07:00
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
2018-11-16 17:03:21 +01:00
< button type = "button" class = "btn btn-success" ng-click = "invitation.email()" ng-disabled = "invitation.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "invitation.busy" > < / i > Email link to user< / button >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< / div >
< / div >
2019-08-30 12:40:23 +02:00
<!-- Modal external ldap -->
< div class = "modal fade" id = "externalLdapModal" tabindex = "-1" role = "dialog" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2019-10-25 15:19:36 -07:00
< h4 class = "modal-title" > Configure LDAP< / h4 >
2019-08-30 12:40:23 +02:00
< / div >
< div class = "modal-body" >
2019-10-25 15:38:04 -07:00
< div class = "form-group" >
< label class = "control-label" for = "ldapProvider" > LDAP provider < sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/user-management/#external-ldap" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup > < / label >
< select class = "form-control" id = "ldapProvider" ng-model = "externalLdap.provider" ng-options = "a.value as a.name for a in ldapProvider" > < / select >
2019-08-30 12:40:23 +02:00
< / div >
2019-10-25 15:38:04 -07:00
< div uib-collapse = "externalLdap.provider === 'noop'" >
2019-08-30 12:40:23 +02:00
< form name = "externalLdapConfigForm" role = "form" novalidate ng-submit = "externalLdap.submit()" autocomplete = "off" >
< fieldset >
< p class = "has-error text-center" ng-show = "externalLdap.error.generic" > {{ externalLdap.error.generic }}< / p >
<!-- avoid browsers to attempt an autofill for bindDN/bindPassword -->
< input type = "password" style = "display: none;" >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.url }" >
2019-10-25 15:19:36 -07:00
< label class = "control-label" for = "inputExternalLdapConfigUrl" > Server Url< / label >
2019-10-25 15:38:04 -07:00
< input type = "text" class = "form-control" ng-model = "externalLdap.url" id = "inputExternalLdapConfigUrl" name = "url" ng-disabled = "externalLdap.busy" placeholder = "ldaps://example.com:636" required >
2019-08-30 12:40:23 +02:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.baseDn }" >
< label class = "control-label" for = "inputExternalLdapConfigBaseDn" > Base DN< / label >
2019-10-25 15:38:04 -07:00
< input type = "text" class = "form-control" ng-model = "externalLdap.baseDn" id = "inputExternalLdapConfigBaseDn" name = "baseDn" ng-disabled = "externalLdap.busy" placeholder = "ou=users,dc=example,dc=com" required >
2019-08-30 12:40:23 +02:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.filter }" >
< label class = "control-label" for = "inputExternalLdapConfigFilter" > Filter< / label >
2019-10-25 15:38:04 -07:00
< input type = "text" class = "form-control" ng-model = "externalLdap.filter" id = "inputExternalLdapConfigFilter" name = "filter" ng-disabled = "externalLdap.busy" placeholder = "(objectClass=inetOrgPerson)" required >
2019-08-30 12:40:23 +02:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.credentials }" >
< label class = "control-label" for = "inputExternalLdapConfigBindDn" > Bind DN (optional)< / label >
2019-10-25 15:38:04 -07:00
< input type = "text" class = "form-control" ng-model = "externalLdap.bindDn" id = "inputExternalLdapConfigBindDn" name = "bindDn" ng-disabled = "externalLdap.busy" placeholder = "uid=admin,ou=Users,dc=example,dc=com" >
2019-08-30 12:40:23 +02:00
< / div >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.credentials }" >
< label class = "control-label" for = "inputExternalLdapConfigBindPassword" > Bind Password (optional)< / label >
2019-10-25 15:38:04 -07:00
< input type = "password" class = "form-control" ng-model = "externalLdap.bindPassword" id = "inputExternalLdapConfigBindPassword" name = "bindPassword" ng-disabled = "externalLdap.busy" placeholder = "" >
2019-08-30 12:40:23 +02:00
< / div >
< input class = "ng-hide" type = "submit" ng-disabled = "externalLdapConfigForm.$invalid" / >
< / fieldset >
< / form >
< / div >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
< button type = "button" class = "btn btn-primary" ng-click = "externalLdap.submit()" ng-disabled = "externalLdapConfigForm.$invalid || externalLdap.busy" > < i class = "fa fa-circle-notch fa-spin" ng-show = "externalLdap.busy" > < / i > Save< / button >
< / div >
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< div class = "content content-large" >
< div class = "text-left" >
2018-03-13 00:29:10 -07:00
< h1 > Users
< sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/user-management/#users" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
< button class = "btn btn-primary btn-outline pull-right" ng-click = "useradd.show()" >
< i class = "fa fa-user-plus" > < / i > New User
< / button >
< / h1 >
2018-01-22 13:01:38 -08:00
< / div >
2019-01-15 13:30:37 +01:00
< div class = "row" >
< div class = "col-lg-12" >
< div class = "filter" >
2019-01-16 14:02:08 +01:00
< input type = "text" class = "form-control" style = "min-width: 350px;" ng-model = "userSearchString" ng-model-options = "{ debounce: 1000 }" ng-change = "updateFilter()" placeholder = "Search" / >
2019-01-15 13:30:37 +01:00
< select class = "form-control" ng-model = "pageItems" ng-options = "a.name for a in pageItemCount" ng-change = "updateFilter(true)" > < / select >
< / div >
< div class = "pagination pull-right" >
< button class = "btn btn-default btn-outline" ng-click = "showPrevPage()" ng-disabled = "userRefreshBusy || currentPage <= 1" > < i class = "fa fa-angle-double-left" > < / i > prev< / button >
< button class = "btn btn-default btn-outline" ng-click = "showNextPage()" ng-disabled = "userRefreshBusy || users.length < pageItems.value" > next < i class = "fa fa-angle-double-right" > < / i > < / button >
< / div >
< / div >
< / div >
< div >
< div class = "card card-large" >
2018-01-22 13:01:38 -08:00
< div class = "grid-item-top" >
2019-01-16 14:02:08 +01:00
< div class = "row ng-hide" ng-show = "userRefreshBusy" >
2019-01-15 13:30:37 +01:00
< div class = "col-lg-12 text-center" >
< h2 > < i class = "fa fa-circle-notch fa-spin" > < / i > < / h2 >
2018-01-22 13:01:38 -08:00
< / div >
2019-01-15 13:30:37 +01:00
< / div >
2019-01-16 14:02:08 +01:00
< div class = "row ng-hide" ng-hide = "userRefreshBusy" >
2019-01-15 13:30:37 +01:00
< div class = "col-lg-12" >
2019-01-16 14:02:08 +01:00
< table class = "table table-hover" style = "margin: 0;" >
2019-01-15 13:30:37 +01:00
< thead >
< tr >
< th style = "width: 0.5%;" > < / th >
< th style = "width:45%" > User< / th >
< th style = "width:49.5%" class = "hidden-xs hidden-sm" > Groups< / th >
< th style = "width: 5%" class = "text-right" > Actions< / th >
< / tr >
< / thead >
< tbody >
2019-08-13 15:30:40 +02:00
< tr ng-show = "users.length === 0" >
< td colspan = "5" class = "text-center text-muted" > No users found< / td >
< / tr >
2019-08-08 07:39:43 -07:00
< tr ng-repeat = "user in users" ng-class = "{'text-muted': !user.active}" >
2019-01-15 13:30:37 +01:00
< td >
2019-08-08 08:30:29 -07:00
< i class = "fa fa-briefcase arrow" ng-show = "user.active && user.admin" uib-tooltip = "This user can manage apps, groups and other users" > < / i >
< i class = "fa fa-ban" ng-show = "!user.active" uib-tooltip = "User is inactive" > < / i >
2019-01-15 13:30:37 +01:00
< / td >
< td class = "hand elide-table-cell" ng-click = "useredit.show(user)" ng-show = "user.username" >
{{ user.displayName }} < span class = "text-muted" > {{ user.username }}< / span >
< / td >
< td class = "hand elide-table-cell" ng-click = "useredit.show(user)" ng-hide = "user.username" >
< span class = "text-muted" uib-tooltip = "User is not activated yet" > {{ user.fallbackEmail }}< / span >
< / td >
< td class = "text-left hand elide-table-cell hidden-xs hidden-sm" ng-click = "useredit.show(user)" >
< span class = "group-badge" ng-repeat = "groupId in user.groupIds" >
{{ groupsById[groupId].name }}
< / span >
< / td >
2018-01-22 13:01:38 -08:00
2019-01-15 13:30:37 +01:00
< td class = "text-right no-wrap" style = "vertical-align: bottom" >
2019-08-30 13:32:20 +02:00
< button ng-show = "!isMe(user)" class = "btn btn-xs btn-default" ng-hide = "user.source" ng-click = "invitation.show(user)" uib-tooltip = "Reset password link" > < i class = "fa fa-paper-plane" > < / i > < / button >
2019-01-15 13:30:37 +01:00
< button class = "btn btn-xs btn-default" ng-click = "useredit.show(user)" uib-tooltip = "Edit User" > < i class = "fa fa-pencil-alt" > < / i > < / button >
2019-01-16 13:16:10 +01:00
< button ng-show = "!isMe(user)" class = "btn btn-xs btn-danger" ng-click = "userremove.show(user)" uib-tooltip = "Remove User" > < i class = "far fa-trash-alt" > < / i > < / button >
2019-01-15 13:30:37 +01:00
< / td >
< / tr >
< / tbody >
< / table >
2018-01-22 13:01:38 -08:00
< / div >
2019-01-15 13:30:37 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
2019-01-15 13:30:37 +01:00
< / div >
2018-01-22 13:01:38 -08:00
< / div >
< br / >
< div class = "text-left" >
2018-03-13 00:29:10 -07:00
< h1 > Groups
< sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/user-management/#groups" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
< button class = "btn btn-primary btn-outline pull-right" ng-click = "groupAdd.show()" > < i class = "fa fa-plus" > < / i > New Group< / button >
< / h1 >
2018-01-22 13:01:38 -08:00
< / 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" >
2018-11-16 17:03:21 +01:00
< h2 > < i class = "fa fa-circle-notch fa-spin" > < / i > < / h2 >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< div class = "row animateMeOpacity ng-hide" ng-show = "ready" >
< div class = "col-lg-12" >
< table class = "table table-hover" >
< thead >
< tr >
2018-08-05 22:10:45 -07:00
< th style = "width: 45%" > Name< / th >
< th style = "width: 50%" > Users< / th >
< th style = "width: 5%" class = "text-right" > Actions< / th >
2018-01-22 13:01:38 -08:00
< / tr >
< / thead >
< tbody >
2018-07-26 15:45:52 -07:00
< tr ng-repeat = "group in groups" >
2018-06-18 17:45:09 -07:00
< td class = "hand elide-table-cell" style = "text-overflow: ellipsis; white-space: nowrap;" ng-click = "groupEdit.show(group)" >
2018-01-22 13:01:38 -08:00
{{ group.name }}
< / td >
2018-07-26 23:58:25 -07:00
< td class = "hand elide-table-cell" style = "text-overflow: ellipsis; white-space: nowrap;" ng-click = "groupEdit.show(group)" >
{{ groupMembers(group) }}
< / td >
2018-01-22 13:01:38 -08:00
< td class = "text-right" style = "vertical-align: bottom" >
2019-01-14 17:02:36 +01:00
< button class = "btn btn-xs btn-default" ng-click = "groupEdit.show(group)" uib-tooltip = "Edit Group" > < i class = "fa fa-pencil-alt" > < / i > < / button >
< button class = "btn btn-xs btn-danger" ng-click = "groupRemove.show(group)" uib-tooltip = "Remove Group" > < i class = "far fa-trash-alt" > < / i > < / button >
2018-01-22 13:01:38 -08:00
< / td >
< / tr >
< / tbody >
< / table >
< / div >
< / div >
< / div >
< / div >
2019-08-29 09:59:57 +02:00
2019-08-30 19:01:56 +02:00
< div class = "text-left" style = "margin-top: 50px;" ng-show = "showExternalLdap" >
2019-10-25 15:19:36 -07:00
< h1 > LDAP
< sup > < a ng-href = "{{ config.webServerOrigin }}/documentation/user-management/#external-ldap" class = "help" target = "_blank" > < i class = "fa fa-question-circle" > < / i > < / a > < / sup >
< / h1 >
2019-08-29 09:59:57 +02:00
< / div >
2019-08-30 19:01:56 +02:00
< div class = "card card-large" ng-show = "showExternalLdap" >
2019-08-29 09:59:57 +02:00
< div class = "row" >
< div class = "col-md-12" >
2019-10-25 15:19:36 -07:00
< p > Cloudron will authenticate users against the configured LDAP server.< / p >
2019-10-25 15:38:04 -07:00
< p > LDAP authentication is currently < b > {{ externalLdap.provider === 'noop' ? 'disabled' : 'enabled' }}.< / p >
2019-08-29 09:59:57 +02:00
2019-08-30 13:09:19 +02:00
< br / >
2019-08-30 12:40:23 +02:00
< button class = "btn btn-primary pull-right" ng-click = "externalLdap.show()" > Configure< / button >
2019-10-25 15:38:04 -07:00
< button class = "btn btn-success pull-right" ng-disabled = "externalLdap.provider === 'noop'" ng-click = "externalLdap.sync()" > < i class = "fa fa-circle-notch fa-spin" ng-show = "externalLdap.syncBusy" > < / i > Synchronize< / button >
2019-10-25 15:19:36 -07:00
< a class = "btn btn-primary pull-right" ng-show = "externalLdap.taskId" ng-href = "/logs.html?taskId={{ externalLdap.taskId }}" target = "_blank" > Show Logs< / a >
2019-08-29 09:59:57 +02:00
< / div >
< / div >
< div class = "row" >
< div class = "col-md-6" >
< / div >
2019-08-30 12:40:23 +02:00
< div class = "col-md-6" >
2019-08-29 09:59:57 +02:00
< / div >
< / div >
< / div >
2018-01-22 13:01:38 -08:00
< / div >