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/actions/MenuActions.js | 2 ++ src/web/js/actions/RightPanelActions.js | 9 +++++++++ src/web/js/components/Menu.react.js | 8 ++++---- src/web/js/components/RightPanel.react.js | 32 +++++++++++++++++++++++++++++++ src/web/js/stores/MenuStore.js | 4 +++- 5 files changed, 50 insertions(+), 5 deletions(-) (limited to 'src/web/js') diff --git a/src/web/js/actions/MenuActions.js b/src/web/js/actions/MenuActions.js index fa30474e..027a3d37 100644 --- a/src/web/js/actions/MenuActions.js +++ b/src/web/js/actions/MenuActions.js @@ -12,6 +12,8 @@ var MenuActions = { feeds: payload.feeds, categories: payload.categories, is_admin: payload.is_admin, + max_error: payload.max_error, + error_threshold: payload.error_threshold, crawling_method: payload.crawling_method, all_unread_count: payload.all_unread_count, }); diff --git a/src/web/js/actions/RightPanelActions.js b/src/web/js/actions/RightPanelActions.js index 838690d1..489abae4 100644 --- a/src/web/js/actions/RightPanelActions.js +++ b/src/web/js/actions/RightPanelActions.js @@ -28,6 +28,15 @@ var RightPanelActions = { delObj: function(id, obj_type, fields) { this._apiReq('DELETE', id, obj_type, null, MenuActions.reload); }, + resetErrors: function(feed_id) { + jquery.ajax({type: 'GET', + url: "feed/reset_errors/" + feed_id, + success: function() { + MenuActions.reload(); + }, + }); + + }, }; module.exports = RightPanelActions; diff --git a/src/web/js/components/Menu.react.js b/src/web/js/components/Menu.react.js index ad28015c..b68a84eb 100644 --- a/src/web/js/components/Menu.react.js +++ b/src/web/js/components/Menu.react.js @@ -32,9 +32,9 @@ var FeedItem = React.createClass({ if(this.props.active) { classes += " bg-primary"; } - if(this.props.error_count >= 6) { + if(this.props.error_count >= MenuStore._datas.max_error) { classes += " bg-danger"; - } else if(this.props.error_count > 3) { + } else if(this.props.error_count > MenuStore._datas.error_threshold) { classes += " bg-warning"; } var title = {this.props.title}; @@ -97,7 +97,7 @@ var CategoryGroup = React.createClass({ var feeds = this.props.feeds.filter(function(feed) { if (filter == 'unread' && feed.unread <= 0) { return false; - } else if (filter == 'error' && feed.error_count <= 3) { + } else if (filter == 'error' && feed.error_count <= MenuStore._datas.error_threshold) { return false; } return true; @@ -201,7 +201,7 @@ var Menu = React.createClass({ var feeds = []; var unread = 0; this.state.categories[cat_id].feeds.map(function(feed_id) { - if(this.state.feeds[feed_id].error_count > 3) { + if(this.state.feeds[feed_id].error_count > MenuStore._datas.error_threshold) { feed_in_error = true; } unread += this.state.feeds[feed_id].unread; diff --git a/src/web/js/components/RightPanel.react.js b/src/web/js/components/RightPanel.react.js index 009b40df..bf352a61 100644 --- a/src/web/js/components/RightPanel.react.js +++ b/src/web/js/components/RightPanel.react.js @@ -247,7 +247,38 @@ var Feed = React.createClass({
Category
{content}
); }, + getErrorFields: function() { + if(this.props.obj.error_count < MenuStore._datas.error_threshold) { + return; + } + if(this.props.obj.error_count < MenuStore._datas.max_error) { + return (
+
State
+
The download of this feed has encountered some problems. However its error counter will be reinitialized at the next successful retrieving.
+
Last error
+
{this.props.obj.last_error}
+
); + } + return (
+
State
+
That feed has encountered too much consecutive errors and won't be retrieved anymore.
+ +
Last error
+
{this.props.obj.last_error}
+
+ +
+
); + }, + resetErrors: function() { + var obj = this.state.obj; + obj.error_count = 0; + this.setState({obj: obj}, function() { + RightPanelActions.resetErrors(this.props.obj.id); + }.bind(this)); + }, getBody: function() { return (
@@ -260,6 +291,7 @@ var Feed = React.createClass({ text={this.props.obj.last_retrieved} />
+ {this.getErrorFields()} {this.getCategorySelect()} {this.getCore()} {this.getFilterRows()} 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