diff --git a/CHANGELOG.md b/CHANGELOG.md index 000cf73b..183196cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,14 +9,15 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added - Add loaded function to modules, providing an async callback. +- Made default newsfeed module aware of gesture events from [MMM-Gestures](https://github.com/thobach/MMM-Gestures) - Add use pm2 for manager process into Installer RaspberryPi script + ### Fixed - Update .gitignore to not ignore default modules folder. - Remove white flash on boot up. - Added `update` in Raspberry Pi installation script. - ## [2.1.0] - 2016-12-31 **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install` diff --git a/modules/default/newsfeed/README.md b/modules/default/newsfeed/README.md index 58c7b9ae..8a0fec25 100644 --- a/modules/default/newsfeed/README.md +++ b/modules/default/newsfeed/README.md @@ -1,9 +1,10 @@ # Module: News Feed The `newsfeed ` module is one of the default modules of the MagicMirror. -This module displays news headlines based on an RSS feed. +This module displays news headlines based on an RSS feed. Scrolling through news headlines happens time-based (````updateInterval````), but can also be controlled by sending news feed specific notifications to the module. ## Using the module +### Configuration To use this module, add it to the modules array in the `config/config.js` file: ````javascript modules: [ @@ -30,6 +31,51 @@ modules: [ ] ```` +### Notifications +#### Interacting with the module +MagicMirror's [notification mechanism](https://github.com/MichMich/MagicMirror/tree/master/modules#thissendnotificationnotification-payload) allows to send notifications to the ````newsfeed```` module. The following notifications are supported: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Notification IdentifierDescription
ARTICLE_NEXTShows the next news title (hiding the summary or previously fully displayed article)
ARTICLE_PREVIOUSShows the previous news title (hiding the summary or previously fully displayed article)
ARTICLE_MORE_DETAILS

When received the *first time*, shows the corresponding description of the currently displayed news title.
The module expects that the module's configuration option ````showDescription```` is set to ````false```` (default value).

+ When received a *second consecutive time*, shows the full news article in an IFRAME.
+ This requires that the news page can be embedded in an IFRAME, e.g. doesn't have the HTTP response header [X-Frame-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) set to e.g. ````DENY````.
ARTICLE_LESS_DETAILSHides the summary or full news article and only displays the news title of the currently viewed news item.
+ +Note the payload of the sent notification event is ignored. + +#### Example +The following example shows how the next news article title can be displayed on the MagicMirror. +````javascript +this.sendNotification('ARTICLE_NEXT'); +```` + +#### ````newsfeed```` specific notification emitting modules +The third party [MMM-Gestures](https://github.com/thobach/MMM-Gestures) module supports above notifications when moving your hand up, down, left or right in front of a gesture sensor attached to the MagicMirror. See module's readme for more details. + ## Configuration options The following properties can be configured: diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 74014208..aed917f8 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -89,7 +89,8 @@ Module.register("newsfeed",{ if (this.newsItems.length > 0) { - if (this.config.showSourceTitle || this.config.showPublishDate) { + // this.config.showFullArticle is a run-time configuration, triggered by optional notifications + if (!this.config.showFullArticle && (this.config.showSourceTitle || this.config.showPublishDate)) { var sourceAndTimestamp = document.createElement("div"); sourceAndTimestamp.className = "light small dimmed"; @@ -152,10 +153,12 @@ Module.register("newsfeed",{ } - var title = document.createElement("div"); - title.className = "bright medium light"; - title.innerHTML = this.newsItems[this.activeItem].title; - wrapper.appendChild(title); + if(!this.config.showFullArticle){ + var title = document.createElement("div"); + title.className = "bright medium light"; + title.innerHTML = this.newsItems[this.activeItem].title; + wrapper.appendChild(title); + } if (this.config.showDescription) { var description = document.createElement("div"); @@ -164,6 +167,21 @@ Module.register("newsfeed",{ wrapper.appendChild(description); } + if (this.config.showFullArticle) { + var fullArticle = document.createElement("iframe"); + fullArticle.className = ""; + fullArticle.style.width = "100%"; + fullArticle.style.top = "0"; + fullArticle.style.left = "0"; + fullArticle.style.position = "fixed"; + fullArticle.height = window.innerHeight; + fullArticle.style.border = "none"; + fullArticle.src = this.newsItems[this.activeItem].url; + wrapper.appendChild(fullArticle); + } + + + } else { wrapper.innerHTML = this.translate("LOADING"); wrapper.className = "small dimmed"; @@ -256,7 +274,7 @@ Module.register("newsfeed",{ self.updateDom(self.config.animationSpeed); - setInterval(function() { + timer = setInterval(function() { self.activeItem++; self.updateDom(self.config.animationSpeed); }, this.config.updateInterval); @@ -273,5 +291,50 @@ Module.register("newsfeed",{ return string.charAt(0).toUpperCase() + string.slice(1); }, + resetDescrOrFullArticleAndTimer: function() { + this.config.showDescription = false; + this.config.showFullArticle = false; + if(!timer){ + this.scheduleUpdateInterval(); + } + }, + + notificationReceived: function(notification, payload, sender) { + Log.info(this.name + " - received notification: " + notification); + if(notification == "ARTICLE_NEXT"){ + var before = this.activeItem; + this.activeItem++; + if (this.activeItem >= this.newsItems.length) { + this.activeItem = 0; + } + this.resetDescrOrFullArticleAndTimer(); + Log.info(this.name + " - going from article #" + before + " to #" + this.activeItem + " (of " + this.newsItems.length + ")"); + this.updateDom(100); + } else if(notification == "ARTICLE_PREVIOUS"){ + var before = this.activeItem; + this.activeItem--; + if (this.activeItem < 0) { + this.activeItem = this.newsItems.length - 1; + } + this.resetDescrOrFullArticleAndTimer(); + Log.info(this.name + " - going from article #" + before + " to #" + this.activeItem + " (of " + this.newsItems.length + ")"); + this.updateDom(100); + } + // if "more details" is received the first time: show article summary, on second time show full article + else if(notification == "ARTICLE_MORE_DETAILS"){ + this.config.showDescription = !this.config.showDescription; + this.config.showFullArticle = !this.config.showDescription; + clearInterval(timer); + timer = null; + Log.info(this.name + " - showing " + this.config.showDescription ? "article description" : "full article"); + this.updateDom(100); + } else if(notification == "ARTICLE_LESS_DETAILS"){ + this.resetDescrOrFullArticleAndTimer(); + Log.info(this.name + " - showing only article titles again"); + this.updateDom(100); + } else { + Log.info(this.name + " - unknown notification, ignoring: " + notification); + } + }, });