orgUsers.html 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <page-header model="ctrl.navModel"></page-header>
  2. <div class="page-container page-body">
  3. <div class="page-action-bar">
  4. <label class="gf-form gf-form--grow gf-form--has-input-icon">
  5. <input type="text" class="gf-form-input width-20" ng-model="ctrl.searchQuery" ng-change="ctrl.onQueryUpdated()" placeholder="Filter by username or email" />
  6. <i class="gf-form-input-icon fa fa-search"></i>
  7. </label>
  8. <div class="page-action-bar__spacer"></div>
  9. <button class="btn btn-inverse" ng-show="ctrl.pendingInvites.length" ng-click="ctrl.showInvites = true">
  10. Pending Invites ({{ctrl.pendingInvites.length}})
  11. </button>
  12. <a class="btn btn-success" href="org/users/invite" ng-show="ctrl.canInvite">
  13. <i class="fa fa-plus"></i>
  14. <span>Invite</span>
  15. </a>
  16. <a class="btn btn-success" ng-href="{{ctrl.externalUserMngLinkUrl}}" target="_blank" ng-if="ctrl.externalUserMngLinkUrl">
  17. <i class="fa fa-external-link-square"></i>
  18. {{ctrl.externalUserMngLinkName}}
  19. </a>
  20. </div>
  21. <div class="grafana-info-box" ng-if="ctrl.externalUserMngInfo">
  22. <span ng-bind-html="ctrl.externalUserMngInfo"></span>
  23. </div>
  24. <div ng-hide="ctrl.showInvites">
  25. <table class="filter-table form-inline">
  26. <thead>
  27. <tr>
  28. <th></th>
  29. <th>Login</th>
  30. <th>Email</th>
  31. <th>
  32. Seen
  33. <tip>Time since user was seen using Grafana</tip>
  34. </th>
  35. <th>Role</th>
  36. <th style="width: 34px;"></th>
  37. </tr>
  38. </thead>
  39. <tr ng-repeat="user in ctrl.users">
  40. <td class="width-4 text-center">
  41. <img class="filter-table__avatar" ng-src="{{user.avatarUrl}}"></img>
  42. </td>
  43. <td>{{user.login}}</td>
  44. <td><span class="ellipsis">{{user.email}}</span></td>
  45. <td>{{user.lastSeenAtAge}}</td>
  46. <td>
  47. <div class="gf-form-select-wrapper width-12">
  48. <select type="text" ng-model="user.role" class="gf-form-input" ng-options="f for f in ['Viewer', 'Editor', 'Admin']" ng-change="ctrl.updateOrgUser(user)">
  49. </select>
  50. </div>
  51. </td>
  52. <td>
  53. <a ng-click="ctrl.removeUser(user)" class="btn btn-danger btn-mini">
  54. <i class="fa fa-remove"></i>
  55. </a>
  56. </td>
  57. </tr>
  58. </table>
  59. </div>
  60. <div ng-if="ctrl.showInvites">
  61. <table class="filter-table form-inline">
  62. <thead>
  63. <tr>
  64. <th>Email</th>
  65. <th>Name</th>
  66. <th></th>
  67. <th style="width: 34px;"></th>
  68. </tr>
  69. </thead>
  70. <tr ng-repeat="invite in ctrl.pendingInvites">
  71. <td>{{invite.email}}</td>
  72. <td>{{invite.name}}</td>
  73. <td class="text-right">
  74. <button class="btn btn-inverse btn-mini" clipboard-button="ctrl.getInviteUrl(invite)" ng-click="ctrl.copyInviteToClipboard($event)">
  75. <i class="fa fa-clipboard"></i> Copy Invite
  76. </button>
  77. &nbsp;
  78. </td>
  79. <td>
  80. <button class="btn btn-danger btn-mini" ng-click="ctrl.revokeInvite(invite, $event)">
  81. <i class="fa fa-remove"></i>
  82. </button>
  83. </td>
  84. </tr>
  85. </table>
  86. </div>
  87. </div>