Initial formatting and styling of portfolio managers table. Deleted unused css
This commit is contained in:
parent
8fc543928d
commit
ff3e585dfe
@ -17,63 +17,51 @@ from atst.utils.flash import formatted_flash as flash
|
|||||||
from atst.domain.exceptions import UnauthorizedError
|
from atst.domain.exceptions import UnauthorizedError
|
||||||
|
|
||||||
|
|
||||||
def permission_str(member, edit_perm_set, view_perm_set):
|
def filter_perm_sets_data(member):
|
||||||
if member.has_permission_set(edit_perm_set):
|
perm_sets_data = {
|
||||||
return edit_perm_set
|
"perms_portfolio_mgmt": bool(
|
||||||
else:
|
member.has_permission_set(PermissionSets.EDIT_PORTFOLIO_ADMIN)
|
||||||
return view_perm_set
|
|
||||||
|
|
||||||
|
|
||||||
def serialize_member_form_data(member):
|
|
||||||
return {
|
|
||||||
"member_name": member.full_name,
|
|
||||||
"member_id": member.id,
|
|
||||||
"perms_app_mgmt": permission_str(
|
|
||||||
member,
|
|
||||||
PermissionSets.EDIT_PORTFOLIO_APPLICATION_MANAGEMENT,
|
|
||||||
PermissionSets.VIEW_PORTFOLIO_APPLICATION_MANAGEMENT,
|
|
||||||
),
|
),
|
||||||
"perms_funding": permission_str(
|
"perms_app_mgmt": bool(
|
||||||
member,
|
member.has_permission_set(
|
||||||
PermissionSets.EDIT_PORTFOLIO_FUNDING,
|
PermissionSets.EDIT_PORTFOLIO_APPLICATION_MANAGEMENT
|
||||||
PermissionSets.VIEW_PORTFOLIO_FUNDING,
|
)
|
||||||
),
|
),
|
||||||
"perms_reporting": permission_str(
|
"perms_funding": bool(
|
||||||
member,
|
member.has_permission_set(PermissionSets.EDIT_PORTFOLIO_FUNDING)
|
||||||
PermissionSets.EDIT_PORTFOLIO_REPORTS,
|
|
||||||
PermissionSets.VIEW_PORTFOLIO_REPORTS,
|
|
||||||
),
|
),
|
||||||
"perms_portfolio_mgmt": permission_str(
|
"perms_reporting": bool(
|
||||||
member,
|
member.has_permission_set(PermissionSets.EDIT_PORTFOLIO_REPORTS)
|
||||||
PermissionSets.EDIT_PORTFOLIO_ADMIN,
|
|
||||||
PermissionSets.VIEW_PORTFOLIO_ADMIN,
|
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return perm_sets_data
|
||||||
|
|
||||||
def get_members_data(portfolio):
|
|
||||||
members = sorted(
|
def filter_members_data(members_list):
|
||||||
[serialize_member_form_data(member) for member in portfolio.members],
|
members_data = []
|
||||||
key=lambda member: member["member_name"],
|
for member in members_list:
|
||||||
)
|
members_data.append(
|
||||||
for member in members:
|
{
|
||||||
if member["member_id"] == portfolio.owner_role.id:
|
"role_id": member.id,
|
||||||
ppoc = member
|
"user_name": member.user_name,
|
||||||
members.remove(member)
|
"permission_sets": filter_perm_sets_data(member),
|
||||||
members.insert(0, ppoc)
|
# add in stuff here for forms
|
||||||
return members
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return sorted(members_data, key=lambda member: member["user_name"])
|
||||||
|
|
||||||
|
|
||||||
def render_admin_page(portfolio, form=None):
|
def render_admin_page(portfolio, form=None):
|
||||||
pagination_opts = Paginator.get_pagination_opts(http_request)
|
pagination_opts = Paginator.get_pagination_opts(http_request)
|
||||||
audit_events = AuditLog.get_portfolio_events(portfolio, pagination_opts)
|
audit_events = AuditLog.get_portfolio_events(portfolio, pagination_opts)
|
||||||
members_data = get_members_data(portfolio)
|
|
||||||
portfolio_form = PortfolioForm(obj=portfolio)
|
portfolio_form = PortfolioForm(obj=portfolio)
|
||||||
member_perms_form = member_forms.MembersPermissionsForm(
|
ppoc = filter_members_data([portfolio.owner_role])[0]
|
||||||
data={"members_permissions": members_data}
|
member_list = portfolio.members
|
||||||
)
|
member_list.remove(portfolio.owner_role)
|
||||||
|
|
||||||
assign_ppoc_form = member_forms.AssignPPOCForm()
|
assign_ppoc_form = member_forms.AssignPPOCForm()
|
||||||
|
|
||||||
for pf_role in portfolio.roles:
|
for pf_role in portfolio.roles:
|
||||||
if pf_role.user != portfolio.owner and pf_role.is_active:
|
if pf_role.user != portfolio.owner and pf_role.is_active:
|
||||||
assign_ppoc_form.role_id.choices += [(pf_role.id, pf_role.full_name)]
|
assign_ppoc_form.role_id.choices += [(pf_role.id, pf_role.full_name)]
|
||||||
@ -87,13 +75,13 @@ def render_admin_page(portfolio, form=None):
|
|||||||
"portfolios/admin.html",
|
"portfolios/admin.html",
|
||||||
form=form,
|
form=form,
|
||||||
portfolio_form=portfolio_form,
|
portfolio_form=portfolio_form,
|
||||||
member_perms_form=member_perms_form,
|
ppoc=ppoc,
|
||||||
|
members=filter_members_data(member_list),
|
||||||
member_form=member_forms.NewForm(),
|
member_form=member_forms.NewForm(),
|
||||||
assign_ppoc_form=assign_ppoc_form,
|
assign_ppoc_form=assign_ppoc_form,
|
||||||
portfolio=portfolio,
|
portfolio=portfolio,
|
||||||
audit_events=audit_events,
|
audit_events=audit_events,
|
||||||
user=g.current_user,
|
user=g.current_user,
|
||||||
ppoc_id=members_data[0].get("member_id"),
|
|
||||||
current_member_id=current_member_id,
|
current_member_id=current_member_id,
|
||||||
applications_count=len(portfolio.applications),
|
applications_count=len(portfolio.applications),
|
||||||
)
|
)
|
||||||
|
@ -5,13 +5,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
margin-left: 2 * $gap;
|
margin-left: 2 * $gap;
|
||||||
|
|
||||||
.line {
|
|
||||||
box-sizing: border-box;
|
|
||||||
height: 2px;
|
|
||||||
width: 100%;
|
|
||||||
border: 1px solid $color-gray-lightest;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.portfolio-header {
|
.portfolio-header {
|
||||||
@ -40,36 +33,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__budget {
|
|
||||||
font-size: $small-font-size;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
.icon-tooltip {
|
|
||||||
margin-left: -$gap / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--dollars {
|
|
||||||
font-size: $h2-font-size;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--amount {
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
&--cents {
|
|
||||||
font-size: 2rem;
|
|
||||||
margin-top: 0.75rem;
|
|
||||||
margin-left: -0.7rem;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.links {
|
.links {
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: $small-font-size;
|
font-size: $small-font-size;
|
||||||
@ -109,22 +72,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.column-left {
|
|
||||||
width: 12.5rem;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.column-right {
|
|
||||||
margin-left: -0.4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.unfunded {
|
|
||||||
color: $color-red;
|
|
||||||
.icon {
|
|
||||||
@include icon-color($color-red);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin subheading {
|
@mixin subheading {
|
||||||
@ -138,6 +85,10 @@
|
|||||||
.portfolio-content {
|
.portfolio-content {
|
||||||
margin: (4 * $gap) $gap 0 $gap;
|
margin: (4 * $gap) $gap 0 $gap;
|
||||||
|
|
||||||
|
.panel {
|
||||||
|
padding-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
a.add-new-button {
|
a.add-new-button {
|
||||||
display: inherit;
|
display: inherit;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -157,44 +108,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input.usa-button.usa-button-primary {
|
|
||||||
width: 9rem;
|
|
||||||
height: 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
padding-left: 1.2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.members-table-ppoc {
|
|
||||||
select::-ms-expand {
|
|
||||||
display: none;
|
|
||||||
color: $color-gray;
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
-moz-appearance: none;
|
|
||||||
appearance: none;
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
float: right;
|
|
||||||
margin: 5px 0px;
|
|
||||||
padding: 0px 24px;
|
|
||||||
background-image: none;
|
|
||||||
-ms-word-break: normal;
|
|
||||||
word-break: normal;
|
|
||||||
padding-right: 3rem;
|
|
||||||
padding-left: 1.2rem;
|
|
||||||
color: $color-gray;
|
|
||||||
}
|
|
||||||
|
|
||||||
select:hover {
|
|
||||||
box-shadow: none;
|
|
||||||
color: $color-gray;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a.modal-link.icon-link {
|
a.modal-link.icon-link {
|
||||||
float: right;
|
float: right;
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
{{ StickyCTA(text="Settings") }}
|
{{ StickyCTA(text="Settings") }}
|
||||||
|
|
||||||
<div v-cloak class="portfolio-admin portfolio-content">
|
<div v-cloak class="portfolio-admin">
|
||||||
|
|
||||||
<!-- max width of this section is 460px -->
|
<!-- max width of this section is 460px -->
|
||||||
<section class="form-container__half">
|
<section class="form-container__half">
|
||||||
|
@ -3,103 +3,47 @@
|
|||||||
{% from "components/modal.html" import Modal %}
|
{% from "components/modal.html" import Modal %}
|
||||||
{% from "components/alert.html" import Alert %}
|
{% from "components/alert.html" import Alert %}
|
||||||
|
|
||||||
<section class="member-list" id="portfolio-members">
|
<h3>Portfolio Managers</h3>
|
||||||
<div class='responsive-table-wrapper panel accordion-table'>
|
<div class="panel">
|
||||||
{% if g.matchesPath("portfolio-members") %}
|
<section class="member-list">
|
||||||
{% include "fragments/flash.html" %}
|
<div class="responsive-table-wrapper">
|
||||||
{% endif %}
|
<table class="atat-table">
|
||||||
<base-form inline-template>
|
<thead>
|
||||||
<form method='POST' id="member-perms" action='{{ url_for("portfolios.edit_members", portfolio_id=portfolio.id) }}' autocomplete="off" enctype="multipart/form-data">
|
<tr>
|
||||||
{{ member_perms_form.csrf_token }}
|
<th>Name</th>
|
||||||
|
<th>Portfolio Permissions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{ ppoc.user_name }}</td>
|
||||||
|
<td>
|
||||||
|
{% for perm, value in ppoc.permission_sets.items() -%}
|
||||||
|
<div>
|
||||||
|
{{ ("portfolios.admin.members.{}.{}".format(perm, value)) | translate }}
|
||||||
|
</div>
|
||||||
|
{%-endfor %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% for member in members -%}
|
||||||
|
<tr>
|
||||||
|
<td>{{ member.user_name }}</td>
|
||||||
|
<td>
|
||||||
|
{% for perm, value in member.permission_sets.items() -%}
|
||||||
|
<div>
|
||||||
|
{{ ("portfolios.admin.members.{}.{}".format(perm, value)) | translate }}
|
||||||
|
</div>
|
||||||
|
{%-endfor %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{%- endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<div class='application-list-item'>
|
|
||||||
<header>
|
|
||||||
<div class='responsive-table-wrapper__header'>
|
|
||||||
<div class='responsive-table-wrapper__title'>
|
|
||||||
<div class='h3'>{{ "portfolios.admin.portfolio_members_title" | translate }}</div>
|
|
||||||
<div class='subheading'>
|
|
||||||
{{ "portfolios.admin.portfolio_members_subheading" | translate }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a class='icon-link'>
|
|
||||||
{{ Icon('info') }}
|
|
||||||
{{ "portfolios.admin.settings_info" | translate }}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{% if not portfolio.members %}
|
|
||||||
<p>{{ "portfolios.admin.no_members" | translate }}</p>
|
|
||||||
{% else %}
|
|
||||||
<table class="atat-table">
|
|
||||||
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td>{{ "portfolios.members.permissions.name" | translate }}</td>
|
|
||||||
<td>{{ "portfolios.members.permissions.app_mgmt" | translate }}</td>
|
|
||||||
<td>{{ "portfolios.members.permissions.funding" | translate }}</td>
|
|
||||||
<td>{{ "portfolios.members.permissions.reporting" | translate }}</td>
|
|
||||||
<td>{{ "portfolios.members.permissions.portfolio_mgmt" | translate }}</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
|
|
||||||
<tbody>
|
|
||||||
{% if user_can(permissions.EDIT_PORTFOLIO_USERS) %}
|
|
||||||
{% include "portfolios/fragments/members_edit.html" %}
|
|
||||||
{% elif user_can(permissions.VIEW_PORTFOLIO_USERS) %}
|
|
||||||
{% include "portfolios/fragments/members_view.html" %}
|
|
||||||
{% endif %}
|
|
||||||
</tbody>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="panel__footer">
|
|
||||||
<div class="action-group save">
|
|
||||||
{% if user_can(permissions.EDIT_PORTFOLIO_USERS) %}
|
|
||||||
{{ SaveButton(text=('common.save' | translate), element="input", form="member-perms") }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if user_can(permissions.CREATE_PORTFOLIO_USERS) %}
|
|
||||||
<a class="icon-link modal-link" v-on:click="openModal('add-port-mem')">
|
|
||||||
{{ "portfolios.admin.add_new_member" | translate }}
|
|
||||||
{{ Icon("plus") }}
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</base-form>
|
|
||||||
{% if user_can(permissions.EDIT_PORTFOLIO_USERS) %}
|
|
||||||
{% for subform in member_perms_form.members_permissions %}
|
|
||||||
{% set modal_id = "portfolio_id_{}_user_id_{}".format(portfolio.id, subform.member_id.data) %}
|
|
||||||
{% call Modal(name=modal_id, dismissable=False) %}
|
|
||||||
<h1>{{ "portfolios.admin.alert_header" | translate }}</h1>
|
|
||||||
<hr>
|
|
||||||
{{
|
|
||||||
Alert(
|
|
||||||
title="portfolios.admin.alert_title" | translate,
|
|
||||||
message="portfolios.admin.alert_message" | translate,
|
|
||||||
level="warning"
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
<div class="action-group">
|
|
||||||
<form method="POST" action="{{ url_for('portfolios.remove_member', portfolio_id=portfolio.id, portfolio_role_id=subform.member_id.data)}}">
|
|
||||||
{{ member_perms_form.csrf_token }}
|
|
||||||
<button class="usa-button usa-button-danger">
|
|
||||||
{{ "portfolios.members.archive_button" | translate }}
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
<a v-on:click="closeModal('{{ modal_id }}')" class="action-group__action icon-link icon-link--default">{{ "common.cancel" | translate }}</a>
|
|
||||||
</div>
|
|
||||||
{% endcall %}
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if user_can(permissions.CREATE_PORTFOLIO_USERS) %}
|
{% if user_can(permissions.CREATE_PORTFOLIO_USERS) %}
|
||||||
|
<a href="#" class="usa-button usa-button-secondary add-new-button">Add Portfolio Manager</a>
|
||||||
{% include "portfolios/fragments/add_new_portfolio_member.html" %}
|
{% include "portfolios/fragments/add_new_portfolio_member.html" %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</section>
|
</div>
|
||||||
|
@ -317,6 +317,19 @@ portfolios:
|
|||||||
portfolio_members_title: Portfolio members
|
portfolio_members_title: Portfolio members
|
||||||
settings_info: Learn more about these settings
|
settings_info: Learn more about these settings
|
||||||
portfolio_name: Portfolio name
|
portfolio_name: Portfolio name
|
||||||
|
members:
|
||||||
|
perms_portfolio_mgmt:
|
||||||
|
'False': View Portfolio
|
||||||
|
'True': Edit Portfolio
|
||||||
|
perms_app_mgmt:
|
||||||
|
'False': View Applications
|
||||||
|
'True': Edit Applications
|
||||||
|
perms_funding:
|
||||||
|
'False': View Funding
|
||||||
|
'True': Edit Funding
|
||||||
|
perms_reporting:
|
||||||
|
'False': View Reporting
|
||||||
|
'True': Edit Reporting
|
||||||
applications:
|
applications:
|
||||||
add_application_text: Add a new application
|
add_application_text: Add a new application
|
||||||
add_environment: Create an Environment
|
add_environment: Create an Environment
|
||||||
|
Loading…
x
Reference in New Issue
Block a user