Skip to content

Commit

Permalink
Feature/browse redux (#316)
Browse files Browse the repository at this point in the history
* poring browse to redux

* fixing up search

* adding dynamic count

* adding correct logic for pagination

* adding some css for pagination

* fixing up mini-browse

* make sure the qs has the defaults

* moving search and filter to there other component

* adding a reset button and better styles for the filters

* removing debug

* removing loading page from browse container

* adding ordering

* removing totals from sorting

* adding custom reducer to browse

* loading state as a history object

* saving cache

* centering pagination

* updating code quility

* adding dynamic link generation

* removing onClick func

* fixing searching

* refactoring search bar

* adding history to filter stores

* updating filter Ui and fixing pagination

* adding loading to reducers

* saving browse section overhall

* fixing issue with apis being called when they shouldnt

* fixing up browse

* adding active links to pagination

* adding basic multi select support

* fixing issue with flashing UI

* adding multi select to filters

* saving

* fixing algorithm for multi select

* adding flag for multi select filters

* updating merge conflicts

* cleaning up the filters more

* adding css styles for mobile

* adding prop types to browse

* adding some basic tests

* fixing list recipes locaiton in mini browse

* more tests

* creating some place holder tests

* up

* removing bad tests

* more back the side bar

* getting more side bar stuff working

* configuring bootstrap columns

* redesigning filters

* redesigning filters

* adding mobile dropdown

* adding state to dropdown menu

* adding bootstrap cols for mobile layout

* fixing issues causing the filters to flash

* cleaning up the placement of the clear search button and recipe count

* saving

* fixing up desktop UI

* adding reset filter for mobile
  • Loading branch information
RyanNoelk authored Jan 24, 2018
1 parent 1c11204 commit 9acbda5
Show file tree
Hide file tree
Showing 37 changed files with 1,128 additions and 783 deletions.
37 changes: 26 additions & 11 deletions api/v1/recipe/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,31 @@ class RecipeViewSet(viewsets.ModelViewSet):
"""
serializer_class = serializers.RecipeSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter)
filter_fields = ('course__slug', 'cuisine__slug', 'course', 'cuisine', 'title', 'rating')
filter_backends = (filters.DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
search_fields = ('title', 'tags__title', 'ingredient_groups__ingredients__title')
ordering_fields = ('pub_date', 'title', 'rating', )

def get_queryset(self):
query = Recipe.objects
filter_set = {}

# If user is anonymous, restrict recipes to public.
if self.request.user.is_authenticated:
return Recipe.objects.all()
else:
return Recipe.objects.filter(public=True)
if not self.request.user.is_authenticated:
filter_set['public'] = True

if 'cuisine__slug' in self.request.query_params:
filter_set['cuisine__in'] = Cuisine.objects.filter(
slug__in=self.request.query_params.get('cuisine__slug').split(',')
)

if 'course__slug' in self.request.query_params:
filter_set['course__in'] = Course.objects.filter(
slug__in=self.request.query_params.get('course__slug').split(',')
)
if 'rating' in self.request.query_params:
filter_set['rating__in'] = self.request.query_params.get('rating').split(',')

return query.filter(**filter_set)

def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
Expand Down Expand Up @@ -107,20 +122,20 @@ def get_queryset(self):

# If user is anonymous, restrict recipes to public.
if not self.request.user.is_authenticated:
filter_set['public']=True
filter_set['public'] = True

if 'cuisine' in self.request.query_params:
try:
filter_set['cuisine'] = Cuisine.objects.get(
slug=self.request.query_params.get('cuisine')
filter_set['cuisine__in'] = Cuisine.objects.filter(
slug__in=self.request.query_params.get('cuisine').split(',')
)
except:
return []

if 'course' in self.request.query_params:
try:
filter_set['course'] = Course.objects.get(
slug=self.request.query_params.get('course')
filter_set['course__in'] = Course.objects.filter(
slug__in=self.request.query_params.get('course').split(',')
)
except:
return []
Expand Down
16 changes: 8 additions & 8 deletions api/v1/recipe_groups/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,18 @@ def get_queryset(self):

# If user is anonymous, restrict recipes to public.
if not self.request.user.is_authenticated:
filter_set['public']=True
filter_set['public'] = True

if 'course' in self.request.query_params:
try:
filter_set['course'] = Course.objects.get(
slug=self.request.query_params.get('course')
filter_set['course__in'] = Course.objects.filter(
slug__in=self.request.query_params.get('course').split(',')
)
except:
return []

if 'rating' in self.request.query_params:
filter_set['rating'] = self.request.query_params.get('rating')
filter_set['rating__in'] = self.request.query_params.get('rating').split(',')

if 'search' in self.request.query_params:
query = get_search_results(
Expand Down Expand Up @@ -102,18 +102,18 @@ def get_queryset(self):

# If user is anonymous, restrict recipes to public.
if not self.request.user.is_authenticated:
filter_set['public']=True
filter_set['public'] = True

if 'cuisine' in self.request.query_params:
try:
filter_set['cuisine'] = Cuisine.objects.get(
slug=self.request.query_params.get('cuisine')
filter_set['cuisine__in'] = Cuisine.objects.filter(
slug__in=self.request.query_params.get('cuisine').split(',')
)
except:
return []

if 'rating' in self.request.query_params:
filter_set['rating'] = self.request.query_params.get('rating')
filter_set['rating__in'] = self.request.query_params.get('rating').split(',')

if 'search' in self.request.query_params:
query = get_search_results(
Expand Down
98 changes: 0 additions & 98 deletions frontend/modules/browse/actions/BrowseActions.js

This file was deleted.

96 changes: 96 additions & 0 deletions frontend/modules/browse/actions/FilterActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import queryString from 'query-string'

import { request } from '../../common/CustomSuperagent';
import { serverURLs } from '../../common/config'
import FilterConstants from '../constants/FilterConstants'

const parsedFilter = filter => {
let parsedFilters = {};
for (let f in filter) {
if (!['limit', 'offset'].includes(f)) {
parsedFilters[f] = filter[f];
}
}
return parsedFilters;
};

export const loadCourses = (filter) => {
return dispatch => {
dispatch({
type: FilterConstants.BROWSE_FILTER_LOADING,
filterName: FilterConstants.BROWSE_FILTER_COURSE,
});

request()
.get(serverURLs.course_count)
.query(parsedFilter(filter))
.then(res => (
dispatch({
type: FilterConstants.BROWSE_FILTER_LOAD,
filterName: FilterConstants.BROWSE_FILTER_COURSE,
qs: queryString.stringify(filter),
res: res.body.results
})
))
.catch(err => (
dispatch({
type: FilterConstants.BROWSE_FILTER_ERROR,
filterName: FilterConstants.BROWSE_FILTER_COURSE,
})
));
}
};

export const loadCuisines = (filter) => {
return dispatch => {
dispatch({
type: FilterConstants.BROWSE_FILTER_LOADING,
filterName: FilterConstants.BROWSE_FILTER_CUISINE,
});

request()
.get(serverURLs.cuisine_count)
.query(parsedFilter(filter))
.then(res => (
dispatch({
type: FilterConstants.BROWSE_FILTER_LOAD,
filterName: FilterConstants.BROWSE_FILTER_CUISINE,
qs: queryString.stringify(filter),
res: res.body.results
})
))
.catch(err => (
dispatch({
type: FilterConstants.BROWSE_FILTER_ERROR,
filterName: FilterConstants.BROWSE_FILTER_CUISINE,
})
));
}
};

export const loadRatings = (filter) => {
return dispatch => {
dispatch({
type: FilterConstants.BROWSE_FILTER_LOADING,
filterName: FilterConstants.BROWSE_FILTER_RATING,
});

request()
.get(serverURLs.ratings)
.query(parsedFilter(filter))
.then(res => (
dispatch({
type: FilterConstants.BROWSE_FILTER_LOAD,
filterName: FilterConstants.BROWSE_FILTER_RATING,
qs: queryString.stringify(filter),
res: res.body.results
})
))
.catch(err => (
dispatch({
type: FilterConstants.BROWSE_FILTER_ERROR,
filterName: FilterConstants.BROWSE_FILTER_RATING,
})
));
}
};
34 changes: 34 additions & 0 deletions frontend/modules/browse/actions/SearchActions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import queryString from 'query-string'

import SearchConstants from '../constants/SearchConstants'
import { request } from '../../common/CustomSuperagent';
import { serverURLs } from '../../common/config'

export const loadRecipes = (filter) => {
return dispatch => {
dispatch({ type: SearchConstants.BROWSE_SEARCH_LOADING });

const map = {
'cuisine': 'cuisine__slug',
'course': 'course__slug'
};

let parsedFilter = {};
for (let f in filter) {
if (filter[f] !== null) {
parsedFilter[f in map ? map[f] : f] = filter[f];
}
}

request()
.get(serverURLs.browse)
.query(parsedFilter)
.then(res => (
dispatch({
type: SearchConstants.BROWSE_SEARCH_RESULTS,
qs: queryString.stringify(filter),
res: res.body
})
));
}
};
Loading

0 comments on commit 9acbda5

Please sign in to comment.