quantitative descriptions
@@ -17,6 +21,22 @@ var ItemWithDetailsPage = React.createClass({
) ;
+ },
+
+ // Add change listeners to stores
+ componentDidMount: function() {
+ ItemStore.addChangeListener(this._onChange);
+ ItemActions.loadFrontPageItems();
+ },
+
+ _onChange: function () {
+ this.setState({
+ item: ItemStore.getSelectedItem()
+ });
+ },
+
+ getInitialState: function () {
+ return { item: ItemStore.getSelectedItem() };
}
});
diff --git a/front-ui/app/components/singleItem.js b/front-ui/app/components/singleItem.js
index 62a336b..a573fe3 100644
--- a/front-ui/app/components/singleItem.js
+++ b/front-ui/app/components/singleItem.js
@@ -1,4 +1,5 @@
var React = require('react');
+var ItemActions = require('../actions/itemActions');
@@ -9,24 +10,19 @@ var SingleItem = React.createClass({
render: function() {
var self = this;
var itemClick = this.itemClick;
- var firstImage = this.state.item.get('multi_media_descriptions')[0];
+ var firstImage = this.props.item.get('multi_media_descriptions')[0];
firstImage = firstImage || { url: "http://res.cloudinary.com/lfvt7ps2n/image/upload/c_crop,g_center,w_300/v1421732950/http_www.asms.ru_bitrix_templates_main_images_nophoto_irnofq.png" } ;
return (

-
{ this.state.item.get('name') }
-
{ this.state.item.get('list_price') } KM
+
{ this.props.item.get('name') }
+
{ this.props.item.get('list_price') } KM
);
},
- getInitialState: function () {
- return { item: this.props.item };
- },
itemClick: function(e) {
- if(this.props.itemClick) {
- this.props.itemClick(this.state.item, e);
- }
+ ItemActions.selectItem(this.props.item);
}
});
diff --git a/front-ui/app/constants/itemConstants.js b/front-ui/app/constants/itemConstants.js
new file mode 100644
index 0000000..2abf6a5
--- /dev/null
+++ b/front-ui/app/constants/itemConstants.js
@@ -0,0 +1,7 @@
+var keyMirror = require('react/lib/keyMirror');
+
+// Define action constants
+module.exports = keyMirror({
+ SELECT_ITEM: null,
+ LOAD_FOR_FRONTPAGE: null
+});
\ No newline at end of file
diff --git a/front-ui/app/dispatcher/appDispatcher.js b/front-ui/app/dispatcher/appDispatcher.js
new file mode 100644
index 0000000..79eff8f
--- /dev/null
+++ b/front-ui/app/dispatcher/appDispatcher.js
@@ -0,0 +1,14 @@
+var Dispatcher = require('flux').Dispatcher;
+
+// Create dispatcher instance
+var AppDispatcher = new Dispatcher();
+
+// Convenience method to handle dispatch requests
+AppDispatcher.handleAction = function(action) {
+ this.dispatch({
+ source: 'VIEW_ACTION',
+ action: action
+ });
+}
+
+module.exports = AppDispatcher;
\ No newline at end of file
diff --git a/front-ui/app/models/itemWithDetails.js b/front-ui/app/models/itemWithDetails.js
index 0883cf7..02df3be 100644
--- a/front-ui/app/models/itemWithDetails.js
+++ b/front-ui/app/models/itemWithDetails.js
@@ -2,7 +2,7 @@ var Backbone = require('backbone');
var Globals = require('../globals');
var ItemWithDetails = Backbone.Model.extend({
- urlRoot : Globals.ApiUrl + '/item'
+ urlRoot : Globals.ApiUrl + '/item'
});
module.exports = ItemWithDetails;
diff --git a/front-ui/app/stores/itemStore.js b/front-ui/app/stores/itemStore.js
new file mode 100644
index 0000000..4f3ee03
--- /dev/null
+++ b/front-ui/app/stores/itemStore.js
@@ -0,0 +1,95 @@
+var AppDispatcher = require('../dispatcher/appDispatcher');
+var EventEmitter = require('events').EventEmitter;
+var ItemConstants = require('../constants/itemConstants');
+var ItemCollection = require('../models/itemCollection');
+var ItemWithDetails = require('../models/itemWithDetails')
+var _ = require('underscore');
+
+// Define initial data points
+var _items = new ItemCollection(), _selectedItem = new ItemWithDetails();
+
+
+var loadItemsForFrontpage = function() {
+ items = _items
+ items.setClassificationType(0);
+ items.setLimit(30);
+ items.setOffset(0);
+
+ items.fetch({success: function() {
+ ItemStore.emitChange();
+ }});
+};
+
+var setSelected = function(id) {
+ var item = new ItemWithDetails({id: this.itemId });
+ item.fetch({
+ success: function() {
+ _selectedItem = item;
+ ItemStore.emitChange();
+ }
+ }
+ );
+}
+
+
+// Extend ItemStore with EventEmitter to add eventing capabilities
+var ItemStore = _.extend({}, EventEmitter.prototype, {
+
+ // Return Single Item With Details
+ getSelectedItem: function() {
+ return _selectedItem;
+ },
+
+ // Return All Items
+ getItems: function() {
+ return _items;
+ },
+
+ // Emit Change event
+ emitChange: function() {
+ console.log("Emitting change!");
+ this.emit('change');
+ },
+
+ // Add change listener
+ addChangeListener: function(callback) {
+ this.on('change', callback);
+ },
+
+ // Remove change listener
+ removeChangeListener: function(callback) {
+ this.removeListener('change', callback);
+ }
+
+});
+
+// Register callback with AppDispatcher
+AppDispatcher.register(function(payload) {
+ var action = payload.action;
+ var text;
+
+ switch(action.actionType) {
+
+ // Respond to SELECT_ITEM action
+ case ItemConstants.SELECT_ITEM:
+ setSelected(action.item.id);
+ // TODO: this does not belong here - update when react router becommes available
+ RIBICA.App.router.navigate(action.item.getFrontEndUrl(), {'trigger': true});
+
+ break;
+
+ case ItemConstants.LOAD_FOR_FRONTPAGE:
+ loadItemsForFrontpage();
+ break;
+
+ default:
+ return true;
+ }
+
+ // If action was responded to, emit change event
+ ItemStore.emitChange();
+ return true;
+
+});
+
+module.exports = ItemStore;
\ No newline at end of file
diff --git a/front-ui/app/views/itemDetailsView.js b/front-ui/app/views/itemDetailsView.js
index 6d14703..6490b49 100644
--- a/front-ui/app/views/itemDetailsView.js
+++ b/front-ui/app/views/itemDetailsView.js
@@ -1,6 +1,5 @@
var Backbone = require('backbone'),
React = require('react'),
- ItemWithDetails = require('../models/itemWithDetails'),
ItemWithDetailsPage = require('../components/itemWithDetailsPage');
var ItemDetailsView = Backbone.View.extend({
@@ -13,16 +12,9 @@ var ItemDetailsView = Backbone.View.extend({
render: function() {
var self = this;
this.$el.html(this.template);
- var item = new ItemWithDetails({id: this.itemId });
- console.log(item);
-
- item.fetch({success: function() {
- React.render(new ItemWithDetailsPage({
- item: item
- }),
- self.$('.item-details-container').get(0));
- }
- });
+
+ React.render(
, self.$('.item-details-container').get(0));
+
return this;
}
});
diff --git a/front-ui/app/views/startPageItemsView.js b/front-ui/app/views/startPageItemsView.js
index 5c96f25..b5f6da9 100644
--- a/front-ui/app/views/startPageItemsView.js
+++ b/front-ui/app/views/startPageItemsView.js
@@ -1,9 +1,7 @@
var Backbone = require('backbone'),
React = require('react'),
- ItemList = require('../components/itemList'),
- ItemCollection = require('../models/itemCollection'),
- Item = require('../models/item'),
- Router = require('../router');
+ AllItems = require('../components/allItems'),
+ ItemActions = require('../actions/itemActions');
var StartPageItemsView = Backbone.View.extend({
el: '#content',
@@ -13,29 +11,9 @@ var StartPageItemsView = Backbone.View.extend({
},
render: function() {
this.$el.html(this.template);
- var items = new ItemCollection();
- items.setClassificationType(0);
- items.setLimit(30);
- items.setOffset(0);
- var self = this;
- items.fetch({success: function() {
-
- // var resultItems = items.map(function (a) { return a.attributes });
- React.render(new ItemList({
- items: items,
- itemClick: self.itemClick
- }),
- self.$('.item-list-container').get(0));
-
- }});
+ ItemActions.loadFrontPageItems();
+ React.render(
, self.$('.item-list-container').get(0));
return this;
- },
- itemClick: function(item) {
-
- // not sure if there is a better way to access the app object
- // TODO: if found replace it !
- RIBICA.App.router.navigate(item.getFrontEndUrl(), {'trigger': true});
-
}
});
diff --git a/front-ui/package.json b/front-ui/package.json
index a2fa5b8..3b49d78 100644
--- a/front-ui/package.json
+++ b/front-ui/package.json
@@ -10,6 +10,8 @@
"license": "BSD-2-Clause",
"devDependencies": {
"browserify": "~8.1.0",
+ "events": "^1.0.2",
+ "flux": "^2.0.1",
"grunt": "~0.4.5",
"grunt-browserify": "~3.2.1",
"grunt-cli": "~0.1.13",
@@ -18,7 +20,8 @@
"grunt-contrib-uglify": "~0.7.0",
"grunt-contrib-watch": "~0.6.1",
"merry-go-round": "^0.1.1",
- "reactify": "~0.17.1"
+ "reactify": "~0.17.1",
+ "underscore": "^1.7.0"
},
"dependencies": {
"react": "~0.12.2",