diff --git a/atst/filters.py b/atst/filters.py index 61c42f8c..2b54572e 100644 --- a/atst/filters.py +++ b/atst/filters.py @@ -19,6 +19,16 @@ def dollars(value): return "${:,.2f}".format(numberValue) +def justDollars(value): + raw = dollars(value) + return raw.split(".")[0] + + +def justCents(value): + raw = dollars(value) + return raw.split(".")[1] + + def usPhone(number): phone = re.sub(r"\D", "", number) return "+1 ({}) {} - {}".format(phone[0:3], phone[3:6], phone[6:]) @@ -99,6 +109,8 @@ def normalizeOrder(title): def register_filters(app): app.jinja_env.filters["iconSvg"] = iconSvg app.jinja_env.filters["dollars"] = dollars + app.jinja_env.filters["justDollars"] = justDollars + app.jinja_env.filters["justCents"] = justCents app.jinja_env.filters["usPhone"] = usPhone app.jinja_env.filters["readableInteger"] = readableInteger app.jinja_env.filters["getOptionLabel"] = getOptionLabel diff --git a/atst/routes/portfolios/__init__.py b/atst/routes/portfolios/__init__.py index ad935378..e735064f 100644 --- a/atst/routes/portfolios/__init__.py +++ b/atst/routes/portfolios/__init__.py @@ -1,4 +1,5 @@ from flask import Blueprint, request as http_request, g, render_template +from operator import attrgetter portfolios_bp = Blueprint("portfolios", __name__) @@ -31,4 +32,24 @@ def portfolio(): ) return False - return {"portfolio": portfolio, "permissions": Permissions, "user_can": user_can} + if not portfolio is None: + active_task_orders = [ + task_order for task_order in portfolio.task_orders if task_order.is_active + ] + funding_end_date = ( + sorted(active_task_orders, key=attrgetter("end_date"))[-1].end_date + if active_task_orders + else None + ) + funded = len(active_task_orders) > 1 + else: + funding_end_date = None + funded = None + + return { + "portfolio": portfolio, + "permissions": Permissions, + "user_can": user_can, + "funding_end_date": funding_end_date, + "funded": funded, + } diff --git a/atst/routes/portfolios/task_orders.py b/atst/routes/portfolios/task_orders.py index 70c30a33..eba80695 100644 --- a/atst/routes/portfolios/task_orders.py +++ b/atst/routes/portfolios/task_orders.py @@ -1,5 +1,4 @@ from collections import defaultdict -from operator import itemgetter from flask import g, redirect, render_template, url_for, request as http_request @@ -41,12 +40,6 @@ def portfolio_funding(portfolio_id): task_orders_by_status[task_order.status].append(serialized_task_order) active_task_orders = task_orders_by_status.get(TaskOrderStatus.ACTIVE, []) - funding_end_date = ( - sorted(active_task_orders, key=itemgetter("end_date"))[-1]["end_date"] - if active_task_orders - else None - ) - funded = len(active_task_orders) > 1 total_balance = sum([task_order["balance"] for task_order in active_task_orders]) return render_template( @@ -55,8 +48,6 @@ def portfolio_funding(portfolio_id): pending_task_orders=task_orders_by_status.get(TaskOrderStatus.PENDING, []), active_task_orders=active_task_orders, expired_task_orders=task_orders_by_status.get(TaskOrderStatus.EXPIRED, []), - funding_end_date=funding_end_date, - funded=funded, total_balance=total_balance, ) diff --git a/styles/components/_portfolio_layout.scss b/styles/components/_portfolio_layout.scss index 5638b8b7..7d57ed03 100644 --- a/styles/components/_portfolio_layout.scss +++ b/styles/components/_portfolio_layout.scss @@ -99,6 +99,42 @@ } } } + + .column-left { + width: 12.5rem; + float: left; + } + + .column-right { + margin-left: -.4rem; + } + + .cents { + font-size: 2rem; + margin-top: .75rem; + margin-left: -.7rem; + font-weight: bold; + } + + .portfolio-funding__header--funded-through { + flex-grow: 1; + text-align: left; + font-weight: bold; + } + + .funded { + color: $color-blue; + .icon { + @include icon-color($color-blue); + } + } + + .unfunded { + color: $color-red; + .icon { + @include icon-color($color-red); + } + } } @mixin subheading { diff --git a/templates/portfolios/header.html b/templates/portfolios/header.html index 1895ecac..18674b5e 100644 --- a/templates/portfolios/header.html +++ b/templates/portfolios/header.html @@ -15,14 +15,41 @@ {{ secondary_breadcrumb or portfolio.name }}