2015-03-31 19:58:23 +00:00
< div class = "resource-view team-view" resources = "[orgResource, membersResource]"
error-message="'No matching organization or team found'">
< div class = "page-content" >
< div class = "cor-title" >
< span class = "cor-title-link" >
< a class = "back-link" href = "/organization/{{ organization.name }}?tab=teams" >
< span class = "avatar" size = "24" data = "organization.avatar" style = "margin-right: 4px" > < / span >
{{ organization.name }}
< / a >
< / span >
< span class = "cor-title-content" >
2015-10-15 16:05:55 +00:00
< span class = "team-title" > Team< / span >
2015-03-31 19:58:23 +00:00
< span class = "avatar" data = "team.avatar" size = "32" > < / span >
< span class = "team-name" > {{ teamname }}< / span >
< / span >
2014-08-16 00:51:31 +00:00
< / div >
2014-11-24 21:07:38 +00:00
2015-03-31 19:58:23 +00:00
< div class = "co-main-content-panel" >
2016-09-15 20:06:56 +00:00
< div class = "feedback-bar" feedback = "feedback" > < / div >
2013-11-05 01:17:58 +00:00
2017-02-17 23:20:23 +00:00
< div class = "team-sync-header" ng-if = "canSync && !syncInfo" >
< div class = "section-header" > Directory Synchronization< / div >
< p > Directory synchronization allows this team's user membership to be backed by a group in {{ getServiceName(canSync.service) }}.< / p >
< button class = "btn btn-primary" ng-click = "showEnableSyncing()" > Enable Directory Synchronization< / button >
< / div >
<!-- Sync Header -->
< div ng-if = "syncInfo" >
< div class = "co-alert co-alert-info" >
This team is synchronized with a group in < strong > {{ getServiceName(syncInfo.service) }}< / strong > and its user membership is therefore < strong > read-only< / strong > .
< / div >
2017-02-22 02:07:48 +00:00
< div class = "team-sync-header" ng-if = "syncInfo.config" >
2017-02-17 23:20:23 +00:00
< div class = "section-header" > Directory Synchronization< / div >
< table class = "team-sync-table" >
< tr >
< td > Bound to group:< / td >
< td >
< div ng-if = "syncInfo.service == 'ldap'" >
< code > {{ syncInfo.config.group_dn }}< / code >
< / div >
2017-02-23 19:41:27 +00:00
< div ng-if = "syncInfo.service == 'keystone'" >
< code > {{ syncInfo.config.group_id }}< / code >
< / div >
2017-02-17 23:20:23 +00:00
< / td >
< / tr >
< tr >
< td > Last Updated:< / td >
2017-02-17 23:36:56 +00:00
< td ng-if = "syncInfo.last_updated" > < span am-time-ago = "syncInfo.last_updated" > < / span > at {{ syncInfo.last_updated | amDateFormat:'dddd, MMMM Do YYYY, h:mm:ss a' }}< / td >
2017-02-22 02:07:48 +00:00
< td ng-if = "!syncInfo.last_updated" style = "color: #aaa;" > Never< / td >
2017-02-17 23:20:23 +00:00
< / tr >
< / table >
2017-02-22 02:07:48 +00:00
< button class = "btn btn-default" ng-click = "showDisableSyncing()" ng-if = "canSync" > Remove Synchronization< / button >
< div ng-if = "!canSync" class = "co-alert co-alert-warning co-alert-inline" > You must be an admin of this organization to disable team synchronization< / div >
2017-02-17 23:20:23 +00:00
< / div >
< / div >
2016-09-15 20:06:56 +00:00
<!-- Description -->
< div class = "section-header" > Team Description< / div >
< div class = "team-view-header" >
2015-03-31 19:58:23 +00:00
< div class = "description markdown-input" content = "team.description"
can-write="organization.is_admin"
content-changed="updateForDescription"
field-title="'team description'">< / div >
2014-08-16 00:51:31 +00:00
< / div >
2016-09-15 20:06:56 +00:00
<!-- Members -->
< div ng-show = "canEditMembers" style = "float:right; margin-top: 10px;" >
< div class = "hidden-xs" >
< div ng-include = "'/static/directives/team-view-add.html'" style = "max-width: 500px;" > < / div >
< / div >
< / div >
2017-02-17 23:20:23 +00:00
< div class = "section-header" style = "margin-bottom: 55px;" > Team Members< / div >
2016-09-15 20:06:56 +00:00
2015-03-31 19:58:23 +00:00
< div class = "empty" ng-if = "!members.length" >
< div class = "empty-primary-msg" > This team has no members.< / div >
2017-02-17 23:20:23 +00:00
< div class = "empty-secondary-msg" ng-if = "!syncInfo" >
Enter a user or robot above to add or invite to the team.
< / div >
< div class = "empty-secondary-msg" ng-if = "syncInfo" >
This team is synchronized with an external group defined in {{ getServiceName(syncInfo.service) }}. To add a user to this team, add them in the backing group. To add a robot account to this team, enter them above.
2015-03-31 19:58:23 +00:00
< / div >
2013-12-18 03:56:28 +00:00
< / div >
2014-11-24 21:07:38 +00:00
2015-03-31 19:58:23 +00:00
< table class = "co-table no-lines" ng-if = "members.length" >
<!-- Team Members -->
< tr class = "co-table-header-row"
ng-if="(members | filter: filterFunction(false, false)).length">
2017-02-17 23:20:23 +00:00
< td colspan = "3" > < i class = "fa fa-user" > < / i > Team Members < span ng-if = "syncInfo" > (defined in {{ getServiceName(syncInfo.service) }})< / span > < / td >
2014-08-16 00:51:31 +00:00
< / tr >
2015-03-31 19:58:23 +00:00
< tr class = "indented-row"
ng-repeat="member in members | filter: filterFunction(false, false) | orderBy: 'name'">
2014-08-16 00:51:31 +00:00
< td class = "user entity" >
2015-03-31 19:58:23 +00:00
< span class = "entity-reference" entity = "member" namespace = "organization.name"
show-avatar="true" avatar-size="24">< / span >
2014-08-16 00:51:31 +00:00
< / td >
2016-09-15 20:06:56 +00:00
< td class = "options-col" >
2017-02-17 23:20:23 +00:00
< span class = "cor-options-menu" ng-if = "canEditMembers && !syncInfo" >
2015-03-31 19:58:23 +00:00
< span class = "cor-option" option-click = "removeMember(member.name)" >
< i class = "fa fa-times" > < / i > Remove {{ member.name }}
< / span >
< / span >
2014-08-16 00:51:31 +00:00
< / td >
2014-11-24 21:07:38 +00:00
< / tr >
2015-03-31 19:58:23 +00:00
<!-- Robot Accounts -->
< tr class = "co-table-header-row"
ng-if="(members | filter: filterFunction(false, true)).length">
2015-04-23 20:41:47 +00:00
< td colspan = "3" > < i class = "fa ci-robot" > < / i > Robot Accounts< / td >
2014-08-16 00:51:31 +00:00
< / tr >
2015-03-31 19:58:23 +00:00
< tr class = "indented-row"
ng-repeat="member in members | filter: filterFunction(false, true) | orderBy: 'name'">
2014-08-16 00:51:31 +00:00
< td class = "user entity" >
< span class = "entity-reference" entity = "member" namespace = "organization.name" > < / span >
< / td >
2016-09-15 20:06:56 +00:00
< td class = "options-col" >
2015-03-31 19:58:23 +00:00
< span class = "cor-options-menu" ng-if = "canEditMembers" >
< span class = "cor-option" option-click = "removeMember(member.name)" >
< i class = "fa fa-times" > < / i > Remove {{ member.name }}
< / span >
< / span >
2014-08-16 00:51:31 +00:00
< / td >
< / tr >
2015-03-31 19:58:23 +00:00
<!-- Invitations -->
< tr class = "co-table-header-row"
ng-if="(members | filter: filterFunction(true, false)).length">
< td colspan = "3" > < i class = "fa ci-invite" > < / i > Invited to Join< / td >
2014-08-16 00:51:31 +00:00
< / tr >
2015-03-31 19:58:23 +00:00
< tr class = "indented-row"
ng-repeat="member in members | filter: filterFunction(true, false) | orderBy: 'name'">
2014-08-16 00:51:31 +00:00
< td class = "user entity" >
2014-08-29 03:46:27 +00:00
< span ng-if = "member.kind != 'invite'" >
2015-03-31 19:58:23 +00:00
< span class = "entity-reference" entity = "member" namespace = "organization.name" show-avatar = "true" avatar-size = "24" > < / span >
2014-08-29 03:46:27 +00:00
< / span >
< span class = "invite-listing" ng-if = "member.kind == 'invite'" >
2015-03-31 19:58:23 +00:00
< span class = "avatar" size = "24" data = "member.avatar" style = "margin-right: 6px;" > < / span >
2014-08-29 03:46:27 +00:00
{{ member.email }}
< / span >
2014-08-16 00:51:31 +00:00
< / td >
2016-09-15 20:06:56 +00:00
< td class = "options-col" >
2015-03-31 19:58:23 +00:00
< span class = "cor-options-menu" ng-if = "canEditMembers" >
< span class = "cor-option" option-click = "revokeInvite(member)" >
< i class = "fa fa-times" > < / i > Revoke invite
< / span >
< / span >
2014-08-16 00:51:31 +00:00
< / td >
< / tr >
< / table >
2014-08-16 01:00:12 +00:00
2016-09-15 20:06:56 +00:00
<!-- Add team member (mobile) -->
2014-08-16 01:00:12 +00:00
< div ng-show = "canEditMembers" >
2016-09-15 20:06:56 +00:00
< div class = "visible-xs" style = "margin-top: 20px; padding-top: 10px; border-top: 1px solid #eee;" >
< div class = "section-header" > Add team member< / div >
< div ng-include = "'/static/directives/team-view-add.html'" style = "max-width: 500px;" > < / div >
2014-08-16 01:00:12 +00:00
< / div >
< / div >
2013-11-04 19:56:54 +00:00
< / div >
< / div >
2013-11-04 21:21:49 +00:00
< / div >
2013-11-04 19:56:54 +00:00
2017-02-17 23:20:23 +00:00
<!-- Directory binding dialog -->
< div class = "cor-confirm-dialog"
dialog-context="enableSyncingInfo"
dialog-action="enableSyncing(info.config, callback)"
dialog-title="Enable Directory Syncing"
dialog-action-title="Enable Group Sync"
dialog-form="context.syncform">
< div class = "co-alert co-alert-warning" > Please note that once team syncing is enabled, the team's user membership from within < span class = "registry-name" > < / span > will be read-only.< / div >
< form name = "context.syncform" class = "co-single-field-dialog" >
< div ng-switch on = "enableSyncingInfo.service_info.service" >
< div ng-switch-when = "ldap" >
Enter the distinguished name of the group, relative to < code > {{ enableSyncingInfo.service_info.base_dn }}< / code > :
< input type = "text" class = "form-control" placeholder = "Group DN" ng-model = "enableSyncingInfo.config.group_dn" required >
< / div >
2017-02-23 19:41:27 +00:00
< div ng-switch-when = "keystone" >
Enter the Keystone group ID:
< input type = "text" class = "form-control" placeholder = "Group ID" ng-model = "enableSyncingInfo.config.group_id" required >
< / div >
2017-02-17 23:20:23 +00:00
< / div >
< / form >
< / div >
2013-11-05 01:17:58 +00:00
<!-- Modal message dialog -->
< div class = "modal fade" id = "cannotChangeTeamModal" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< button type = "button" class = "close" data-dismiss = "modal" aria-hidden = "true" > × < / button >
< h4 class = "modal-title" > Cannot change team< / h4 >
< / div >
< div class = "modal-body" >
You do not have permission to change properties of this team.
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
< / div >
< / div > <!-- /.modal - content -->
< / div > <!-- /.modal - dialog -->
< / div > <!-- /.modal -->
2013-11-04 21:21:49 +00:00
<!-- Modal message dialog -->
< div class = "modal fade" id = "cannotChangeMembersModal" >
< div class = "modal-dialog" >
< div class = "modal-content" >
< div class = "modal-header" >
< button type = "button" class = "close" data-dismiss = "modal" aria-hidden = "true" > × < / button >
< h4 class = "modal-title" > Cannot change members< / h4 >
< / div >
< div class = "modal-body" >
You do not have permission to change the members of this team.
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-default" data-dismiss = "modal" > Close< / button >
< / div >
< / div > <!-- /.modal - content -->
< / div > <!-- /.modal - dialog -->
< / div > <!-- /.modal -->