diff --git a/CHANGELOG.md b/CHANGELOG.md index 6748f15a..ba8d3d1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ _This release is scheduled to be released on 2021-04-01._ - Cleaned up old code on server side. - Convert `-0` to `0` when displaying temperature. - Code cleanup for FEELS like and added {DEGREE} placeholder for FEELSLIKE for each language +- Converted newsfeed module to use templates. ### Removed diff --git a/modules/default/newsfeed/fullarticle.njk b/modules/default/newsfeed/fullarticle.njk new file mode 100644 index 00000000..6570396e --- /dev/null +++ b/modules/default/newsfeed/fullarticle.njk @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/modules/default/newsfeed/newsfeed.css b/modules/default/newsfeed/newsfeed.css new file mode 100644 index 00000000..6f32b2e5 --- /dev/null +++ b/modules/default/newsfeed/newsfeed.css @@ -0,0 +1,14 @@ +iframe.newsfeed-fullarticle { + width: 100vw; + /* very large height value to allow scrolling */ + height: 3000px; + top: 0; + left: 0; + border: none; + z-index: 1; +} + +.region.bottom.bar.newsfeed-fullarticle { + bottom: inherit; + top: -90px; +} diff --git a/modules/default/newsfeed/newsfeed.js b/modules/default/newsfeed/newsfeed.js index 7fe2fb21..71681867 100644 --- a/modules/default/newsfeed/newsfeed.js +++ b/modules/default/newsfeed/newsfeed.js @@ -44,6 +44,11 @@ Module.register("newsfeed", { return ["moment.js"]; }, + //Define required styles. + getStyles: function () { + return ["newsfeed.css"]; + }, + // Define required translations. getTranslations: function () { // The translations for the default modules are defined in the core translation files. @@ -75,6 +80,9 @@ Module.register("newsfeed", { this.generateFeed(payload); if (!this.loaded) { + if (this.config.hideLoading) { + this.show(); + } this.scheduleUpdateInterval(); } @@ -82,123 +90,43 @@ Module.register("newsfeed", { } }, - // Override dom generator. - getDom: function () { - const wrapper = document.createElement("div"); - + //Override fetching of template name + getTemplate: function () { if (this.config.feedUrl) { - wrapper.className = "small bright"; - wrapper.innerHTML = this.translate("MODULE_CONFIG_CHANGED", { MODULE_NAME: "Newsfeed" }); - return wrapper; + return "oldconfig.njk"; + } else if (this.config.showFullArticle) { + return "fullarticle.njk"; + } + return "newsfeed.njk"; + }, + + //Override template data and return whats used for the current template + getTemplateData: function () { + // this.config.showFullArticle is a run-time configuration, triggered by optional notifications + if (this.config.showFullArticle) { + return { + url: this.getActiveItemURL() + }; + } + if (this.newsItems.length === 0) { + return { + loaded: false + }; } if (this.activeItem >= this.newsItems.length) { this.activeItem = 0; } + const item = this.newsItems[this.activeItem]; - if (this.newsItems.length > 0) { - // this.config.showFullArticle is a run-time configuration, triggered by optional notifications - if (!this.config.showFullArticle && (this.config.showSourceTitle || this.config.showPublishDate)) { - const sourceAndTimestamp = document.createElement("div"); - sourceAndTimestamp.className = "newsfeed-source light small dimmed"; - - if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "") { - sourceAndTimestamp.innerHTML = this.newsItems[this.activeItem].sourceTitle; - } - if (this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "" && this.config.showPublishDate) { - sourceAndTimestamp.innerHTML += ", "; - } - if (this.config.showPublishDate) { - sourceAndTimestamp.innerHTML += moment(new Date(this.newsItems[this.activeItem].pubdate)).fromNow(); - } - if ((this.config.showSourceTitle && this.newsItems[this.activeItem].sourceTitle !== "") || this.config.showPublishDate) { - sourceAndTimestamp.innerHTML += ":"; - } - - wrapper.appendChild(sourceAndTimestamp); - } - - //Remove selected tags from the beginning of rss feed items (title or description) - - if (this.config.removeStartTags === "title" || this.config.removeStartTags === "both") { - for (let f = 0; f < this.config.startTags.length; f++) { - if (this.newsItems[this.activeItem].title.slice(0, this.config.startTags[f].length) === this.config.startTags[f]) { - this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].title.slice(this.config.startTags[f].length, this.newsItems[this.activeItem].title.length); - } - } - } - - if (this.config.removeStartTags === "description" || this.config.removeStartTags === "both") { - if (this.isShowingDescription) { - for (let f = 0; f < this.config.startTags.length; f++) { - if (this.newsItems[this.activeItem].description.slice(0, this.config.startTags[f].length) === this.config.startTags[f]) { - this.newsItems[this.activeItem].description = this.newsItems[this.activeItem].description.slice(this.config.startTags[f].length, this.newsItems[this.activeItem].description.length); - } - } - } - } - - //Remove selected tags from the end of rss feed items (title or description) - - if (this.config.removeEndTags) { - for (let f = 0; f < this.config.endTags.length; f++) { - if (this.newsItems[this.activeItem].title.slice(-this.config.endTags[f].length) === this.config.endTags[f]) { - this.newsItems[this.activeItem].title = this.newsItems[this.activeItem].title.slice(0, -this.config.endTags[f].length); - } - } - - if (this.isShowingDescription) { - for (let f = 0; f < this.config.endTags.length; f++) { - if (this.newsItems[this.activeItem].description.slice(-this.config.endTags[f].length) === this.config.endTags[f]) { - this.newsItems[this.activeItem].description = this.newsItems[this.activeItem].description.slice(0, -this.config.endTags[f].length); - } - } - } - } - - if (!this.config.showFullArticle) { - const title = document.createElement("div"); - title.className = "newsfeed-title bright medium light" + (!this.config.wrapTitle ? " no-wrap" : ""); - title.innerHTML = this.newsItems[this.activeItem].title; - wrapper.appendChild(title); - } - - if (this.isShowingDescription) { - const description = document.createElement("div"); - description.className = "newsfeed-desc small light" + (!this.config.wrapDescription ? " no-wrap" : ""); - const txtDesc = this.newsItems[this.activeItem].description; - description.innerHTML = this.config.truncDescription ? (txtDesc.length > this.config.lengthDescription ? txtDesc.substring(0, this.config.lengthDescription) + "..." : txtDesc) : txtDesc; - wrapper.appendChild(description); - } - - if (this.config.showFullArticle) { - const fullArticle = document.createElement("iframe"); - fullArticle.className = ""; - fullArticle.style.width = "100vw"; - // very large height value to allow scrolling - fullArticle.height = "3000"; - fullArticle.style.height = "3000"; - fullArticle.style.top = "0"; - fullArticle.style.left = "0"; - fullArticle.style.border = "none"; - fullArticle.src = this.getActiveItemURL(); - fullArticle.style.zIndex = 1; - wrapper.appendChild(fullArticle); - } - - if (this.config.hideLoading) { - this.show(); - } - } else { - if (this.config.hideLoading) { - this.hide(); - } else { - wrapper.innerHTML = this.translate("LOADING"); - wrapper.className = "small dimmed"; - } - } - - return wrapper; + return { + loaded: true, + config: this.config, + sourceTitle: item.sourceTitle, + publishDate: moment(new Date(item.pubdate)).fromNow(), + title: item.title, + description: item.description + }; }, getActiveItemURL: function () { @@ -257,6 +185,45 @@ Module.register("newsfeed", { }, this); } + newsItems.forEach((item) => { + //Remove selected tags from the beginning of rss feed items (title or description) + if (this.config.removeStartTags === "title" || this.config.removeStartTags === "both") { + for (let f = 0; f < this.config.startTags.length; f++) { + if (item.title.slice(0, this.config.startTags[f].length) === this.config.startTags[f]) { + item.title = item.title.slice(this.config.startTags[f].length, item.title.length); + } + } + } + + if (this.config.removeStartTags === "description" || this.config.removeStartTags === "both") { + if (this.isShowingDescription) { + for (let f = 0; f < this.config.startTags.length; f++) { + if (item.description.slice(0, this.config.startTags[f].length) === this.config.startTags[f]) { + item.description = item.description.slice(this.config.startTags[f].length, item.description.length); + } + } + } + } + + //Remove selected tags from the end of rss feed items (title or description) + + if (this.config.removeEndTags) { + for (let f = 0; f < this.config.endTags.length; f++) { + if (item.title.slice(-this.config.endTags[f].length) === this.config.endTags[f]) { + item.title = item.title.slice(0, -this.config.endTags[f].length); + } + } + + if (this.isShowingDescription) { + for (let f = 0; f < this.config.endTags.length; f++) { + if (item.description.slice(-this.config.endTags[f].length) === this.config.endTags[f]) { + item.description = item.description.slice(0, -this.config.endTags[f].length); + } + } + } + } + }); + // get updated news items and broadcast them var updatedItems = []; newsItems.forEach((value) => { @@ -335,8 +302,7 @@ Module.register("newsfeed", { this.config.showFullArticle = false; this.scrollPosition = 0; // reset bottom bar alignment - document.getElementsByClassName("region bottom bar")[0].style.bottom = "0"; - document.getElementsByClassName("region bottom bar")[0].style.top = "inherit"; + document.getElementsByClassName("region bottom bar")[0].classList.remove("newsfeed-fullarticle"); if (!this.timer) { this.scheduleUpdateInterval(); } @@ -344,7 +310,9 @@ Module.register("newsfeed", { notificationReceived: function (notification, payload, sender) { const before = this.activeItem; - if (notification === "ARTICLE_NEXT") { + if (notification === "MODULE_DOM_CREATED" && this.config.hideLoading) { + this.hide(); + } else if (notification === "ARTICLE_NEXT") { this.activeItem++; if (this.activeItem >= this.newsItems.length) { this.activeItem = 0; @@ -406,8 +374,7 @@ Module.register("newsfeed", { this.config.showFullArticle = !this.isShowingDescription; // make bottom bar align to top to allow scrolling if (this.config.showFullArticle === true) { - document.getElementsByClassName("region bottom bar")[0].style.bottom = "inherit"; - document.getElementsByClassName("region bottom bar")[0].style.top = "-90px"; + document.getElementsByClassName("region bottom bar")[0].classList.add("newsfeed-fullarticle"); } clearInterval(this.timer); this.timer = null; diff --git a/modules/default/newsfeed/newsfeed.njk b/modules/default/newsfeed/newsfeed.njk new file mode 100644 index 00000000..3d9ecc0b --- /dev/null +++ b/modules/default/newsfeed/newsfeed.njk @@ -0,0 +1,28 @@ +{% if loaded %} +
+ {% if (config.showSourceTitle and sourceTitle) or config.showPublishDate %} +
+ {% if sourceTitle and config.showSourceTitle %} + {{ sourceTitle }}{% if config.showPublishDate %}, {% else %}: {% endif %} + {% endif %} + {% if config.showPublishDate %} + {{ publishDate }}: + {% endif %} +
+ {% endif %} +
+ {{ title }} +
+
+ {% if config.truncDescription %} + {{ description | truncate(config.lengthDescription) }} + {% else %} + {{ description }} + {% endif %} +
+
+{% else %} +
+ {{ "LOADING" | translate | safe }} +
+{% endif %} \ No newline at end of file diff --git a/modules/default/newsfeed/oldconfig.njk b/modules/default/newsfeed/oldconfig.njk new file mode 100644 index 00000000..db0f8d4b --- /dev/null +++ b/modules/default/newsfeed/oldconfig.njk @@ -0,0 +1,3 @@ +
+ {{ "MODULE_CONFIG_CHANGED" | translate({MODULE_NAME: "Newsfeed"}) | safe }} +
\ No newline at end of file