From 51dbd620268674f12c5fe4b28d940714c0323d9e Mon Sep 17 00:00:00 2001 From: kellynvd Date: Mon, 20 Jan 2020 15:50:35 -0300 Subject: [PATCH] Add city filter to Adoption page Refs #114 --- app/controllers/v1/pets_for_adoption_controller.rb | 1 + app/javascript/actions/adoptionFilters.js | 8 +++++++- .../containers/AdoptionList/AdoptionList.jsx | 5 +++++ .../AdoptionList/FilterBox/AdoptionFilterBox.jsx | 11 +++++++++-- app/javascript/reducers/adoptionFilters.js | 8 +++++++- app/models/pet.rb | 1 + 6 files changed, 30 insertions(+), 4 deletions(-) diff --git a/app/controllers/v1/pets_for_adoption_controller.rb b/app/controllers/v1/pets_for_adoption_controller.rb index 116c7082..7de6b092 100644 --- a/app/controllers/v1/pets_for_adoption_controller.rb +++ b/app/controllers/v1/pets_for_adoption_controller.rb @@ -5,6 +5,7 @@ def index pets = Pet.active pets = pets.by_sex(params[:sex]) if params[:sex].present? pets = pets.by_description(params[:description]) if params[:description].present? + pets = pets.by_city(params[:city]) if params[:city].present? render json: { pets: ListPets.new.all(pets, params[:user_email]) diff --git a/app/javascript/actions/adoptionFilters.js b/app/javascript/actions/adoptionFilters.js index 773af5e8..d2336b37 100644 --- a/app/javascript/actions/adoptionFilters.js +++ b/app/javascript/actions/adoptionFilters.js @@ -1,6 +1,7 @@ export const types = { SET_SEX_FILTER: 'ADOPTION_FILTERS/SET_SEX_FILTER', - SET_DESCRIPTION_FILTER: 'ADOPTION_FILTERS/SET_DESCRIPTION_FILTER' + SET_DESCRIPTION_FILTER: 'ADOPTION_FILTERS/SET_DESCRIPTION_FILTER', + SET_CITY_FILTER: 'ADOPTION_FILTERS/SET_CITY_FILTER' }; export const setSexFilter = (sex = '') => ({ @@ -12,3 +13,8 @@ export const setDescriptionFilter = (description = '') => ({ type: types.SET_DESCRIPTION_FILTER, description }); + +export const setCityFilter = (city = '') => ({ + type: types.SET_CITY_FILTER, + city +}); diff --git a/app/javascript/containers/AdoptionList/AdoptionList.jsx b/app/javascript/containers/AdoptionList/AdoptionList.jsx index 69792109..050ef134 100644 --- a/app/javascript/containers/AdoptionList/AdoptionList.jsx +++ b/app/javascript/containers/AdoptionList/AdoptionList.jsx @@ -14,6 +14,7 @@ export function fetchPetsForAdoption() { const userEmail = getState().app.user.email; const sex = getState().adoptionFilters.sex; const description = getState().adoptionFilters.description; + const city = getState().adoptionFilters.city; dispatch({type: GET_ADOPTION_REQUEST}); let params = []; @@ -28,6 +29,10 @@ export function fetchPetsForAdoption() { params.push(`description=${description}`); } + if (city) { + params.push(`city=${city}`); + } + const urlParams = params.join('&'); return ( diff --git a/app/javascript/containers/AdoptionList/FilterBox/AdoptionFilterBox.jsx b/app/javascript/containers/AdoptionList/FilterBox/AdoptionFilterBox.jsx index 7507e547..a168df7c 100644 --- a/app/javascript/containers/AdoptionList/FilterBox/AdoptionFilterBox.jsx +++ b/app/javascript/containers/AdoptionList/FilterBox/AdoptionFilterBox.jsx @@ -5,7 +5,7 @@ import TextInput from "../../../components/TextInput/TextInput"; import Button from "../../../components/Button/Button"; import {createStructuredSelector} from "reselect"; import {connect} from "react-redux"; -import { setSexFilter, setDescriptionFilter } from '../../../actions/adoptionFilters'; +import { setSexFilter, setDescriptionFilter, setCityFilter } from '../../../actions/adoptionFilters'; import { fetchPetsForAdoption } from '../AdoptionList' const GET_NGO_CITIES_REQUEST = 'GET_NGO_CITIES_REQUEST'; @@ -42,6 +42,10 @@ class AdoptionFilterBox extends React.Component { this.props.setDescriptionFilter(e.target.value); }; + onCityChange = (e) => { + this.props.setCityFilter(e.target.value); + }; + render() { const cities = this.props; return ( @@ -52,6 +56,8 @@ class AdoptionFilterBox extends React.Component { width='200px' marginRight='20px' options={cities.cities} + value={this.props.adoptionFilters.city} + onChange={this.onCityChange} /> { @@ -17,6 +18,11 @@ export default (state = adoptionFiltersReducerDefaultState, action) => { ...state, description: action.description }; + case types.SET_CITY_FILTER: + return { + ...state, + city: action.city + }; default: return state; } diff --git a/app/models/pet.rb b/app/models/pet.rb index f38b44ad..fd7fe9ac 100644 --- a/app/models/pet.rb +++ b/app/models/pet.rb @@ -14,6 +14,7 @@ class Pet < ApplicationRecord scope :active, -> { where(active: true) } scope :by_sex, ->(sex) { where(sex: sex) } scope :by_description, ->(description) { where('description LIKE ?', "%#{description}%") } + scope :by_city, ->(city) { includes(:ngo).where(ngos: { city: city }) } def days_ago created_at