Merge pull request #437 from dod-ccpo/request-filter-dod-component

Allow CCPO to filter requests by DOD component
This commit is contained in:
patricksmithdds 2018-11-08 12:21:09 -05:00 committed by GitHub
commit e0a772e35a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 69 additions and 33 deletions

View File

@ -4,6 +4,7 @@ from flask import render_template, g, url_for
from . import requests_bp from . import requests_bp
from atst.domain.requests import Requests from atst.domain.requests import Requests
from atst.models.permissions import Permissions from atst.models.permissions import Permissions
from atst.forms.data import SERVICE_BRANCHES
class RequestsIndex(object): class RequestsIndex(object):
@ -20,7 +21,11 @@ class RequestsIndex(object):
else: else:
context = self._non_ccpo_view(self.user) context = self._non_ccpo_view(self.user)
return {**context, "possible_statuses": Requests.possible_statuses()} return {
**context,
"possible_statuses": Requests.possible_statuses(),
"possible_dod_components": [b[0] for b in SERVICE_BRANCHES[1:]],
}
def _ccpo_view(self, user): def _ccpo_view(self, user):
requests = Requests.get_many() requests = Requests.get_many()

View File

@ -23,6 +23,10 @@ export default {
type: Array, type: Array,
default: [], default: [],
}, },
dodComponents: {
type: Array,
default: [],
}
}, },
data: function () { data: function () {
@ -76,6 +80,7 @@ export default {
return { return {
searchValue: '', searchValue: '',
statusValue: '', statusValue: '',
dodComponentValue: '',
sort: { sort: {
columnName: '', columnName: '',
isAscending: true isAscending: true
@ -88,7 +93,7 @@ export default {
filteredRequests: function () { filteredRequests: function () {
return pipe( return pipe(
partial(this.applySearch, [this.searchValue]), partial(this.applySearch, [this.searchValue]),
partial(this.applyFilters, [this.statusValue]), partial(this.applyFilters, [this.statusValue, this.dodComponentValue]),
partial(this.applySort, [this.sort]), partial(this.applySort, [this.sort]),
)(this.requests) )(this.requests)
} }
@ -106,11 +111,15 @@ export default {
true true
) )
}, },
applyFilters: (status, requests) => { applyFilters: (status, dodComponent, requests) => {
return requests.filter( return requests.filter(
(request) => status !== '' ? (request) => status !== '' ?
request.status === status : request.status === status :
true true
).filter(
(request) => dodComponent !== '' ?
request.dod_component === dodComponent :
true
) )
}, },
applySort: function(sort, requests) { applySort: function(sort, requests) {

View File

@ -6,40 +6,45 @@
padding: $gap; padding: $gap;
flex-wrap: wrap; flex-wrap: wrap;
@media (min-width:1000px) {
flex-wrap: nowrap;
}
.usa-input { .usa-input {
margin: 0; margin: $gap 0 0 $gap;
flex-grow: 1;
flex-shrink: 0;
flex-basis: 100%;
height: $search-input-height; height: $search-input-height;
position: relative; position: relative;
margin-top: $gap;
@include media($large-screen) {
flex-shrink: 1;
flex-basis: auto;
margin-top: 0;
margin-left: $gap;
}
label { label {
@include hide; @include hide;
} }
}
.search-bar__filters {
display: flex;
flex: 1;
flex-grow: 1;
flex-basis: 100%;
.usa-input {
@media (min-width:1000px) {
margin-top: 0;
}
&:first-child { &:first-child {
margin-left: 0; margin-left: 0;
margin-top: 0;
@media (min-width:1000px) {
margin-left: $gap;
}
}
} }
} }
.search-input { .search-input {
@include media($medium-screen) { margin-left: 0;
flex-basis: 50%; margin-top: 0;
} flex-basis: 100%;
@media (min-width:800px) and (max-width:900px) {
flex-basis: auto;
}
input[type='search'] { input[type='search'] {
width: auto; width: auto;

View File

@ -37,7 +37,13 @@
</div> </div>
{% endcall %} {% endcall %}
<requests-list inline-template v-bind:requests='{{ requests | tojson }}' v-bind:is-extended='{{ extended_view | tojson }}' v-bind:statuses='{{ possible_statuses | tojson }}'> <requests-list
inline-template
v-bind:requests='{{ requests | tojson }}'
v-bind:is-extended='{{ extended_view | tojson }}'
v-bind:statuses='{{ possible_statuses | tojson }}'
v-bind:dod-components='{{ possible_dod_components | tojson }}'
>
<div> <div>
{% if num_action_required %} {% if num_action_required %}
@ -88,6 +94,7 @@
</button> </button>
</div> </div>
<div class="search-bar__filters">
<div class='usa-input'> <div class='usa-input'>
<label for='filter-status'>Filter requests by status</label> <label for='filter-status'>Filter requests by status</label>
<select v-model="statusValue" id="filter-status" name="filter-status"> <select v-model="statusValue" id="filter-status" name="filter-status">
@ -96,6 +103,16 @@
<option v-for="status in statuses" :value="status">!{ status }</option> <option v-for="status in statuses" :value="status">!{ status }</option>
</select> </select>
</div> </div>
<div class='usa-input'>
<label for='filter-dod-component'>Filter requests by DOD component</label>
<select v-model="dodComponentValue" id="filter-dod-component" name="filter-dod-component">
<option value="" selected disabled>Filter by DOD Component</option>
<option value="">All</option>
<option v-for="dodComponent in dodComponents" :value="dodComponent">!{ dodComponent }</option>
</select>
</div>
</div>
</form> </form>
{% endif %} {% endif %}