From c5800a8c988bc083205aef7c6e29c33dc6a6eb55 Mon Sep 17 00:00:00 2001 From: richard-dds Date: Tue, 30 Oct 2018 14:09:08 -0400 Subject: [PATCH] Vue-ify requests listing page --- atst/filters.py | 5 +++ atst/models/request.py | 4 +++ atst/models/request_status_event.py | 9 +++++ atst/routes/requests/index.py | 9 +++++ js/components/forms/requests_list.js | 50 ++++++++++++++++++++++++++++ js/index.js | 2 ++ templates/requests/index.html | 48 +++++++++++++------------- 7 files changed, 103 insertions(+), 24 deletions(-) create mode 100644 js/components/forms/requests_list.js diff --git a/atst/filters.py b/atst/filters.py index 217b9e2f..aade52c8 100644 --- a/atst/filters.py +++ b/atst/filters.py @@ -77,6 +77,10 @@ def dateFromString(value, formatter="%m/%Y"): return datetime.datetime.strptime(value, formatter) +def boolean(value): + return "true" if value else "false" + + def register_filters(app): app.jinja_env.filters["iconSvg"] = iconSvg app.jinja_env.filters["dollars"] = dollars @@ -88,3 +92,4 @@ def register_filters(app): app.jinja_env.filters["renderList"] = renderList app.jinja_env.filters["formattedDate"] = formattedDate app.jinja_env.filters["dateFromString"] = dateFromString + app.jinja_env.filters["boolean"] = boolean diff --git a/atst/models/request.py b/atst/models/request.py index 4d518274..4d03c4ec 100644 --- a/atst/models/request.py +++ b/atst/models/request.py @@ -237,6 +237,10 @@ class Request(Base, mixins.TimestampsMixin, mixins.AuditableMixin): else None ) + @property + def simple_status(self): + return self.latest_status.simple_name + def __repr__(self): return "".format( self.status_displayname, diff --git a/atst/models/request_status_event.py b/atst/models/request_status_event.py index 90ec2532..1eb14723 100644 --- a/atst/models/request_status_event.py +++ b/atst/models/request_status_event.py @@ -56,6 +56,15 @@ class RequestStatusEvent(Base, mixins.TimestampsMixin, mixins.AuditableMixin): else: return self.displayname + @property + def simple_name(self): + if self.new_status in [RequestStatus.CHANGES_REQUESTED, RequestStatus.CHANGES_REQUESTED_TO_FINVER]: + return "denied" + elif self.new_status == [RequestStatus.PENDING_FINANCIAL_VERIFICATION, RequestStatus.APPROVED]: + return "accepted" + else: + return "pending" + def __repr__(self): return "".format( self.log_name, self.request_id, self.id diff --git a/atst/routes/requests/index.py b/atst/routes/requests/index.py index 99e3ad5c..6817e65c 100644 --- a/atst/routes/requests/index.py +++ b/atst/routes/requests/index.py @@ -55,6 +55,12 @@ class RequestsIndex(object): "extended_view": False, } + def _workspace_link_for_request(self, request): + if request.is_approved: + return url_for("workspaces.workspace_projects", workspace_id=request.workspace_id) + else: + return None + def _map_request(self, request, viewing_role): time_created = pendulum.instance(request.time_created) is_new = time_created.add(days=1) > pendulum.now() @@ -67,7 +73,9 @@ class RequestsIndex(object): "workspace_id": request.workspace.id if request.workspace else None, "name": request.displayname, "is_new": is_new, + "is_approved": request.is_approved, "status": request.status_displayname, + "simple_status": request.simple_status, "app_count": app_count, "last_submission_timestamp": request.last_submission_timestamp, "last_edited_timestamp": request.latest_revision.time_updated, @@ -76,6 +84,7 @@ class RequestsIndex(object): "edit_link": url_for("requests.edit", request_id=request.id), "action_required": request.action_required_by == viewing_role, "dod_component": request.latest_revision.dod_component, + "workspace_link": self._workspace_link_for_request(request) } diff --git a/js/components/forms/requests_list.js b/js/components/forms/requests_list.js new file mode 100644 index 00000000..050588cd --- /dev/null +++ b/js/components/forms/requests_list.js @@ -0,0 +1,50 @@ +import Modal from '../../mixins/modal' + +export default { + name: 'requests-list', + + mixins: [Modal], + + components: { + Modal, + }, + + props: { + initialData: { + type: Array, + default: [], + }, + isExtended: { + type: Boolean, + default: false, + }, + }, + + data: function () { + const requests = this.initialData + return { + requests, + searchValue: '', + statusValue: '', + } + }, + + mounted: function () { + }, + + computed: { + filteredRequests: function () { + return this.applySearch(this.searchValue) + } + }, + + methods: { + applySearch: function(query) { + return this.requests.filter( + (request) => query !== '' ? + request.name.toLowerCase().includes(query.toLowerCase()) : + true + ) + } + }, + } diff --git a/js/index.js b/js/index.js index ac1f7c79..e6c4ae68 100644 --- a/js/index.js +++ b/js/index.js @@ -22,6 +22,7 @@ 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' +import RequestsList from './components/forms/requests_list' Vue.use(VTooltip) @@ -46,6 +47,7 @@ const app = new Vue({ LocalDatetime, EditEnvironmentRole, EditProjectRoles, + RequestsList, }, mounted: function() { diff --git a/templates/requests/index.html b/templates/requests/index.html index 3f5c121b..0cf9cf35 100644 --- a/templates/requests/index.html +++ b/templates/requests/index.html @@ -5,6 +5,8 @@ {% from "components/empty_state.html" import EmptyState %} {% block content %} + +
{% call Modal(name='pendingFinancialVerification', dismissable=True) %}

Request submitted!

@@ -55,7 +57,6 @@ ) }} {% else %} - {% if extended_view %}
@@ -79,7 +80,7 @@
- {% endif %} +
+ + {% endblock %}