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:33:58 -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.
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" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
2018-02-28 15:21:42 -08:00
< h4 class = "modal-title" > Edit user {{ useredit.userInfo.username || useredit.userInfo.email }}< / h4 >
2018-01-22 13:01:38 -08:00
< / div >
< div class = "modal-body" >
< form name = "useredit_form" role = "form" ng-submit = "useredit.submit()" autocomplete = "off" >
2018-07-24 15:17:51 -07:00
< div class = "form-group" ng-class = "{ 'has-error': (useredit_form.displayName.$dirty && useredit_form.displayName.$invalid) || (!useredit_form.displayName.$dirty && useredit.error.displayName) }" >
< label class = "control-label" > Full 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 >
< / div >
< input type = "text" class = "form-control" ng-model = "useredit.displayName" name = "displayName" required autofocus autocomplete = "off" >
< / div >
2018-01-22 13:01:38 -08:00
< div class = "form-group" ng-class = "{ 'has-error': (useredit_form.email.$dirty && useredit_form.email.$invalid) || (!useredit_form.email.$dirty && useredit.error.email) }" >
2018-02-24 16:42:15 -08:00
< label class = "control-label" > Primary email< / label >
2018-01-22 13:01:38 -08: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 >
< / div >
< input type = "email" class = "form-control" ng-model = "useredit.email" name = "email" required >
< / div >
2018-01-24 16:20:56 +01:00
< div class = "form-group" ng-class = "{ 'has-error': (useredit_form.fallbackEmail.$dirty && useredit_form.fallbackEmail.$invalid) || (!useredit_form.fallbackEmail.$dirty && useredit.error.fallbackEmail) }" >
2018-02-24 16:42:15 -08:00
< label class = "control-label" > Password recovery email< / label >
2018-01-24 16:20:56 +01:00
< 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 >
< / div >
< input type = "fallbackEmail" class = "form-control" ng-model = "useredit.fallbackEmail" name = "fallbackEmail" required >
< / div >
2018-01-22 13:01:38 -08:00
< div class = "form-group" >
< label class = "control-label" > Groups< / label >
2018-07-24 21:36:50 -07:00
< 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 = "useredit.selectedGroups" options = "group.name for group in groups" data-compare-by = "name" data-multiple = "true" > < / multiselect >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< div class = "form-group" ng-hide = "isMe(useredit.userInfo)" >
< div class = "checkbox" >
< label >
2018-07-26 15:45:52 -07:00
< input type = "checkbox" ng-model = "useredit.admin" > User is an < a href = "https://cloudron.io/documentation/user-management/#administrators" target = "_blank" > administrator< / a >
2018-01-22 13:01:38 -08: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 >
2018-11-16 17:03:21 +01:00
< 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 >
2018-01-22 13:01:38 -08:00
< / div >
< / div >
< / div >
< / 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 >
< 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 >
< tr ng-repeat = "user in users" >
< td >
< i class = "fa fa-briefcase arrow" ng-show = "user.admin" uib-tooltip = "This user can manage apps, groups and other users" > < / i >
< / 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" >
< button ng-show = "!isMe(user)" class = "btn btn-xs btn-default" ng-click = "invitation.show(user)" uib-tooltip = "Create setup link" > < i class = "fa fa-paper-plane" > < / i > < / button >
< 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 >
< / div >