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 >
2018-07-26 15:45:52 -07:00
< input type = "checkbox" ng-model = "useradd.admin" > User is an < a href = "https://cloudron.io/documentation/user-management/#administrators" target = "_blank" > administrator< / a >
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 >
< p > < label > Display Name< / label > < br / > {{ useredit.displayName }}< / p >
< p > < label > Email< / label > < br / > {{ useredit.email }}< / p >
< / 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 >
< input type = "checkbox" ng-model = "useredit.admin" > User is an < a href = "https://cloudron.io/documentation/user-management/#administrators" target = "_blank" > administrator< / a >
< / label >
< / div >
< / div >
< div class = "form-group" ng-hide = "isMe(useredit.userInfo)" >
< div class = "checkbox" >
< label >
< input type = "checkbox" ng-model = "useredit.active" > User is active< / a >
< / 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" >
< h4 class = "modal-title" > Configure external LDAP< / h4 >
< / div >
< div class = "modal-body" >
< div class = "checkbox" >
< label >
< input type = "checkbox" ng-model = "externalLdap.enabled" > Enable< / input >
< / label >
< / div >
< br / >
< div uib-collapse = "!externalLdap.enabled" >
< 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 }" >
< label class = "control-label" for = "inputExternalLdapConfigUrl" > Endpoint Url< / label >
< input type = "text" class = "form-control" ng-model = "externalLdap.url" id = "inputExternalLdapConfigUrl" name = "url" ng-disabled = "externalLdap.busy" placeholder = "ldaps://example.com:636" required >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.baseDn }" >
< label class = "control-label" for = "inputExternalLdapConfigBaseDn" > Base DN< / label >
< 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 >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.filter }" >
< label class = "control-label" for = "inputExternalLdapConfigFilter" > Filter< / label >
< input type = "text" class = "form-control" ng-model = "externalLdap.filter" id = "inputExternalLdapConfigFilter" name = "filter" ng-disabled = "externalLdap.busy" placeholder = "(objectClass=inetOrgPerson)" required >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.credentials }" >
< label class = "control-label" for = "inputExternalLdapConfigBindDn" > Bind DN (optional)< / label >
< 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" >
< / div >
< div class = "form-group" ng-class = "{ 'has-error': externalLdap.error.credentials }" >
< label class = "control-label" for = "inputExternalLdapConfigBindPassword" > Bind Password (optional)< / label >
< input type = "password" class = "form-control" ng-model = "externalLdap.bindPassword" id = "inputExternalLdapConfigBindPassword" name = "bindPassword" ng-disabled = "externalLdap.busy" placeholder = "" >
< / 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-08-29 09:59:57 +02:00
< h3 > External LDAP< / h3 >
< / 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" >
< p >
2019-08-30 13:32:20 +02:00
This option allows to use an external LDAP or ActiveDirectory service for user management.< br / >
< br / >
Users from the LDAP directory will be synced into the Cloudron user management.
2019-08-30 13:09:19 +02:00
Those users will be able to login to apps using the passwored stored in the LDAP service and thus won't be able to change their password inside Cloudron.
The same applies for their email address.
2019-08-29 09:59:57 +02:00
< / p >
2019-08-30 13:09:19 +02:00
< br / >
2019-08-30 12:40:23 +02:00
< button class = "btn btn-success" ng-show = "externalLdap.enabled" ng-click = "externalLdap.sync()" > < i class = "fa fa-circle-notch fa-spin" ng-show = "externalLdap.syncBusy" > < / i > Synchronize< / button >
< a class = "btn btn-primary" ng-show = "externalLdap.taskId" ng-href = "/logs.html?taskId={{ externalLdap.taskId }}" target = "_blank" > Show Logs< / a >
< button class = "btn btn-primary pull-right" ng-click = "externalLdap.show()" > Configure< / button >
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 >