diff --git a/atst/models/workspace_user.py b/atst/models/workspace_user.py index 216b07aa..aae7b88a 100644 --- a/atst/models/workspace_user.py +++ b/atst/models/workspace_user.py @@ -67,8 +67,5 @@ class WorkspaceUser(object): def __repr__(self): return "".format( - self.user.full_name, - self.role, - self.workspace.name, - self.num_environment_roles, + self.user_name, self.role, self.workspace.name, self.num_environment_roles ) diff --git a/atst/routes/workspaces.py b/atst/routes/workspaces.py index b0c751a6..726e1bac 100644 --- a/atst/routes/workspaces.py +++ b/atst/routes/workspaces.py @@ -21,7 +21,11 @@ from atst.forms.project import NewProjectForm, ProjectForm from atst.forms.new_member import NewMemberForm from atst.forms.edit_member import EditMemberForm from atst.forms.workspace import WorkspaceForm -from atst.forms.data import ENVIRONMENT_ROLES, ENV_ROLE_MODAL_DESCRIPTION +from atst.forms.data import ( + ENVIRONMENT_ROLES, + ENV_ROLE_MODAL_DESCRIPTION, + WORKSPACE_ROLE_DEFINITIONS, +) from atst.domain.authz import Authorization from atst.models.permissions import Permissions from atst.domain.invitations import Invitations @@ -102,9 +106,26 @@ def workspace_members(workspace_id): new_member = next( filter(lambda m: m.user_name == new_member_name, workspace.members), None ) + members_list = [ + { + "name": k.user_name, + "status": k.status, + "id": k.user_id, + "role": k.role_displayname, + "num_env": k.num_environment_roles, + "edit_link": url_for( + "workspaces.view_member", workspace_id=workspace.id, member_id=k.user_id + ), + } + for k in workspace.members + ] return render_template( - "workspaces/members/index.html", workspace=workspace, new_member=new_member + "workspaces/members/index.html", + workspace=workspace, + choices=WORKSPACE_ROLE_DEFINITIONS, + members=members_list, + new_member=new_member, ) diff --git a/js/components/forms/members_list.js b/js/components/forms/members_list.js new file mode 100644 index 00000000..a092ab28 --- /dev/null +++ b/js/components/forms/members_list.js @@ -0,0 +1,40 @@ + +export default { + name: 'members-list', + + props: { + members: Array, + choices: Array, + }, + + data: function () { + return { + searchValue: '', + status: '', + role: '', + } + }, + + computed: { + searchedList: function () { + return this.members.filter( + member => this.status ? + member.status === this.status | this.status === 'all' + : true + ).filter( + member => this.role ? ( + this.getRoleFromDisplayName(member.role) === this.role | this.role === 'all') + : true + ).filter( + member => this.searchValue ? member.name.toLowerCase() + .includes(this.searchValue.toLowerCase()) : true + ) + } + }, + + methods: { + getRoleFromDisplayName: function (role) { + return this.choices.find(choice => choice.display_name === role).name + }, + }, +} diff --git a/js/index.js b/js/index.js index a91f06c2..ac1f7c79 100644 --- a/js/index.js +++ b/js/index.js @@ -20,6 +20,7 @@ import selector from './components/selector' import BudgetChart from './components/charts/budget_chart' import SpendTable from './components/tables/spend_table' import CcpoApproval from './components/forms/ccpo_approval' +import MembersList from './components/forms/members_list' import LocalDatetime from './components/local_datetime' Vue.use(VTooltip) @@ -41,6 +42,7 @@ const app = new Vue({ BudgetChart, SpendTable, CcpoApproval, + MembersList, LocalDatetime, EditEnvironmentRole, EditProjectRoles, diff --git a/templates/workspaces/members/index.html b/templates/workspaces/members/index.html index 90b650f5..82086696 100644 --- a/templates/workspaces/members/index.html +++ b/templates/workspaces/members/index.html @@ -45,39 +45,41 @@ ) }} {% endif %} - {% endif %}