diff --git a/app/controllers/v1/pets_for_adoption_controller.rb b/app/controllers/v1/pets_for_adoption_controller.rb index 7de6b092..15ca10ec 100644 --- a/app/controllers/v1/pets_for_adoption_controller.rb +++ b/app/controllers/v1/pets_for_adoption_controller.rb @@ -6,6 +6,7 @@ def index 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? + pets = pets.by_ngo_id(params[:ngo_id]) if params[:ngo_id].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 d2336b37..11da5ef4 100644 --- a/app/javascript/actions/adoptionFilters.js +++ b/app/javascript/actions/adoptionFilters.js @@ -1,7 +1,8 @@ export const types = { SET_SEX_FILTER: 'ADOPTION_FILTERS/SET_SEX_FILTER', SET_DESCRIPTION_FILTER: 'ADOPTION_FILTERS/SET_DESCRIPTION_FILTER', - SET_CITY_FILTER: 'ADOPTION_FILTERS/SET_CITY_FILTER' + SET_CITY_FILTER: 'ADOPTION_FILTERS/SET_CITY_FILTER', + SET_NGO_ID_FILTER: 'ADOPTION_FILTERS/SET_NGO_ID_FILTER' }; export const setSexFilter = (sex = '') => ({ @@ -18,3 +19,8 @@ export const setCityFilter = (city = '') => ({ type: types.SET_CITY_FILTER, city }); + +export const setNgoIdFilter = (ngo_id = '') => ({ + type: types.SET_NGO_ID_FILTER, + ngo_id +}); diff --git a/app/javascript/configureStore.js b/app/javascript/configureStore.js index ec90103c..90ea693e 100644 --- a/app/javascript/configureStore.js +++ b/app/javascript/configureStore.js @@ -5,6 +5,8 @@ import adoptionFiltersReducer from './reducers/adoptionFilters' const appReducerDefaultState = { user: { email: null, group: null }, + ngos: [], + pets: [] }; function appReducer(state = appReducerDefaultState, action) { @@ -28,7 +30,7 @@ const rootReducer = combineReducers({ }); export default function configureStore(user) { - const preloadedState = { app: { user } }; + const preloadedState = { app: { ...appReducerDefaultState, user } }; const store = createStore( rootReducer, diff --git a/app/javascript/containers/AdoptionList/AdoptionList.jsx b/app/javascript/containers/AdoptionList/AdoptionList.jsx index 050ef134..f847424c 100644 --- a/app/javascript/containers/AdoptionList/AdoptionList.jsx +++ b/app/javascript/containers/AdoptionList/AdoptionList.jsx @@ -15,6 +15,7 @@ export function fetchPetsForAdoption() { const sex = getState().adoptionFilters.sex; const description = getState().adoptionFilters.description; const city = getState().adoptionFilters.city; + const ngo_id = getState().adoptionFilters.ngo_id; dispatch({type: GET_ADOPTION_REQUEST}); let params = []; @@ -33,6 +34,10 @@ export function fetchPetsForAdoption() { params.push(`city=${city}`); } + if (ngo_id) { + params.push(`ngo_id=${ngo_id}`); + } + const urlParams = params.join('&'); return ( diff --git a/app/javascript/containers/AdoptionList/FilterBox/AdoptionFilterBox.jsx b/app/javascript/containers/AdoptionList/FilterBox/AdoptionFilterBox.jsx index a168df7c..c739a84c 100644 --- a/app/javascript/containers/AdoptionList/FilterBox/AdoptionFilterBox.jsx +++ b/app/javascript/containers/AdoptionList/FilterBox/AdoptionFilterBox.jsx @@ -5,8 +5,9 @@ import TextInput from "../../../components/TextInput/TextInput"; import Button from "../../../components/Button/Button"; import {createStructuredSelector} from "reselect"; import {connect} from "react-redux"; -import { setSexFilter, setDescriptionFilter, setCityFilter } from '../../../actions/adoptionFilters'; +import { setSexFilter, setDescriptionFilter, setCityFilter, setNgoIdFilter } from '../../../actions/adoptionFilters'; import { fetchPetsForAdoption } from '../AdoptionList' +import { fetchNgos } from '../../NgosList' const GET_NGO_CITIES_REQUEST = 'GET_NGO_CITIES_REQUEST'; const GET_NGO_CITIES_SUCCESS = 'GET_NGO_CITIES_SUCCESS'; @@ -30,7 +31,8 @@ export function fetchCitiesForAdoptionSuccess(json) { class AdoptionFilterBox extends React.Component { componentWillMount() { - const {fetchCitiesForAdoption} = this.props; + const {fetchCitiesForAdoption, fetchNgos} = this.props; + fetchNgos(); fetchCitiesForAdoption(); } @@ -40,14 +42,22 @@ class AdoptionFilterBox extends React.Component { onDescriptionChange = (e) => { this.props.setDescriptionFilter(e.target.value); - }; + }; onCityChange = (e) => { - this.props.setCityFilter(e.target.value); - }; + this.props.setCityFilter(e.target.value); + }; + + onNgoChange = (e) => { + this.props.setNgoIdFilter(e.target.value); + }; + render() { - const cities = this.props; + const { cities, ngos } = this.props; + + const ngoOptions = ngos.map(ngo => ({ id: ngo.id, name: ngo.fantasy_name })); + return (