From 2c0e17cb977a1e8782799b337df8b1583d019906 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Mon, 12 Oct 2015 22:36:01 +0200 Subject: bootstraping react --- src/web/js/stores/MenuStore.js | 56 +++++++++++++++++ src/web/js/stores/MiddlePanelStore.js | 68 ++++++++++++++++++++ src/web/js/stores/__tests__/TodoStore-test.js | 90 +++++++++++++++++++++++++++ 3 files changed, 214 insertions(+) create mode 100644 src/web/js/stores/MenuStore.js create mode 100644 src/web/js/stores/MiddlePanelStore.js create mode 100644 src/web/js/stores/__tests__/TodoStore-test.js (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js new file mode 100644 index 00000000..d7478091 --- /dev/null +++ b/src/web/js/stores/MenuStore.js @@ -0,0 +1,56 @@ +var JarrDispatcher = require('../dispatcher/JarrDispatcher'); +var MenuActionTypes = require('../constants/JarrConstants').MenuActionTypes; +var EventEmitter = require('events').EventEmitter; +var CHANGE_EVENT = 'change_menu'; +var assign = require('object-assign'); + + +var MenuStore = assign({}, EventEmitter.prototype, { + _datas: {filter: 'all', categories: [], all_unread_count: 0}, + getAll: function() { + return this._datas; + }, + setFilter: function(value) { + if(this._datas.filter != value) { + this._datas.filter = value; + this.emitChange(); + } + }, + readFeedArticle: function(feed_id) { + // TODO + }, + emitChange: function() { + this.emit(CHANGE_EVENT); + }, + addChangeListener: function(callback) { + this.on(CHANGE_EVENT, callback); + }, + removeChangeListener: function(callback) { + this.removeListener(CHANGE_EVENT, callback); + }, +}); + + +MenuStore.dispatchToken = JarrDispatcher.register(function(action) { + switch(action.type) { + case MenuActionTypes.RELOAD_MENU: + MenuStore._datas['categories'] = action.categories; + MenuStore._datas['all_unread_count'] = action.all_unread_count; + MenuStore.emitChange(); + break; + case MenuActionTypes.MENU_FILTER_ALL: + MenuStore.setFilter('all'); + break; + case MenuActionTypes.MENU_FILTER_UNREAD: + MenuStore.setFilter('unread'); + break; + case MenuActionTypes.MENU_FILTER_ERROR: + MenuStore.setFilter('error'); + break; + + default: + // do nothing + } +}); + +module.exports = MenuStore; diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js new file mode 100644 index 00000000..d5744e20 --- /dev/null +++ b/src/web/js/stores/MiddlePanelStore.js @@ -0,0 +1,68 @@ +var JarrDispatcher = require('../dispatcher/JarrDispatcher'); +var MiddlePanelActionTypes = require('../constants/JarrConstants').MiddlePanelActionTypes; +var EventEmitter = require('events').EventEmitter; +var CHANGE_EVENT = 'change_middle_panel'; +var assign = require('object-assign'); + + +var MiddlePanelStore = assign({}, EventEmitter.prototype, { + _datas: {filter: 'unread', articles: [], + parent_filter_type: null, parent_filter_id: null}, + getAll: function() { + return this._datas; + }, + setFilter: function(value) { + if(this._datas.filter != value) { + this._datas.filter = value; + this.emitChange(); + } + }, + setParentFilter: function(type, value) { + if(this._datas['parent_filter_id'] != value + || this._datas['parent_filter_type'] != type) { + this._datas['parent_filter_type'] = type; + this._datas['parent_filter_id'] = value; + this.emitChange(); + } + }, + emitChange: function() { + this.emit(CHANGE_EVENT); + }, + addChangeListener: function(callback) { + this.on(CHANGE_EVENT, callback); + }, + removeChangeListener: function(callback) { + this.removeListener(CHANGE_EVENT, callback); + }, +}); + + +MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { + switch(action.type) { + case MiddlePanelActionTypes.RELOAD_MIDDLE_PANEL: + MiddlePanelStore._datas['articles'] = action.articles; + MiddlePanelStore.emitChange(); + break; + // PARENT FILTER + case MiddlePanelActionTypes.MIDDLE_PANEL_PARENT_FILTER: + MiddlePanelStore.setParentFilter(action.parent_type, + action.filter_id); + break; + // FILTER + case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER_ALL: + MiddlePanelStore.setFilter('all'); + break; + case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER_UNREAD: + MiddlePanelStore.setFilter('unread'); + break; + case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER_LIKED: + MiddlePanelStore.setFilter('liked'); + break; + + + default: + // do nothing + } +}); + +module.exports = MiddlePanelStore; diff --git a/src/web/js/stores/__tests__/TodoStore-test.js b/src/web/js/stores/__tests__/TodoStore-test.js new file mode 100644 index 00000000..6da6cd3c --- /dev/null +++ b/src/web/js/stores/__tests__/TodoStore-test.js @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2014-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * TodoStore-test + */ + +jest.dontMock('../../constants/TodoConstants'); +jest.dontMock('../TodoStore'); +jest.dontMock('object-assign'); + +describe('TodoStore', function() { + + var TodoConstants = require('../../constants/TodoConstants'); + var AppDispatcher; + var TodoStore; + var callback; + + // mock actions + var actionTodoCreate = { + actionType: TodoConstants.TODO_CREATE, + text: 'foo' + }; + var actionTodoDestroy = { + actionType: TodoConstants.TODO_DESTROY, + id: 'replace me in test' + }; + + beforeEach(function() { + AppDispatcher = require('../../dispatcher/AppDispatcher'); + TodoStore = require('../TodoStore'); + callback = AppDispatcher.register.mock.calls[0][0]; + }); + + it('registers a callback with the dispatcher', function() { + expect(AppDispatcher.register.mock.calls.length).toBe(1); + }); + + it('should initialize with no to-do items', function() { + var all = TodoStore.getAll(); + expect(all).toEqual({}); + }); + + it('creates a to-do item', function() { + callback(actionTodoCreate); + var all = TodoStore.getAll(); + var keys = Object.keys(all); + expect(keys.length).toBe(1); + expect(all[keys[0]].text).toEqual('foo'); + }); + + it('destroys a to-do item', function() { + callback(actionTodoCreate); + var all = TodoStore.getAll(); + var keys = Object.keys(all); + expect(keys.length).toBe(1); + actionTodoDestroy.id = keys[0]; + callback(actionTodoDestroy); + expect(all[keys[0]]).toBeUndefined(); + }); + + it('can determine whether all to-do items are complete', function() { + var i = 0; + for (; i < 3; i++) { + callback(actionTodoCreate); + } + expect(Object.keys(TodoStore.getAll()).length).toBe(3); + expect(TodoStore.areAllComplete()).toBe(false); + + var all = TodoStore.getAll(); + for (key in all) { + callback({ + actionType: TodoConstants.TODO_COMPLETE, + id: key + }); + } + expect(TodoStore.areAllComplete()).toBe(true); + + callback({ + actionType: TodoConstants.TODO_UNDO_COMPLETE, + id: key + }); + expect(TodoStore.areAllComplete()).toBe(false); + }); + +}); -- cgit From 41aea41aaff0886fd6c211f03db2b54863a97165 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Thu, 21 Jan 2016 13:48:06 +0100 Subject: filters are working ! --- src/web/js/stores/MiddlePanelStore.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index d5744e20..4e6e04c4 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -11,6 +11,21 @@ var MiddlePanelStore = assign({}, EventEmitter.prototype, { getAll: function() { return this._datas; }, + getArticles: function() { + var articles = []; + var key = null; + var id = null; + if (this._datas.parent_filter_type) { + key = this._datas.parent_filter_type + '_id'; + id = this._datas.parent_filter_id; + } + this._datas.articles.map(function(article) { + if(!key || article[key] == id) { + articles.push(article); + } + }); + return articles; + }, setFilter: function(value) { if(this._datas.filter != value) { this._datas.filter = value; @@ -46,7 +61,7 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { // PARENT FILTER case MiddlePanelActionTypes.MIDDLE_PANEL_PARENT_FILTER: MiddlePanelStore.setParentFilter(action.parent_type, - action.filter_id); + action.parent_id); break; // FILTER case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER_ALL: -- cgit From 00ba122b5d6b0929ba6078fc7c1d128cf6e5236e Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Fri, 22 Jan 2016 23:39:12 +0100 Subject: displaying error --- src/web/js/stores/MenuStore.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index d7478091..016b33f2 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -6,7 +6,8 @@ var assign = require('object-assign'); var MenuStore = assign({}, EventEmitter.prototype, { - _datas: {filter: 'all', categories: [], all_unread_count: 0}, + _datas: {filter: 'all', categories: [], + all_unread_count: 0, feed_in_error: false}, getAll: function() { return this._datas; }, @@ -35,6 +36,7 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { switch(action.type) { case MenuActionTypes.RELOAD_MENU: MenuStore._datas['categories'] = action.categories; + MenuStore._datas['feed_in_error'] = action.feed_in_error; MenuStore._datas['all_unread_count'] = action.all_unread_count; MenuStore.emitChange(); break; -- cgit From 94a18fbdecaa798d67a5bf7ad0f2b8ee4e0c7851 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Sat, 23 Jan 2016 03:21:41 +0100 Subject: meh, kinda works, sleep now --- src/web/js/stores/MiddlePanelStore.js | 72 +++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 32 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index 4e6e04c4..80ac8198 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -7,38 +7,51 @@ var assign = require('object-assign'); var MiddlePanelStore = assign({}, EventEmitter.prototype, { _datas: {filter: 'unread', articles: [], - parent_filter_type: null, parent_filter_id: null}, + filter_type: null, filter_id: null}, getAll: function() { return this._datas; }, + getRequestFilter: function() { + return {'filter': this._datas.filter, + 'filter_type': this._datas.filter_type, + 'filter_id': this._datas.filter_id}; + }, getArticles: function() { - var articles = []; var key = null; var id = null; - if (this._datas.parent_filter_type) { - key = this._datas.parent_filter_type + '_id'; - id = this._datas.parent_filter_id; + var filter = this._datas.filter; + if (this._datas.filter_type) { + key = this._datas.filter_type + '_id'; + id = this._datas.filter_id; } - this._datas.articles.map(function(article) { - if(!key || article[key] == id) { - articles.push(article); - } + return this._datas.articles.filter(function(article) { + return ((!key || article[key] == id) + && (filter == 'all' + || (filter == 'unread' && !article.read) + || (filter == 'liked' && article.liked))); }); - return articles; + }, + setArticles: function(articles) { + if(articles || articles == []) { + this._datas.articles = articles; + return true; + } + return false; }, setFilter: function(value) { if(this._datas.filter != value) { this._datas.filter = value; - this.emitChange(); + return true; } + return false; }, setParentFilter: function(type, value) { - if(this._datas['parent_filter_id'] != value - || this._datas['parent_filter_type'] != type) { - this._datas['parent_filter_type'] = type; - this._datas['parent_filter_id'] = value; - this.emitChange(); + if(this._datas.filter_id != value || this._datas.filter_type != type) { + this._datas.filter_type = type; + this._datas.filter_id = value; + return true; } + return false; }, emitChange: function() { this.emit(CHANGE_EVENT); @@ -53,30 +66,25 @@ var MiddlePanelStore = assign({}, EventEmitter.prototype, { MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { + var changed = false; switch(action.type) { case MiddlePanelActionTypes.RELOAD_MIDDLE_PANEL: - MiddlePanelStore._datas['articles'] = action.articles; + MiddlePanelStore.setArticles(action.articles); MiddlePanelStore.emitChange(); break; - // PARENT FILTER case MiddlePanelActionTypes.MIDDLE_PANEL_PARENT_FILTER: - MiddlePanelStore.setParentFilter(action.parent_type, - action.parent_id); - break; - // FILTER - case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER_ALL: - MiddlePanelStore.setFilter('all'); + changed = MiddlePanelStore.setParentFilter(action.filter_type, + action.filter_id); + changed = MiddlePanelStore.setArticles(action.articles) || changed; + if(changed) {MiddlePanelStore.emitChange();} break; - case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER_UNREAD: - MiddlePanelStore.setFilter('unread'); + case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER: + changed = MiddlePanelStore.setFilter(action.filter); + changed = MiddlePanelStore.setArticles(action.articles) || changed; + if(changed) {MiddlePanelStore.emitChange();} break; - case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER_LIKED: - MiddlePanelStore.setFilter('liked'); - break; - - default: - // do nothing + // pass } }); -- cgit From 3644d4ef190d2d509c64fdf5c29382cb8a41e235 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Sat, 23 Jan 2016 12:47:18 +0100 Subject: doing some design wip toogle read / like --- src/web/js/stores/MenuStore.js | 24 +++++++++++++++++------- src/web/js/stores/MiddlePanelStore.js | 19 +++++++++++++++++-- 2 files changed, 34 insertions(+), 9 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index 016b33f2..6809d8b0 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -6,7 +6,7 @@ var assign = require('object-assign'); var MenuStore = assign({}, EventEmitter.prototype, { - _datas: {filter: 'all', categories: [], + _datas: {filter: 'all', categories: [], active_type: null, active_id: null, all_unread_count: 0, feed_in_error: false}, getAll: function() { return this._datas; @@ -17,6 +17,13 @@ var MenuStore = assign({}, EventEmitter.prototype, { this.emitChange(); } }, + setActive: function(type, value) { + if(this._datas.active_id != value || this._datas.active_type != type) { + this._datas.active_type = type; + this._datas.active_id = value; + this.emitChange(); + } + }, readFeedArticle: function(feed_id) { // TODO }, @@ -40,14 +47,17 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { MenuStore._datas['all_unread_count'] = action.all_unread_count; MenuStore.emitChange(); break; - case MenuActionTypes.MENU_FILTER_ALL: - MenuStore.setFilter('all'); + case MenuActionTypes.PARENT_FILTER: + MenuStore.setActive(action.filter_type, action.filter_id); + break; + case MenuActionTypes.MENU_FILTER: + MenuStore.setFilter(action.filter); break; - case MenuActionTypes.MENU_FILTER_UNREAD: - MenuStore.setFilter('unread'); + case MenuActionTypes.MENU_FILTER: + MenuStore.setFilter(action.filter); break; - case MenuActionTypes.MENU_FILTER_ERROR: - MenuStore.setFilter('error'); + case MenuActionTypes.MENU_FILTER: + MenuStore.setFilter(action.filter); break; default: diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index 80ac8198..201bebd1 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -1,5 +1,6 @@ var JarrDispatcher = require('../dispatcher/JarrDispatcher'); var MiddlePanelActionTypes = require('../constants/JarrConstants').MiddlePanelActionTypes; +var MenuActionTypes = require('../constants/JarrConstants').MenuActionTypes; var EventEmitter = require('events').EventEmitter; var CHANGE_EVENT = 'change_middle_panel'; var assign = require('object-assign'); @@ -21,7 +22,7 @@ var MiddlePanelStore = assign({}, EventEmitter.prototype, { var id = null; var filter = this._datas.filter; if (this._datas.filter_type) { - key = this._datas.filter_type + '_id'; + key = this._datas.filter_type; id = this._datas.filter_id; } return this._datas.articles.filter(function(article) { @@ -72,7 +73,7 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { MiddlePanelStore.setArticles(action.articles); MiddlePanelStore.emitChange(); break; - case MiddlePanelActionTypes.MIDDLE_PANEL_PARENT_FILTER: + case MiddlePanelActionTypes.PARENT_FILTER: changed = MiddlePanelStore.setParentFilter(action.filter_type, action.filter_id); changed = MiddlePanelStore.setArticles(action.articles) || changed; @@ -83,6 +84,20 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { changed = MiddlePanelStore.setArticles(action.articles) || changed; if(changed) {MiddlePanelStore.emitChange();} break; + case MiddlePanelActionTypes.CHANGE_ATTR: + var id = action.article_id; + var attr = action.attribute; + var val = action.value; + for (var i in MiddlePanelStore._datas.articles) { + if(MiddlePanelStore._datas.articles[i].article_id == id) { + if (MiddlePanelStore._datas.articles[i][attr] != val) { + MiddlePanelStore._datas.articles[i][attr] = val; + MiddlePanelStore.emitChange(); + } + break; + } + } + break; default: // pass } -- cgit From f0dd6d526160fdb98a5f55b4e45b84652590df58 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Mon, 25 Jan 2016 12:40:23 +0100 Subject: bootstraping right panel --- src/web/js/stores/RightPanelStore.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/web/js/stores/RightPanelStore.js (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/RightPanelStore.js b/src/web/js/stores/RightPanelStore.js new file mode 100644 index 00000000..0bca9f54 --- /dev/null +++ b/src/web/js/stores/RightPanelStore.js @@ -0,0 +1,33 @@ +var JarrDispatcher = require('../dispatcher/JarrDispatcher'); +var RightPanelActionTypes = require('../constants/JarrConstants').RightPanelActionTypes; +var MenuActionTypes = require('../constants/JarrConstants').MenuActionTypes; +var EventEmitter = require('events').EventEmitter; +var CHANGE_EVENT = 'change_middle_panel'; +var assign = require('object-assign'); + + +var RightPanelStore = assign({}, EventEmitter.prototype, { + _datas: {}, + getAll: function() { + return this._datas; + }, + emitChange: function() { + this.emit(CHANGE_EVENT); + }, + addChangeListener: function(callback) { + this.on(CHANGE_EVENT, callback); + }, + removeChangeListener: function(callback) { + this.removeListener(CHANGE_EVENT, callback); + }, +}); + + +RightPanelStore.dispatchToken = JarrDispatcher.register(function(action) { + switch(action.type) { + default: + // pass + } +}); + +module.exports = RightPanelStore; -- cgit From 15c4ed6bebdeb277c24bd92dab5bba900fc90de4 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Mon, 25 Jan 2016 13:14:06 +0100 Subject: redoing constant, handling read / unread in menu, removing bad optim for loading articles --- src/web/js/stores/MenuStore.js | 37 +++++++++++++++++++++++++++++------ src/web/js/stores/MiddlePanelStore.js | 16 ++++++++------- src/web/js/stores/RightPanelStore.js | 3 +-- 3 files changed, 41 insertions(+), 15 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index 6809d8b0..ecf32499 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -1,5 +1,5 @@ var JarrDispatcher = require('../dispatcher/JarrDispatcher'); -var MenuActionTypes = require('../constants/JarrConstants').MenuActionTypes; +var ActionTypes = require('../constants/JarrConstants'); var EventEmitter = require('events').EventEmitter; var CHANGE_EVENT = 'change_menu'; var assign = require('object-assign'); @@ -41,25 +41,50 @@ var MenuStore = assign({}, EventEmitter.prototype, { MenuStore.dispatchToken = JarrDispatcher.register(function(action) { switch(action.type) { - case MenuActionTypes.RELOAD_MENU: + case ActionTypes.RELOAD_MENU: MenuStore._datas['categories'] = action.categories; MenuStore._datas['feed_in_error'] = action.feed_in_error; MenuStore._datas['all_unread_count'] = action.all_unread_count; MenuStore.emitChange(); break; - case MenuActionTypes.PARENT_FILTER: + case ActionTypes.PARENT_FILTER: MenuStore.setActive(action.filter_type, action.filter_id); break; - case MenuActionTypes.MENU_FILTER: + case ActionTypes.MENU_FILTER: MenuStore.setFilter(action.filter); break; - case MenuActionTypes.MENU_FILTER: + case ActionTypes.MENU_FILTER: MenuStore.setFilter(action.filter); break; - case MenuActionTypes.MENU_FILTER: + case ActionTypes.MENU_FILTER: MenuStore.setFilter(action.filter); break; + case ActionTypes.CHANGE_ATTR: + if(action.attribute != 'read') { + return; + } + for(var i in MenuStore._datas.categories) { + if(MenuStore._datas.categories[i].id == action.category_id) { + for(var j in MenuStore._datas.categories[i].feeds) { + if(MenuStore._datas.categories[i].feeds[j].id == action.feed_id) { + if(action.value) { + MenuStore._datas.categories[i].feeds[j].unread -= 1; + } else { + MenuStore._datas.categories[i].feeds[j].unread += 1; + } + } + } + if(action.value) { + MenuStore._datas.categories[i].unread -= 1; + } else { + MenuStore._datas.categories[i].unread += 1; + } + MenuStore.emitChange(); + break; + } + } + break; default: // do nothing } diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index 201bebd1..12c2d6e8 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -1,6 +1,5 @@ var JarrDispatcher = require('../dispatcher/JarrDispatcher'); -var MiddlePanelActionTypes = require('../constants/JarrConstants').MiddlePanelActionTypes; -var MenuActionTypes = require('../constants/JarrConstants').MenuActionTypes; +var ActionTypes = require('../constants/JarrConstants'); var EventEmitter = require('events').EventEmitter; var CHANGE_EVENT = 'change_middle_panel'; var assign = require('object-assign'); @@ -69,22 +68,22 @@ var MiddlePanelStore = assign({}, EventEmitter.prototype, { MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { var changed = false; switch(action.type) { - case MiddlePanelActionTypes.RELOAD_MIDDLE_PANEL: + case ActionTypes.RELOAD_MIDDLE_PANEL: MiddlePanelStore.setArticles(action.articles); MiddlePanelStore.emitChange(); break; - case MiddlePanelActionTypes.PARENT_FILTER: + case ActionTypes.PARENT_FILTER: changed = MiddlePanelStore.setParentFilter(action.filter_type, action.filter_id); changed = MiddlePanelStore.setArticles(action.articles) || changed; if(changed) {MiddlePanelStore.emitChange();} break; - case MiddlePanelActionTypes.MIDDLE_PANEL_FILTER: + case ActionTypes.MIDDLE_PANEL_FILTER: changed = MiddlePanelStore.setFilter(action.filter); changed = MiddlePanelStore.setArticles(action.articles) || changed; if(changed) {MiddlePanelStore.emitChange();} break; - case MiddlePanelActionTypes.CHANGE_ATTR: + case ActionTypes.CHANGE_ATTR: var id = action.article_id; var attr = action.attribute; var val = action.value; @@ -92,7 +91,10 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { if(MiddlePanelStore._datas.articles[i].article_id == id) { if (MiddlePanelStore._datas.articles[i][attr] != val) { MiddlePanelStore._datas.articles[i][attr] = val; - MiddlePanelStore.emitChange(); + // avoiding redraw if not filter, display won't change anyway + if(MiddlePanelStore._datas.filter != 'all') { + MiddlePanelStore.emitChange(); + } } break; } diff --git a/src/web/js/stores/RightPanelStore.js b/src/web/js/stores/RightPanelStore.js index 0bca9f54..54df1c95 100644 --- a/src/web/js/stores/RightPanelStore.js +++ b/src/web/js/stores/RightPanelStore.js @@ -1,6 +1,5 @@ var JarrDispatcher = require('../dispatcher/JarrDispatcher'); -var RightPanelActionTypes = require('../constants/JarrConstants').RightPanelActionTypes; -var MenuActionTypes = require('../constants/JarrConstants').MenuActionTypes; +var ActionTypes = require('../constants/JarrConstants'); var EventEmitter = require('events').EventEmitter; var CHANGE_EVENT = 'change_middle_panel'; var assign = require('object-assign'); -- cgit From f3578d10239ffa716450c0089bcbc8d2826f59fd Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Tue, 26 Jan 2016 23:23:42 +0100 Subject: mark all as read button --- src/web/js/stores/MenuStore.js | 30 +++++++++++++----------------- src/web/js/stores/MiddlePanelStore.js | 23 ++++++++++++----------- 2 files changed, 25 insertions(+), 28 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index ecf32499..d98495f5 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -63,27 +63,23 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { if(action.attribute != 'read') { return; } - for(var i in MenuStore._datas.categories) { - if(MenuStore._datas.categories[i].id == action.category_id) { - for(var j in MenuStore._datas.categories[i].feeds) { - if(MenuStore._datas.categories[i].feeds[j].id == action.feed_id) { - if(action.value) { - MenuStore._datas.categories[i].feeds[j].unread -= 1; - } else { - MenuStore._datas.categories[i].feeds[j].unread += 1; - } + var val = action.value_num; + action.articles.map(function(article) { + for(var i in MenuStore._datas.categories) { + if(MenuStore._datas.categories[i].id == article.category_id) { + for(var j in MenuStore._datas.categories[i].feeds) { + if(MenuStore._datas.categories[i].feeds[j].id == article.feed_id) { + MenuStore._datas.categories[i].feeds[j].unread += val; + break; + } } + MenuStore._datas.categories[i].unread += val; + break; } - if(action.value) { - MenuStore._datas.categories[i].unread -= 1; - } else { - MenuStore._datas.categories[i].unread += 1; - } - MenuStore.emitChange(); - break; } - } + }); + MenuStore.emitChange(); break; default: // do nothing diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index 12c2d6e8..bc7cee51 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -84,21 +84,22 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { if(changed) {MiddlePanelStore.emitChange();} break; case ActionTypes.CHANGE_ATTR: - var id = action.article_id; var attr = action.attribute; - var val = action.value; - for (var i in MiddlePanelStore._datas.articles) { - if(MiddlePanelStore._datas.articles[i].article_id == id) { - if (MiddlePanelStore._datas.articles[i][attr] != val) { - MiddlePanelStore._datas.articles[i][attr] = val; - // avoiding redraw if not filter, display won't change anyway - if(MiddlePanelStore._datas.filter != 'all') { - MiddlePanelStore.emitChange(); + var val = action.value_bool; + action.articles.map(function(article) { + for (var i in MiddlePanelStore._datas.articles) { + if(MiddlePanelStore._datas.articles[i].article_id == article.article_id) { + if (MiddlePanelStore._datas.articles[i][attr] != val) { + MiddlePanelStore._datas.articles[i][attr] = val; + // avoiding redraw if not filter, display won't change anyway + if(MiddlePanelStore._datas.filter != 'all') { + MiddlePanelStore.emitChange(); + } } + break; } - break; } - } + }); break; default: // pass -- cgit From 5c8f9fd0376afc034251a73023e43ada4041aa34 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Thu, 28 Jan 2016 14:36:26 +0100 Subject: implementing search through articles --- src/web/js/stores/MiddlePanelStore.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index bc7cee51..611808f7 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -7,14 +7,23 @@ var assign = require('object-assign'); var MiddlePanelStore = assign({}, EventEmitter.prototype, { _datas: {filter: 'unread', articles: [], - filter_type: null, filter_id: null}, + filter_type: null, filter_id: null, + display_search: false, query: null, + search_title: true, search_content: false}, getAll: function() { return this._datas; }, getRequestFilter: function() { - return {'filter': this._datas.filter, - 'filter_type': this._datas.filter_type, - 'filter_id': this._datas.filter_id}; + var filters = {'filter': this._datas.filter, + 'filter_type': this._datas.filter_type, + 'filter_id': this._datas.filter_id, + }; + if(this._datas.display_search) { + filters.query = this._datas.query; + filters.search_title = this._datas.search_title; + filters.search_content = this._datas.search_content; + }; + return filters; }, getArticles: function() { var key = null; -- cgit From 8e942f6f5695c4788328b4959527b30ff31e771d Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Thu, 28 Jan 2016 22:47:36 +0100 Subject: redoing menu, sorting in place and not in python --- src/web/js/stores/MenuStore.js | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index d98495f5..6921ae1c 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -6,7 +6,8 @@ var assign = require('object-assign'); var MenuStore = assign({}, EventEmitter.prototype, { - _datas: {filter: 'all', categories: [], active_type: null, active_id: null, + _datas: {filter: 'all', feeds: {}, categories: {}, + active_type: null, active_id: null, all_unread_count: 0, feed_in_error: false}, getAll: function() { return this._datas; @@ -42,6 +43,7 @@ var MenuStore = assign({}, EventEmitter.prototype, { MenuStore.dispatchToken = JarrDispatcher.register(function(action) { switch(action.type) { case ActionTypes.RELOAD_MENU: + MenuStore._datas['feeds'] = action.feeds; MenuStore._datas['categories'] = action.categories; MenuStore._datas['feed_in_error'] = action.feed_in_error; MenuStore._datas['all_unread_count'] = action.all_unread_count; @@ -65,19 +67,8 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { } var val = action.value_num; action.articles.map(function(article) { - for(var i in MenuStore._datas.categories) { - if(MenuStore._datas.categories[i].id == article.category_id) { - for(var j in MenuStore._datas.categories[i].feeds) { - if(MenuStore._datas.categories[i].feeds[j].id == article.feed_id) { - MenuStore._datas.categories[i].feeds[j].unread += val; - break; - - } - } - MenuStore._datas.categories[i].unread += val; - break; - } - } + MenuStore._datas.categories[article.category_id].unread += val; + MenuStore._datas.feeds[article.feed_id].unread += val; }); MenuStore.emitChange(); break; -- cgit From 56ab5f6df51ff301a4dccc458eb83917bba49afc Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Fri, 29 Jan 2016 00:27:47 +0100 Subject: wip right panel --- src/web/js/stores/MenuStore.js | 3 +-- src/web/js/stores/RightPanelStore.js | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index 6921ae1c..3a87384f 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -8,7 +8,7 @@ var assign = require('object-assign'); var MenuStore = assign({}, EventEmitter.prototype, { _datas: {filter: 'all', feeds: {}, categories: {}, active_type: null, active_id: null, - all_unread_count: 0, feed_in_error: false}, + all_unread_count: 0}, getAll: function() { return this._datas; }, @@ -45,7 +45,6 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { case ActionTypes.RELOAD_MENU: MenuStore._datas['feeds'] = action.feeds; MenuStore._datas['categories'] = action.categories; - MenuStore._datas['feed_in_error'] = action.feed_in_error; MenuStore._datas['all_unread_count'] = action.all_unread_count; MenuStore.emitChange(); break; diff --git a/src/web/js/stores/RightPanelStore.js b/src/web/js/stores/RightPanelStore.js index 54df1c95..f08be009 100644 --- a/src/web/js/stores/RightPanelStore.js +++ b/src/web/js/stores/RightPanelStore.js @@ -3,10 +3,11 @@ var ActionTypes = require('../constants/JarrConstants'); var EventEmitter = require('events').EventEmitter; var CHANGE_EVENT = 'change_middle_panel'; var assign = require('object-assign'); +var MenuStore = require('../stores/MenuStore'); var RightPanelStore = assign({}, EventEmitter.prototype, { - _datas: {}, + _datas: {category: null, feed: null, article: null}, getAll: function() { return this._datas; }, @@ -24,6 +25,20 @@ var RightPanelStore = assign({}, EventEmitter.prototype, { RightPanelStore.dispatchToken = JarrDispatcher.register(function(action) { switch(action.type) { + case ActionTypes.PARENT_FILTER: + if(action.filter_id == null) { + RightPanelStore._datas.category = null; + RightPanelStore._datas.feed = null; + } else if(action.filter_type == 'category_id') { + RightPanelStore._datas.category = MenuStore._datas.categories[action.filter_id]; + RightPanelStore._datas.feed = null; + } else { + + RightPanelStore._datas.feed = MenuStore._datas.feeds[action.filter_id]; + RightPanelStore._datas.category = MenuStore._datas.categories[RightPanelStore._datas.feed.category_id]; + } + RightPanelStore.emitChange(); + break; default: // pass } -- cgit From 5eae4cb235abed7a6e8c6ab81226def9dddc0af2 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Fri, 29 Jan 2016 13:02:49 +0100 Subject: correcting awful middle panel action handling --- src/web/js/stores/MiddlePanelStore.js | 39 ++++++++++++++++------------------- 1 file changed, 18 insertions(+), 21 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index 611808f7..83b8d942 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -6,6 +6,8 @@ var assign = require('object-assign'); var MiddlePanelStore = assign({}, EventEmitter.prototype, { + filter_whitelist: ['filter', 'filter_id', 'filter_type', 'display_search', + 'query', 'search_title', 'search_content'], _datas: {filter: 'unread', articles: [], filter_type: null, filter_id: null, display_search: false, query: null, @@ -13,12 +15,12 @@ var MiddlePanelStore = assign({}, EventEmitter.prototype, { getAll: function() { return this._datas; }, - getRequestFilter: function() { + getRequestFilter: function(display_search) { var filters = {'filter': this._datas.filter, 'filter_type': this._datas.filter_type, 'filter_id': this._datas.filter_id, }; - if(this._datas.display_search) { + if(display_search || (display_search == undefined && this._datas.display_search)) { filters.query = this._datas.query; filters.search_title = this._datas.search_title; filters.search_content = this._datas.search_content; @@ -47,20 +49,15 @@ var MiddlePanelStore = assign({}, EventEmitter.prototype, { } return false; }, - setFilter: function(value) { - if(this._datas.filter != value) { - this._datas.filter = value; - return true; - } - return false; - }, - setParentFilter: function(type, value) { - if(this._datas.filter_id != value || this._datas.filter_type != type) { - this._datas.filter_type = type; - this._datas.filter_id = value; - return true; - } - return false; + registerFilter: function(action) { + var changed = false; + this.filter_whitelist.map(function(key) { + if(key in action && this._datas[key] != action[key]) { + changed = true; + this._datas[key] = action[key]; + } + }.bind(this)); + return changed; }, emitChange: function() { this.emit(CHANGE_EVENT); @@ -78,17 +75,17 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { var changed = false; switch(action.type) { case ActionTypes.RELOAD_MIDDLE_PANEL: - MiddlePanelStore.setArticles(action.articles); - MiddlePanelStore.emitChange(); + changed = MiddlePanelStore.registerFilter(action); + changed = MiddlePanelStore.setArticles(action.articles) || changed; + if(changed) {MiddlePanelStore.emitChange()}; break; case ActionTypes.PARENT_FILTER: - changed = MiddlePanelStore.setParentFilter(action.filter_type, - action.filter_id); + changed = MiddlePanelStore.registerFilter(action); changed = MiddlePanelStore.setArticles(action.articles) || changed; if(changed) {MiddlePanelStore.emitChange();} break; case ActionTypes.MIDDLE_PANEL_FILTER: - changed = MiddlePanelStore.setFilter(action.filter); + changed = MiddlePanelStore.registerFilter(action); changed = MiddlePanelStore.setArticles(action.articles) || changed; if(changed) {MiddlePanelStore.emitChange();} break; -- cgit From 4098a0de815013c521618b6419d91f997c986ef0 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Fri, 29 Jan 2016 14:26:02 +0100 Subject: draft displaying article --- src/web/js/stores/RightPanelStore.js | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/RightPanelStore.js b/src/web/js/stores/RightPanelStore.js index f08be009..68d3b7e9 100644 --- a/src/web/js/stores/RightPanelStore.js +++ b/src/web/js/stores/RightPanelStore.js @@ -26,19 +26,29 @@ var RightPanelStore = assign({}, EventEmitter.prototype, { RightPanelStore.dispatchToken = JarrDispatcher.register(function(action) { switch(action.type) { case ActionTypes.PARENT_FILTER: + RightPanelStore._datas.article = null; if(action.filter_id == null) { RightPanelStore._datas.category = null; RightPanelStore._datas.feed = null; } else if(action.filter_type == 'category_id') { RightPanelStore._datas.category = MenuStore._datas.categories[action.filter_id]; RightPanelStore._datas.feed = null; + RightPanelStore._datas.current = 'category'; } else { RightPanelStore._datas.feed = MenuStore._datas.feeds[action.filter_id]; RightPanelStore._datas.category = MenuStore._datas.categories[RightPanelStore._datas.feed.category_id]; + RightPanelStore._datas.current = 'feed'; } RightPanelStore.emitChange(); break; + case ActionTypes.LOAD_ARTICLE: + RightPanelStore._datas.feed = MenuStore._datas.feeds[action.article.feed_id]; + RightPanelStore._datas.category = MenuStore._datas.categories[action.article.category_id]; + RightPanelStore._datas.article = action.article; + RightPanelStore._datas.current = 'article'; + RightPanelStore.emitChange(); + break; default: // pass } -- cgit From 4c5415754593986d1540820d13dfa34a34ffeed6 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Fri, 29 Jan 2016 20:28:10 +0100 Subject: impact on menus when loading article --- src/web/js/stores/MenuStore.js | 7 ++++++ src/web/js/stores/MiddlePanelStore.js | 42 ++++++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 13 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index 3a87384f..edc90a38 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -71,6 +71,13 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { }); MenuStore.emitChange(); break; + case ActionTypes.LOAD_ARTICLE: + if(!action.was_read_before) { + MenuStore._datas.categories[action.article.category_id].unread -= 1; + MenuStore._datas.feeds[action.article.feed_id].unread -= 1; + MenuStore.emitChange(); + } + break; default: // do nothing } diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index 83b8d942..1a0a4fab 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -8,8 +8,8 @@ var assign = require('object-assign'); var MiddlePanelStore = assign({}, EventEmitter.prototype, { filter_whitelist: ['filter', 'filter_id', 'filter_type', 'display_search', 'query', 'search_title', 'search_content'], - _datas: {filter: 'unread', articles: [], - filter_type: null, filter_id: null, + _datas: {articles: [], selected_article: null, + filter: 'unread', filter_type: null, filter_id: null, display_search: false, query: null, search_title: true, search_content: false}, getAll: function() { @@ -30,17 +30,26 @@ var MiddlePanelStore = assign({}, EventEmitter.prototype, { getArticles: function() { var key = null; var id = null; - var filter = this._datas.filter; if (this._datas.filter_type) { key = this._datas.filter_type; id = this._datas.filter_id; } - return this._datas.articles.filter(function(article) { - return ((!key || article[key] == id) - && (filter == 'all' - || (filter == 'unread' && !article.read) - || (filter == 'liked' && article.liked))); - }); + return this._datas.articles + .map(function(article) { + if(article.article_id == this._datas.selected_article) { + article.selected = true; + } else if(article.selected) { + article.selected = false; + } + return article; + }.bind(this)) + .filter(function(article) { + return (article.selected || ((!key || article[key] == id) + && (this._datas.filter == 'all' + || (this._datas.filter == 'unread' && !article.read) + || (this._datas.filter == 'liked' && article.liked)))); + }.bind(this)); + }, setArticles: function(articles) { if(articles || articles == []) { @@ -77,17 +86,14 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { case ActionTypes.RELOAD_MIDDLE_PANEL: changed = MiddlePanelStore.registerFilter(action); changed = MiddlePanelStore.setArticles(action.articles) || changed; - if(changed) {MiddlePanelStore.emitChange()}; break; case ActionTypes.PARENT_FILTER: changed = MiddlePanelStore.registerFilter(action); changed = MiddlePanelStore.setArticles(action.articles) || changed; - if(changed) {MiddlePanelStore.emitChange();} break; case ActionTypes.MIDDLE_PANEL_FILTER: changed = MiddlePanelStore.registerFilter(action); changed = MiddlePanelStore.setArticles(action.articles) || changed; - if(changed) {MiddlePanelStore.emitChange();} break; case ActionTypes.CHANGE_ATTR: var attr = action.attribute; @@ -99,7 +105,7 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { MiddlePanelStore._datas.articles[i][attr] = val; // avoiding redraw if not filter, display won't change anyway if(MiddlePanelStore._datas.filter != 'all') { - MiddlePanelStore.emitChange(); + changed = true; } } break; @@ -107,9 +113,19 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { } }); break; + case ActionTypes.LOAD_ARTICLE: + changed = true; + MiddlePanelStore._datas.selected_article = action.article.id; + for (var i in MiddlePanelStore._datas.articles) { + if(MiddlePanelStore._datas.articles[i].article_id == action.article.id) { + MiddlePanelStore._datas.articles[i].read = true; + console.log(MiddlePanelStore._datas.articles[i]); + } + } default: // pass } + if(changed) {MiddlePanelStore.emitChange();} }); module.exports = MiddlePanelStore; -- cgit From f334fb4b355d90cbf0b8d9e658a87ebeec7fbe90 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Sat, 30 Jan 2016 01:44:13 +0100 Subject: wip redoing feed panel --- src/web/js/stores/MiddlePanelStore.js | 3 ++- src/web/js/stores/RightPanelStore.js | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MiddlePanelStore.js b/src/web/js/stores/MiddlePanelStore.js index 1a0a4fab..4a5efd00 100644 --- a/src/web/js/stores/MiddlePanelStore.js +++ b/src/web/js/stores/MiddlePanelStore.js @@ -119,9 +119,10 @@ MiddlePanelStore.dispatchToken = JarrDispatcher.register(function(action) { for (var i in MiddlePanelStore._datas.articles) { if(MiddlePanelStore._datas.articles[i].article_id == action.article.id) { MiddlePanelStore._datas.articles[i].read = true; - console.log(MiddlePanelStore._datas.articles[i]); + break; } } + break; default: // pass } diff --git a/src/web/js/stores/RightPanelStore.js b/src/web/js/stores/RightPanelStore.js index 68d3b7e9..85f336e4 100644 --- a/src/web/js/stores/RightPanelStore.js +++ b/src/web/js/stores/RightPanelStore.js @@ -30,17 +30,19 @@ RightPanelStore.dispatchToken = JarrDispatcher.register(function(action) { if(action.filter_id == null) { RightPanelStore._datas.category = null; RightPanelStore._datas.feed = null; + RightPanelStore._datas.current = null; } else if(action.filter_type == 'category_id') { RightPanelStore._datas.category = MenuStore._datas.categories[action.filter_id]; RightPanelStore._datas.feed = null; RightPanelStore._datas.current = 'category'; + RightPanelStore.emitChange(); } else { RightPanelStore._datas.feed = MenuStore._datas.feeds[action.filter_id]; RightPanelStore._datas.category = MenuStore._datas.categories[RightPanelStore._datas.feed.category_id]; RightPanelStore._datas.current = 'feed'; + RightPanelStore.emitChange(); } - RightPanelStore.emitChange(); break; case ActionTypes.LOAD_ARTICLE: RightPanelStore._datas.feed = MenuStore._datas.feeds[action.article.feed_id]; -- cgit From 678af2747d6414379e81ee6856c7ec2f3cd5a890 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Sat, 30 Jan 2016 23:17:03 +0100 Subject: registering modifications on feeds / categories --- src/web/js/stores/RightPanelStore.js | 50 ++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 16 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/RightPanelStore.js b/src/web/js/stores/RightPanelStore.js index 85f336e4..6c268dfd 100644 --- a/src/web/js/stores/RightPanelStore.js +++ b/src/web/js/stores/RightPanelStore.js @@ -7,9 +7,13 @@ var MenuStore = require('../stores/MenuStore'); var RightPanelStore = assign({}, EventEmitter.prototype, { - _datas: {category: null, feed: null, article: null}, + category: null, + feed: null, + article: null, + current: null, getAll: function() { - return this._datas; + return {category: this.category, feed: this.feed, + article: this.article, current: this.current}; }, emitChange: function() { this.emit(CHANGE_EVENT); @@ -26,31 +30,45 @@ var RightPanelStore = assign({}, EventEmitter.prototype, { RightPanelStore.dispatchToken = JarrDispatcher.register(function(action) { switch(action.type) { case ActionTypes.PARENT_FILTER: - RightPanelStore._datas.article = null; + RightPanelStore.article = null; if(action.filter_id == null) { - RightPanelStore._datas.category = null; - RightPanelStore._datas.feed = null; - RightPanelStore._datas.current = null; + RightPanelStore.category = null; + RightPanelStore.feed = null; + RightPanelStore.current = null; } else if(action.filter_type == 'category_id') { - RightPanelStore._datas.category = MenuStore._datas.categories[action.filter_id]; - RightPanelStore._datas.feed = null; - RightPanelStore._datas.current = 'category'; + RightPanelStore.category = MenuStore._datas.categories[action.filter_id]; + RightPanelStore.feed = null; + RightPanelStore.current = 'category'; RightPanelStore.emitChange(); } else { - RightPanelStore._datas.feed = MenuStore._datas.feeds[action.filter_id]; - RightPanelStore._datas.category = MenuStore._datas.categories[RightPanelStore._datas.feed.category_id]; - RightPanelStore._datas.current = 'feed'; + RightPanelStore.feed = MenuStore._datas.feeds[action.filter_id]; + RightPanelStore.category = MenuStore._datas.categories[RightPanelStore.feed.category_id]; + RightPanelStore.current = 'feed'; RightPanelStore.emitChange(); } break; case ActionTypes.LOAD_ARTICLE: - RightPanelStore._datas.feed = MenuStore._datas.feeds[action.article.feed_id]; - RightPanelStore._datas.category = MenuStore._datas.categories[action.article.category_id]; - RightPanelStore._datas.article = action.article; - RightPanelStore._datas.current = 'article'; + RightPanelStore.feed = MenuStore._datas.feeds[action.article.feed_id]; + RightPanelStore.category = MenuStore._datas.categories[action.article.category_id]; + RightPanelStore.article = action.article; + RightPanelStore.current = 'article'; RightPanelStore.emitChange(); break; + case ActionTypes.RELOAD_MENU: + RightPanelStore.article = null; + if(RightPanelStore.category && !(RightPanelStore.category.id.toString() in action.categories)) { + RightPanelStore.category = null; + RightPanelStore.current = null; + } + if(RightPanelStore.feed && !(RightPanelStore.feed.id.toString() in action.feeds)) { + RightPanelStore.feed = null; + RightPanelStore.current = null; + } + if(RightPanelStore.current == 'article') { + RightPanelStore.current = null; + } + RightPanelStore.emitChange(); default: // pass } -- cgit From 9ca6a6989b0c87401f1a3903077723cd9a648a79 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Sun, 31 Jan 2016 02:24:10 +0100 Subject: redoing navbar in react --- src/web/js/stores/MenuStore.js | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index edc90a38..b8f50fd9 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -8,6 +8,7 @@ var assign = require('object-assign'); var MenuStore = assign({}, EventEmitter.prototype, { _datas: {filter: 'all', feeds: {}, categories: {}, active_type: null, active_id: null, + is_admin: false, crawling_method: 'classic', all_unread_count: 0}, getAll: function() { return this._datas; @@ -45,6 +46,8 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { case ActionTypes.RELOAD_MENU: MenuStore._datas['feeds'] = action.feeds; MenuStore._datas['categories'] = action.categories; + MenuStore._datas['is_admin'] = action.is_admin; + MenuStore._datas['crawling_method'] = action.crawling_method; MenuStore._datas['all_unread_count'] = action.all_unread_count; MenuStore.emitChange(); break; -- cgit From 64964d2fcfa73e18b1316d788bacd11e2180bb7d Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Sun, 31 Jan 2016 18:59:36 +0100 Subject: handling errors from one page app --- src/web/js/stores/MenuStore.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index b8f50fd9..a68b24de 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -9,7 +9,7 @@ var MenuStore = assign({}, EventEmitter.prototype, { _datas: {filter: 'all', feeds: {}, categories: {}, active_type: null, active_id: null, is_admin: false, crawling_method: 'classic', - all_unread_count: 0}, + all_unread_count: 0, max_error: 0, error_threshold: 0}, getAll: function() { return this._datas; }, @@ -47,6 +47,8 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { MenuStore._datas['feeds'] = action.feeds; MenuStore._datas['categories'] = action.categories; MenuStore._datas['is_admin'] = action.is_admin; + MenuStore._datas['max_error'] = action.max_error; + MenuStore._datas['error_threshold'] = action.error_threshold; MenuStore._datas['crawling_method'] = action.crawling_method; MenuStore._datas['all_unread_count'] = action.all_unread_count; MenuStore.emitChange(); -- cgit From db6e918ee5a92429738f2e87afb1af8f024d5053 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Sun, 31 Jan 2016 22:32:10 +0100 Subject: enhancement: ordering categories and hidding empty 'no category' category --- src/web/js/stores/MenuStore.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index a68b24de..d3c44355 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -6,7 +6,7 @@ var assign = require('object-assign'); var MenuStore = assign({}, EventEmitter.prototype, { - _datas: {filter: 'all', feeds: {}, categories: {}, + _datas: {filter: 'all', feeds: {}, categories: {}, categories_order: [], active_type: null, active_id: null, is_admin: false, crawling_method: 'classic', all_unread_count: 0, max_error: 0, error_threshold: 0}, @@ -46,6 +46,7 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { case ActionTypes.RELOAD_MENU: MenuStore._datas['feeds'] = action.feeds; MenuStore._datas['categories'] = action.categories; + MenuStore._datas['categories_order'] = action.categories_order; MenuStore._datas['is_admin'] = action.is_admin; MenuStore._datas['max_error'] = action.max_error; MenuStore._datas['error_threshold'] = action.error_threshold; -- cgit From ded0971f5691ed2934e690c8d7bd480ed15402f7 Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Tue, 2 Feb 2016 21:55:57 +0100 Subject: updating unread count when fetching unread --- src/web/js/stores/MenuStore.js | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index d3c44355..36dee363 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -56,12 +56,34 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { break; case ActionTypes.PARENT_FILTER: MenuStore.setActive(action.filter_type, action.filter_id); - break; - case ActionTypes.MENU_FILTER: - MenuStore.setFilter(action.filter); - break; - case ActionTypes.MENU_FILTER: - MenuStore.setFilter(action.filter); + if(action.filters && action.articles && !action.filters.query + && action.filters.filter == 'unread') { + var new_unread = {}; + action.articles.map(function(article) { + if(!(article.feed_id in new_unread)) { + new_unread[article.feed_id] = 0; + } + if(!article.read) { + new_unread[article.feed_id] += 1; + } + }); + var changed = false; + for(var feed_id in new_unread) { + var old_unread = MenuStore._datas.feeds[feed_id].unread; + if(old_unread == new_unread[feed_id]) { + continue; + } + changed = true; + MenuStore._datas.feeds[feed_id].unread = new_unread[feed_id]; + var cat_id = MenuStore._datas.feeds[feed_id].category_id; + MenuStore._datas.categories[cat_id].unread -= old_unread; + MenuStore._datas.categories[cat_id].unread += new_unread[feed_id]; + } + if(changed) { + MenuStore.emitChange(); + } + } + break; case ActionTypes.MENU_FILTER: MenuStore.setFilter(action.filter); -- cgit From 9ad36d04c3a352afc6f9a1322c7401200332877a Mon Sep 17 00:00:00 2001 From: François Schmidts Date: Tue, 2 Feb 2016 23:05:16 +0100 Subject: reload and fold all button --- src/web/js/stores/MenuStore.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/web/js/stores') diff --git a/src/web/js/stores/MenuStore.js b/src/web/js/stores/MenuStore.js index 36dee363..49c61bc1 100644 --- a/src/web/js/stores/MenuStore.js +++ b/src/web/js/stores/MenuStore.js @@ -9,7 +9,8 @@ var MenuStore = assign({}, EventEmitter.prototype, { _datas: {filter: 'all', feeds: {}, categories: {}, categories_order: [], active_type: null, active_id: null, is_admin: false, crawling_method: 'classic', - all_unread_count: 0, max_error: 0, error_threshold: 0}, + all_unread_count: 0, max_error: 0, error_threshold: 0, + all_folded: false}, getAll: function() { return this._datas; }, @@ -106,6 +107,9 @@ MenuStore.dispatchToken = JarrDispatcher.register(function(action) { MenuStore.emitChange(); } break; + case ActionTypes.TOGGLE_MENU_FOLD: + MenuStore._datas.all_folded = action.all_folded; + MenuStore.emitChange(); default: // do nothing } -- cgit