From 3986ac340cfe693269638a387b6616e6725cbd5f Mon Sep 17 00:00:00 2001 From: Edin Dazdarevic Date: Wed, 11 Feb 2015 07:11:28 +0100 Subject: [PATCH] changed itemcollection to support filtering by traits --- front-ui/app/actions/itemActions.js | 5 ++-- .../app/components/browsing/byCategory.js | 6 ++-- front-ui/app/models/itemCollection.js | 30 +++++++++++++++---- front-ui/app/stores/itemStore.js | 10 +++++-- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/front-ui/app/actions/itemActions.js b/front-ui/app/actions/itemActions.js index e24752d..3a892a6 100644 --- a/front-ui/app/actions/itemActions.js +++ b/front-ui/app/actions/itemActions.js @@ -4,10 +4,11 @@ var ItemConstants = require('../constants/itemConstants'); // Define action methods var ItemActions = { - loadByCategory: function(categoryId) { + loadByCategory: function(categoryId, query) { AppDispatcher.handleAction({ actionType: ItemConstants.LOAD_BY_CATEGORY, - categoryId : categoryId + categoryId : categoryId, + query : query }); }, diff --git a/front-ui/app/components/browsing/byCategory.js b/front-ui/app/components/browsing/byCategory.js index 19e71db..f6f2c24 100644 --- a/front-ui/app/components/browsing/byCategory.js +++ b/front-ui/app/components/browsing/byCategory.js @@ -25,7 +25,6 @@ var ByCategory = React.createClass({ var q = {}; q[fc.field_name] = fcv.filter_value; - // TODO: fix this, clean this up var section = new Section(this.state.category.get('section')); var category = this.state.category; NavigationActions.goToCategory(category, section, q) @@ -70,12 +69,13 @@ var ByCategory = React.createClass({ }, componentWillReceiveProps: function() { var categoryId = this.getParams().id; - ItemActions.loadByCategory(categoryId); + ItemActions.loadByCategory(categoryId, this.getQuery()); CategoryActions.loadCategoryDetails(categoryId); }, componentDidMount: function() { var categoryId = this.getParams().id; - ItemActions.loadByCategory(categoryId); + ItemActions.loadByCategory(categoryId, this.getQuery()); + CategoryActions.loadCategoryDetails(categoryId); ItemStore.addChangeListener(this._onChange); diff --git a/front-ui/app/models/itemCollection.js b/front-ui/app/models/itemCollection.js index f363e02..ad902c4 100644 --- a/front-ui/app/models/itemCollection.js +++ b/front-ui/app/models/itemCollection.js @@ -4,6 +4,10 @@ var Backbone = require('backbone'), var ItemCollection = Backbone.Collection.extend({ + addFilter : function(name, value) { + this.filters = this.filters || {}; + this.filters[name] = value; + }, setLimit: function(limit) { this.queryLimit = limit; }, @@ -24,14 +28,28 @@ var ItemCollection = Backbone.Collection.extend({ model: Item, url: function() { - var path = '/item' + var path = '/item' if(this.classificationType > 0) { - // eg. http://localhost:4567/item/section/1/offset/0/limit/10 - var urlPart = this.classificationTypeUrlParts[this.classificationType]; - path += "/" + urlPart + "/" + this.classificationId + // eg. http://localhost:4567/item/section/1/offset/0/limit/10 + var urlPart = this.classificationTypeUrlParts[this.classificationType]; + path += "/" + urlPart + "/" + this.classificationId; } // else eg. http://localhost:4567/item/offset/0/limit/10 - path += "/offset/" + this.offset + "/limit/" + this.queryLimit; - return Globals.ApiUrl + path; + path += "/offset/" + this.offset + "/limit/" + this.queryLimit; + + var queryParts = []; + + for(var key in this.filters) { + if (this.filters.hasOwnProperty(key)) { + queryParts.push(key + '=' + this.filters[key]); + } + } + var query = ''; + + if (queryParts.length > 0) { + query = '?' + queryParts.join('&'); + } + + return Globals.ApiUrl + path + query; } }); diff --git a/front-ui/app/stores/itemStore.js b/front-ui/app/stores/itemStore.js index f8a8da4..2573ac7 100644 --- a/front-ui/app/stores/itemStore.js +++ b/front-ui/app/stores/itemStore.js @@ -51,13 +51,19 @@ var fetchItemWithDetails = function() { } } -var fetchItemsByCategory = function(categoryId) { +var fetchItemsByCategory = function(categoryId, query) { var items = _itemsByCategory; items.setClassificationType(2); items.setClassificationId(categoryId); items.setLimit(30); items.setOffset(0); + for(var key in query) { + if (query.hasOwnProperty(key)) { + items.addFilter(key, query[key]); + } + } + items.fetch({ success: function() { ItemStore.emitChange(); @@ -140,7 +146,7 @@ AppDispatcher.register(function(payload) { loadItemsForFrontpage(); break; case ItemConstants.LOAD_BY_CATEGORY: - fetchItemsByCategory(action.categoryId); + fetchItemsByCategory(action.categoryId, action.query); break; default: