From b52da7c9fc06b9de05dd8f7018d933c5047588b3 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Tue, 1 Jan 2019 17:15:37 +0100 Subject: [PATCH 01/69] Prepare for 2.7.0 dev branch. --- CHANGELOG.md | 12 ++++++++++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cee21d5645..b990c080a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ This project adheres to [Semantic Versioning](http://semver.org/). --- +## [2.7.0] - Unreleased + +*This release is scheduled to be released on 2019-04-01.* + +### Added + +### Updated + +### Fixed + ## [2.6.0] - 2019-01-01 ℹ️ **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`. If you are having issues updating, make sure you are running the latest version of Node. @@ -12,6 +22,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### ✨ Experimental ✨ - New default [module weather](modules/default/weather). This module will eventually replace the current `currentweather` and `weatherforecast` modules. The new module is still pretty experimental, but it's included so you can give it a try and help us improve this module. Please give us you feedback using [this forum post](https://forum.magicmirror.builders/topic/9335/default-weather-module-refactoring). +A huge, huge, huge thanks to user @fewieden for all his hard work on the new `weather` module! + ### Added - Possibility to add classes to the cell of symbol, title and time of the events of calendar. - Font-awesome 5, still has 4 for backwards compatibility. diff --git a/package-lock.json b/package-lock.json index 281f5adada..7e37e07bf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.6.0", + "version": "2.7.0-develop", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4c8f24dd08..5a657153f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "magicmirror", - "version": "2.6.0", + "version": "2.7.0-develop", "description": "The open source modular smart mirror platform.", "main": "js/electron.js", "scripts": { From 3541d5addee28810417c1d32753e8508d73ca08a Mon Sep 17 00:00:00 2001 From: fwitte Date: Thu, 3 Jan 2019 12:06:52 +0100 Subject: [PATCH 02/69] removed degree symbol display for Kelvin scale, match source code in currentweather and weatherforecast --- modules/default/currentweather/currentweather.js | 12 ++++++------ modules/default/weatherforecast/weatherforecast.js | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/default/currentweather/currentweather.js b/modules/default/currentweather/currentweather.js index 18ae3c7182..7285bd2e19 100644 --- a/modules/default/currentweather/currentweather.js +++ b/modules/default/currentweather/currentweather.js @@ -201,13 +201,13 @@ Module.register("currentweather",{ if (this.config.degreeLabel) { switch (this.config.units ) { case "metric": - degreeLabel = "C"; + degreeLabel = " °C"; break; case "imperial": - degreeLabel = "F"; + degreeLabel = " °F"; break; case "default": - degreeLabel = "K"; + degreeLabel = " K"; break; } } @@ -218,7 +218,7 @@ Module.register("currentweather",{ var temperature = document.createElement("span"); temperature.className = "bright"; - temperature.innerHTML = " " + this.temperature.replace(".", this.config.decimalSymbol) + "°" + degreeLabel; + temperature.innerHTML = " " + this.temperature.replace(".", this.config.decimalSymbol) + degreeLabel; large.appendChild(temperature); if (this.config.showIndoorTemperature && this.indoorTemperature) { @@ -228,7 +228,7 @@ Module.register("currentweather",{ var indoorTemperatureElem = document.createElement("span"); indoorTemperatureElem.className = "bright"; - indoorTemperatureElem.innerHTML = " " + this.indoorTemperature.replace(".", this.config.decimalSymbol) + "°" + degreeLabel; + indoorTemperatureElem.innerHTML = " " + this.indoorTemperature.replace(".", this.config.decimalSymbol) + degreeLabel; large.appendChild(indoorTemperatureElem); } @@ -251,7 +251,7 @@ Module.register("currentweather",{ var feelsLike = document.createElement("span"); feelsLike.className = "dimmed"; - feelsLike.innerHTML = this.translate("FEELS") + " " + this.feelsLike + "°" + degreeLabel; + feelsLike.innerHTML = this.translate("FEELS") + " " + this.feelsLike + degreeLabel; small.appendChild(feelsLike); wrapper.appendChild(small); diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js index a29abc1631..3afc7f7483 100644 --- a/modules/default/weatherforecast/weatherforecast.js +++ b/modules/default/weatherforecast/weatherforecast.js @@ -142,17 +142,17 @@ Module.register("weatherforecast",{ icon.className = "wi weathericon " + forecast.icon; iconCell.appendChild(icon); - var degreeLabel = "°"; + var degreeLabel = ""; if(this.config.scale) { switch(this.config.units) { case "metric": - degreeLabel += " C"; + degreeLabel = " °C"; break; case "imperial": - degreeLabel += " F"; + degreeLabel = " °F"; break; case "default": - degreeLabel = "K"; + degreeLabel = " K"; break; } } From c8f53bdf8e70a9c946e35691f60c72e690b8569c Mon Sep 17 00:00:00 2001 From: fwitte Date: Thu, 3 Jan 2019 12:35:52 +0100 Subject: [PATCH 03/69] updated CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b990c080a2..bef62f3373 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Updated ### Fixed +- Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503). ## [2.6.0] - 2019-01-01 From e1fe8d1d89a96fd039ff5411d03aa3e5a3ac2452 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Thu, 3 Jan 2019 16:04:33 +0100 Subject: [PATCH 04/69] Bump Electron to v3.0.13 - Issue: #1500 --- CHANGELOG.md | 3 + package-lock.json | 711 ++++++++++++++++++++++------------------------ package.json | 2 +- 3 files changed, 344 insertions(+), 372 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bef62f3373..d47f3fa771 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,9 +9,12 @@ This project adheres to [Semantic Versioning](http://semver.org/). *This release is scheduled to be released on 2019-04-01.* +ℹ️ **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`. If you are having issues running Electron, make sure your [Raspbian is up to date](https://www.raspberrypi.org/documentation/raspbian/updating.md). + ### Added ### Updated +- Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500) ### Fixed - Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503). diff --git a/package-lock.json b/package-lock.json index 7e37e07bf6..124aa86491 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,63 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "@octokit/rest": { "version": "14.0.5", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-14.0.5.tgz", @@ -85,13 +142,10 @@ } }, "acorn-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", - "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==", - "dev": true, - "requires": { - "acorn": "^5.0.3" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", + "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "dev": true }, "after": { "version": "0.8.2", @@ -395,6 +449,12 @@ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -441,17 +501,6 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, "babel-polyfill": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", @@ -1225,9 +1274,9 @@ }, "dependencies": { "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true } } @@ -1470,24 +1519,6 @@ "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", "dev": true }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - }, - "dependencies": { - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - } - } - }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", @@ -1663,12 +1694,12 @@ "dev": true }, "electron": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.16.tgz", - "integrity": "sha512-mlC91VDuBU8x9tdGGISznrBCsnPKO1tBskXtBQhceBt0zWUZtV6eURVF5RaY5QK5Q+eBzVJbFT4+LUVupNwhSg==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/electron/-/electron-3.0.13.tgz", + "integrity": "sha512-tfx5jFgXhCmpe6oPjcesaRj7geHqQxrJdbpseanRzL9BbyYUtsj0HoxwPAUvCx4+52P6XryBwWTvne/1eBVf9Q==", "requires": { "@types/node": "^8.0.24", - "electron-download": "^3.0.1", + "electron-download": "^4.1.0", "extract-zip": "^1.0.3" } }, @@ -1727,19 +1758,39 @@ } }, "electron-download": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", - "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", + "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", "requires": { - "debug": "^2.2.0", - "fs-extra": "^0.30.0", - "home-path": "^1.0.1", + "debug": "^3.0.0", + "env-paths": "^1.0.0", + "fs-extra": "^4.0.1", "minimist": "^1.2.0", - "nugget": "^2.0.0", - "path-exists": "^2.1.0", - "rc": "^1.1.2", - "semver": "^5.3.0", - "sumchecker": "^1.2.0" + "nugget": "^2.0.1", + "path-exists": "^3.0.0", + "rc": "^1.2.1", + "semver": "^5.4.1", + "sumchecker": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } } }, "electron-to-chromium": { @@ -1843,8 +1894,7 @@ "env-paths": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", - "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", - "dev": true + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=" }, "error-ex": { "version": "1.3.1", @@ -1854,34 +1904,11 @@ "is-arrayish": "^0.2.1" } }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" - } - }, "es6-promise": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.2.tgz", - "integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ==" + "integrity": "sha512-LSas5vsuA6Q4nEdf9wokY5/AJYXry98i0IzXsv49rYsgDGDNDPbqAYR1Pe23iFxygfbGZNR/5VrHXBCh2BhvUQ==", + "dev": true }, "es6-promisify": { "version": "5.0.0", @@ -1931,32 +1958,31 @@ } }, "eslint": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.1.0.tgz", - "integrity": "sha512-DyH6JsoA1KzA5+OSWFjg56DFJT+sDLO0yokaPZ9qY0UEmYrPA1gEX/G1MnVkmRDsksG4H1foIVz2ZXXM3hHYvw==", + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.11.1.tgz", + "integrity": "sha512-gOKhM8JwlFOc2acbOrkYR05NW8M6DCMSvfcJiBB5NDxRE1gv8kbvxKaC9u69e6ZGEMWXcswA/7eKR229cEIpvg==", "dev": true, "requires": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", + "@babel/code-frame": "^7.0.0", + "ajv": "^6.5.3", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", - "debug": "^3.1.0", + "debug": "^4.0.1", "doctrine": "^2.1.0", "eslint-scope": "^4.0.0", "eslint-utils": "^1.3.1", "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", + "espree": "^5.0.0", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", "functional-red-black-tree": "^1.0.1", "glob": "^7.1.2", "globals": "^11.7.0", - "ignore": "^3.3.3", + "ignore": "^4.0.6", "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", + "inquirer": "^6.1.0", + "js-yaml": "^3.12.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", "lodash": "^4.17.5", @@ -1967,34 +1993,15 @@ "path-is-inside": "^1.0.2", "pluralize": "^7.0.0", "progress": "^2.0.0", - "regexpp": "^1.1.0", + "regexpp": "^2.0.1", "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "string.prototype.matchall": "^2.0.0", + "semver": "^5.5.1", "strip-ansi": "^4.0.0", "strip-json-comments": "^2.0.1", - "table": "^4.0.3", + "table": "^5.0.2", "text-table": "^0.2.0" }, "dependencies": { - "ajv": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", - "integrity": "sha512-hOs7GfvI6tUI1LfZddH82ky6mOMyTuY0mk7kE2pWpmhhUSkumzaTO5vbVwij39MdwPQWCV4Zv57Eo06NtL/GVA==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.1" - } - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", @@ -2022,18 +2029,18 @@ } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "fast-deep-equal": { @@ -2048,6 +2055,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -2071,38 +2084,31 @@ "dev": true }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", + "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==", "dev": true, "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, @@ -2126,26 +2132,38 @@ } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz", + "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==", "dev": true, "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", + "ajv": "^6.6.1", + "lodash": "^4.17.11", + "slice-ansi": "2.0.0", "string-width": "^2.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } } } } @@ -2173,19 +2191,20 @@ "dev": true }, "espree": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz", - "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz", + "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==", "dev": true, "requires": { - "acorn": "^5.6.0", - "acorn-jsx": "^4.1.1" + "acorn": "^6.0.2", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" }, "dependencies": { "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", "dev": true } } @@ -2228,7 +2247,7 @@ }, "eventemitter2": { "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", "dev": true }, @@ -2574,7 +2593,7 @@ }, "findup-sync": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", "dev": true, "requires": { @@ -2623,12 +2642,6 @@ "for-in": "^1.0.1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "foreachasync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", @@ -2667,15 +2680,23 @@ "dev": true }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "requires": { "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "dependencies": { + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + } } }, "fs.realpath": { @@ -2683,12 +2704,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -2779,9 +2794,9 @@ } }, "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", + "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==", "dev": true }, "globby": { @@ -2891,7 +2906,7 @@ }, "grunt-cli": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", "dev": true, "requires": { @@ -2901,28 +2916,29 @@ "resolve": "~1.1.0" } }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } } } @@ -2964,9 +2980,9 @@ "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -2985,9 +3001,9 @@ } }, "grunt-known-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", + "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", "dev": true }, "grunt-legacy-log": { @@ -3003,9 +3019,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true } } @@ -3047,15 +3063,15 @@ "dev": true }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -3079,9 +3095,9 @@ }, "dependencies": { "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true } } @@ -3120,9 +3136,9 @@ } }, "grunt-stylelint": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.10.0.tgz", - "integrity": "sha512-1HC3H1CZlK3niJGORr+1nmcdtogoSiZex7ej9MtJPXVmxrvWvXTVhZppKoPVVQgHRvNozmtGCZTZr7c9kMPO5g==", + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.10.1.tgz", + "integrity": "sha512-7MAHUqySn2x0yCS4SEkrv5pVoTrP44j8IZGEF6UTQD9Nm7K96cGEhB6FFMWk+uXbRHiiU+c4s3B0h4rpT8nOyQ==", "dev": true, "requires": { "chalk": "1.1.3" @@ -3199,15 +3215,6 @@ } } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -3249,12 +3256,6 @@ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -3493,23 +3494,23 @@ "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" }, "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^2.1.0", + "external-editor": "^3.0.0", "figures": "^2.0.0", - "lodash": "^4.3.0", + "lodash": "^4.17.10", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rxjs": "^5.5.2", + "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" }, "dependencies": { @@ -3539,14 +3540,20 @@ "supports-color": "^5.3.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", "dev": true, "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, @@ -3556,6 +3563,15 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -3563,9 +3579,9 @@ "dev": true }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "string-width": { @@ -3576,34 +3592,44 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + } } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } } } }, @@ -3664,18 +3690,6 @@ "builtin-modules": "^1.0.0" } }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, "is-decimal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz", @@ -3809,27 +3823,12 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -3842,12 +3841,6 @@ "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=", "dev": true }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -3910,9 +3903,9 @@ "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { @@ -4137,6 +4130,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -4183,14 +4177,6 @@ "is-buffer": "^1.1.5" } }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", @@ -4681,9 +4667,9 @@ } }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz", + "integrity": "sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA==" }, "ms": { "version": "2.0.0", @@ -4708,9 +4694,9 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "nocache": { @@ -5456,9 +5442,9 @@ "dev": true }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "progress-stream": { @@ -5642,19 +5628,10 @@ "is-equal-shallow": "^0.1.3" } }, - "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2" - } - }, "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "remark": { @@ -5836,7 +5813,7 @@ }, "require-uncached": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { @@ -5846,7 +5823,7 @@ }, "resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, @@ -5888,6 +5865,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, "requires": { "glob": "^7.0.5" } @@ -5922,12 +5900,12 @@ } }, "rxjs": { - "version": "5.5.11", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", - "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { - "symbol-observable": "1.0.1" + "tslib": "^1.9.0" } }, "safe-buffer": { @@ -6237,19 +6215,6 @@ "strip-ansi": "^3.0.0" } }, - "string.prototype.matchall": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-2.0.0.tgz", - "integrity": "sha512-WoZ+B2ypng1dp4iFLF2kmZlwwlE19gmjgKuhL1FJfDgCREWb3ye3SDVHSzLH6bxfnvYmkCxbzkmWcQZHA4P//Q==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "regexp.prototype.flags": "^1.2.0" - } - }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -6680,12 +6645,11 @@ } }, "sumchecker": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", - "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", "requires": { - "debug": "^2.2.0", - "es6-promise": "^4.0.5" + "debug": "^2.2.0" } }, "supports-color": { @@ -6721,12 +6685,6 @@ "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", "dev": true }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - }, "symbol-tree": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", @@ -6982,6 +6940,12 @@ "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=", "dev": true }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -7037,9 +7001,9 @@ "dev": true }, "underscore.string": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", + "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", "dev": true, "requires": { "sprintf-js": "^1.0.3", @@ -7133,6 +7097,11 @@ "unist-util-is": "^2.1.1" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "unix-crypt-td-js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", diff --git a/package.json b/package.json index 5a657153f9..3180f70d66 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "ajv": "6.5.5", "body-parser": "^1.18.2", "colors": "^1.1.2", - "electron": "^2.0.16", + "electron": "^3.0.13", "express": "^4.16.2", "express-ipfilter": "0.3.1", "feedme": "latest", From f3847ec6f350a924b123def0882e579e7087e2d6 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Thu, 3 Jan 2019 16:35:30 +0100 Subject: [PATCH 05/69] Bump Node version to 8. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 62cc10a375..d98a72cd35 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - "7" + - "8" before_script: - yarn danger ci - npm install grunt-cli -g From 6914465e3dc357b3e15af77f829dedc1ec058bbd Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Thu, 3 Jan 2019 16:42:31 +0100 Subject: [PATCH 06/69] Remove "Focus" to pass test. --- tests/e2e/env_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/env_spec.js b/tests/e2e/env_spec.js index 9454b92e8f..4bcfc4e8a8 100644 --- a/tests/e2e/env_spec.js +++ b/tests/e2e/env_spec.js @@ -36,7 +36,7 @@ describe("Electron app environment", function() { it("should open a browserwindow", function() { return app.client .waitUntilWindowLoaded() - .browserWindow.focus() + // .browserWindow.focus() .getWindowCount() .should.eventually.equal(1) .browserWindow.isMinimized() From 2156aac0469418a95dc5507b9ba0c716fd7f3c35 Mon Sep 17 00:00:00 2001 From: fwitte Date: Fri, 4 Jan 2019 12:07:02 +0100 Subject: [PATCH 07/69] fixed typos, fetching forecast parameters by day --- .../weather/providers/openweathermap.js | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index 89ccfcf5d0..c156d78770 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -88,24 +88,48 @@ WeatherProvider.register("openweathermap", { */ generateWeatherObjectsFromForecast(forecasts) { const days = []; + var minTemp = []; + var maxTemp = []; + var rain = 0; + let date = ""; + var weather = new WeatherObject(this.config.units); for (const forecast of forecasts) { - const weather = new WeatherObject(this.config.units); - - weather.date = moment(forecast.dt, "X"); - weather.minTemperature = forecast.temp.min; - weather.maxTemperature = forecast.temp.max; - weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); - if (this.config.units === "imperial" && !isNaN(forecast.rain)) { - weather.rain = forecast.rain / 25.4 + + if (date === moment(forecast.dt, "X").format("YYYY-MM-DD")) { + minTemp.push(forecast.main.temp_min); + maxTemp.push(forecast.main.temp_max); + if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { + rain += forecast.rain["3h"] / 25.4; + } else { + rain += forecast.rain["3h"]; + } } else { - weather.rain = forecast.rain; + weather.minTemperature = Math.min.apply(null, minTemp); + weather.maxTemperature = Math.max.apply(null, maxTemp); + weather.rain = rain; + days.push(weather); + weather = new WeatherObject(this.config.units); + + minTemp = []; + maxTemp = []; + rain *= 0; + date = moment(forecast.dt, "X").format("YYYY-MM-DD"); + + weather.date = moment(forecast.dt, "X"); + weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); + + minTemp.push(forecast.main.temp_min); + maxTemp.push(forecast.main.temp_max); + if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { + rain += forecast.rain["3h"] / 25.4; + } else { + rain += forecast.rain["3h"]; + } } - - days.push(weather); } - - return days; + + return days.slice(1); }, /* From b55685d610019a354763a5215ecc02bd59c0873c Mon Sep 17 00:00:00 2001 From: fwitte Date: Fri, 4 Jan 2019 12:13:39 +0100 Subject: [PATCH 08/69] added comments --- .../default/weather/providers/openweathermap.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index c156d78770..64df410416 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -87,16 +87,21 @@ WeatherProvider.register("openweathermap", { * Generate WeatherObjects based on forecast information */ generateWeatherObjectsFromForecast(forecasts) { + // initial variable declaration const days = []; + // variables for temperature range and rain var minTemp = []; var maxTemp = []; var rain = 0; + // variable for date let date = ""; var weather = new WeatherObject(this.config.units); for (const forecast of forecasts) { if (date === moment(forecast.dt, "X").format("YYYY-MM-DD")) { + // the same day as before + // add values from forecast to corresponding variables minTemp.push(forecast.main.temp_min); maxTemp.push(forecast.main.temp_max); if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { @@ -105,20 +110,30 @@ WeatherProvider.register("openweathermap", { rain += forecast.rain["3h"]; } } else { + // a new day + // calculate minimum/maximum temperature, specify rain amount weather.minTemperature = Math.min.apply(null, minTemp); weather.maxTemperature = Math.max.apply(null, maxTemp); weather.rain = rain; + // push weather information to days array days.push(weather); + // create new weather-object weather = new WeatherObject(this.config.units); minTemp = []; maxTemp = []; rain *= 0; + + // set new date date = moment(forecast.dt, "X").format("YYYY-MM-DD"); + // specify date weather.date = moment(forecast.dt, "X"); + + // select weather type by first forecast value of a day, is this reasonable? weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); + // add values from first forecast of this day to corresponding variables minTemp.push(forecast.main.temp_min); maxTemp.push(forecast.main.temp_max); if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { From 9e394ea349c23dfaa67984601aeafc2dcfe60234 Mon Sep 17 00:00:00 2001 From: fwitte Date: Fri, 4 Jan 2019 12:34:12 +0100 Subject: [PATCH 09/69] updated CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b990c080a2..913e95c3cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Updated ### Fixed +- Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). ## [2.6.0] - 2019-01-01 From 1df2de92026ddcd68b8f1250b9fa205a8b843fde Mon Sep 17 00:00:00 2001 From: fwitte Date: Fri, 4 Jan 2019 12:34:29 +0100 Subject: [PATCH 10/69] updated README --- modules/default/weather/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md index 89e65de135..d10297d173 100644 --- a/modules/default/weather/README.md +++ b/modules/default/weather/README.md @@ -78,7 +78,7 @@ The following properties can be configured: | ---------------------------- | ----------- | `apiVersion` | The OpenWeatherMap API version to use.

**Default value:** `2.5` | `apiBase` | The OpenWeatherMap base URL.

**Default value:** `'http://api.openweathermap.org/data/'` -| `weatherEndpoint` | The OpenWeatherMap API endPoint.

**Possible values:** `/weather` or `/forecast/daily`
**Default value:** `'/weather'` +| `weatherEndpoint` | The OpenWeatherMap API endPoint.

**Possible values:** `/weather`, `/forecast` or `/forecast/daily` (paying users only)
**Default value:** `'/weather'` | `locationID` | Location ID from [OpenWeatherMap](https://openweathermap.org/find) **This will override anything you put in location.**
Leave blank if you want to use location.
**Example:** `1234567`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. | `location` | The location used for weather information.

**Example:** `'Amsterdam,Netherlands'`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. | `apiKey` | The [OpenWeatherMap](https://home.openweathermap.org) API key, which can be obtained by creating an OpenWeatherMap account.

This value is **REQUIRED** From a257b15f86448785b4124e594a6d565ab2334955 Mon Sep 17 00:00:00 2001 From: shbatm Date: Fri, 4 Jan 2019 09:23:10 -0600 Subject: [PATCH 11/69] Error handling for bad git data in updatenotification Update CHANGELOG --- CHANGELOG.md | 1 + modules/default/updatenotification/node_helper.js | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d47f3fa771..d5c35403cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed - Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503). +- Fixed unhandled error on bad git data in updatenotiifcation module [#1285](https://github.com/MichMich/MagicMirror/issues/1285). ## [2.6.0] - 2019-01-01 diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js index df989faa36..9d27875167 100644 --- a/modules/default/updatenotification/node_helper.js +++ b/modules/default/updatenotification/node_helper.js @@ -65,8 +65,10 @@ module.exports = NodeHelper.create({ data.module = sg.module; if (!err) { sg.git.log({"-1": null}, function(err, data2) { - data.hash = data2.latest.hash; - self.sendSocketNotification("STATUS", data); + if (!err) { + data.hash = data2.latest.hash; + self.sendSocketNotification("STATUS", data); + } }); } }); From b9d6a235e3591b561b5c340ecf3af0003b842207 Mon Sep 17 00:00:00 2001 From: shbatm Date: Fri, 4 Jan 2019 12:37:58 -0600 Subject: [PATCH 12/69] Fixes Incomplete fix for MichMich/MagicMirror#1507 --- modules/default/updatenotification/node_helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js index 9d27875167..25c088bad8 100644 --- a/modules/default/updatenotification/node_helper.js +++ b/modules/default/updatenotification/node_helper.js @@ -65,7 +65,7 @@ module.exports = NodeHelper.create({ data.module = sg.module; if (!err) { sg.git.log({"-1": null}, function(err, data2) { - if (!err) { + if (!err && data2.latest) { data.hash = data2.latest.hash; self.sendSocketNotification("STATUS", data); } From dc363de61037c7608e3ef37cdb59f472b176d279 Mon Sep 17 00:00:00 2001 From: fewieden Date: Fri, 4 Jan 2019 19:43:07 +0100 Subject: [PATCH 13/69] fix weather forecast table height --- modules/default/weather/weather.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/default/weather/weather.css b/modules/default/weather/weather.css index dfa2b12adb..3a061bd4bd 100644 --- a/modules/default/weather/weather.css +++ b/modules/default/weather/weather.css @@ -36,6 +36,10 @@ padding-right: 0; } +.weather tr .weathericon { + line-height: 25px; +} + .weather tr.colored .min-temp { color: #bcddff; } From 827fbfb78f1d120b84d1fe84661e8fbbf1537634 Mon Sep 17 00:00:00 2001 From: fewieden Date: Fri, 4 Jan 2019 19:43:48 +0100 Subject: [PATCH 14/69] dimmed loading indicator for weather forecast --- modules/default/weather/forecast.njk | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index 1f24786702..556a98ff05 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -1,25 +1,27 @@ {% if forecast %} - +
{% for f in forecast %} - - + + {% if config.showRainAmount %} {% endif %} {% endfor %}
{{f.date.format('ddd')}}{{ f.date.format('ddd') }} - {{f.maxTemperature | roundValue | unit("temperature")}} + {{ f.maxTemperature | roundValue | unit("temperature") }} - {{f.minTemperature | roundValue | unit("temperature")}} + {{ f.minTemperature | roundValue | unit("temperature") }} - {{f.rain | unit("rain")}} + {{ f.rain | unit("rain") }}
{% else %} - {{"LOADING" | translate}} +
+ {{ "LOADING" | translate }} +
{% endif %} From 5759ed3728b1329502e0dbfffa109caa5e69473b Mon Sep 17 00:00:00 2001 From: fewieden Date: Fri, 4 Jan 2019 19:46:54 +0100 Subject: [PATCH 15/69] implemented config option decimal symbol, align indoor elements vertical, add humidity support to nunjuck unit filter, do not display degree symbol for kelvin --- modules/default/weather/current.njk | 45 ++++++++++++++++------------- modules/default/weather/weather.js | 11 ++++++- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index aed51ac6bb..55720e23e1 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -4,31 +4,30 @@ {% if config.useBeaufort %} - {{current.beaufortWindSpeed() | round}} + {{ current.beaufortWindSpeed() | round }} {% else %} - {{current.windSpeed | round}} + {{ current.windSpeed | round }} {% endif %} - {% if config.showWindDirection %} {% if config.showWindDirectionAsArrow %} - + {% else %} - {{current.cardinalWindDirection() | translate}} + {{ current.cardinalWindDirection() | translate }} {% endif %}   {% endif %} {% if config.showHumidity and current.humidity %} - {{ current.humidity }}  + {{ current.humidity | decimalSymbol }}  {% endif %} - + {% if current.nextSunAction() == "sunset" %} - {{current.sunset | formatTime}} + {{ current.sunset | formatTime }} {% else %} - {{current.sunrise | formatTime}} + {{ current.sunrise | formatTime }} {% endif %} @@ -36,31 +35,37 @@
- {{current.temperature | roundValue | unit("temperature")}} + {{ current.temperature | roundValue | unit("temperature") | decimalSymbol }} +
+
{% if config.showIndoorTemperature and indoor.temperature %} - - - {{indoor.temperature | roundValue | unit("temperature")}} - +
+ + + {{ indoor.temperature | roundValue | unit("temperature") | decimalSymbol }} + +
{% endif %} {% if config.showIndoorHumidity and indoor.humidity %} - - - {{indoor.humidity | roundValue}}% - +
+ + + {{ indoor.humidity | roundValue | unit("humidity") | decimalSymbol }} + +
{% endif %}
{% if config.showFeelsLike and not config.onlyTemp %}
- {{ "FEELS" | translate }} {{ current.feelsLike() | roundValue | unit("temperature") }} + {{ "FEELS" | translate }} {{ current.feelsLike() | roundValue | unit("temperature") | decimalSymbol }}
{% endif %} {% else %}
- {{"LOADING" | translate}} + {{ "LOADING" | translate }}
{% endif %} diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index eff3f90e98..52e9cfee5d 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -30,6 +30,7 @@ Module.register("weather",{ lang: config.language, showHumidity: false, degreeLabel: false, + decimalSymbol: ".", showIndoorTemperature: false, showIndoorHumidity: false, @@ -184,7 +185,9 @@ Module.register("weather",{ this.nunjucksEnvironment().addFilter("unit", function (value, type) { if (type === "temperature") { - value += "°"; + if (this.config.units === "metric" || this.config.units === "imperial") { + value += "°"; + } if (this.config.degreeLabel) { if (this.config.units === "metric") { value += "C"; @@ -200,6 +203,8 @@ Module.register("weather",{ } else { value = `${value.toFixed(2)} ${this.config.units === "imperial" ? "in" : "mm"}`; } + } else if (type === "humidity") { + value += "%" } return value; @@ -208,5 +213,9 @@ Module.register("weather",{ this.nunjucksEnvironment().addFilter("roundValue", function(value) { return this.roundValue(value); }.bind(this)); + + this.nunjucksEnvironment().addFilter("decimalSymbol", function(value) { + return value.replace(/\./g, this.config.decimalSymbol); + }.bind(this)); } }); From 1f62b8f0b6d0d7c68e16c83087fd00bb45a5efa2 Mon Sep 17 00:00:00 2001 From: shbatm Date: Fri, 4 Jan 2019 18:12:12 -0600 Subject: [PATCH 16/69] Update node_helper.js --- modules/default/updatenotification/node_helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/updatenotification/node_helper.js b/modules/default/updatenotification/node_helper.js index 25c088bad8..f4014519c4 100644 --- a/modules/default/updatenotification/node_helper.js +++ b/modules/default/updatenotification/node_helper.js @@ -65,7 +65,7 @@ module.exports = NodeHelper.create({ data.module = sg.module; if (!err) { sg.git.log({"-1": null}, function(err, data2) { - if (!err && data2.latest) { + if (!err && data2.latest && "hash" in data2.latest) { data.hash = data2.latest.hash; self.sendSocketNotification("STATUS", data); } From 5d22dbd99e6fa008e8e41757f96640de48784f72 Mon Sep 17 00:00:00 2001 From: fewieden Date: Sat, 5 Jan 2019 10:26:13 +0100 Subject: [PATCH 17/69] changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f34cbf9f74..07c9206915 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,14 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fixed unhandled error on bad git data in updatenotiifcation module [#1285](https://github.com/MichMich/MagicMirror/issues/1285). - Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). +### New weather module +- Fixed weather forecast table display. +- Dimmed loading indicator for weather forecast. +- Implemented config option `decimalSymbol`. +- Aligned indoor values in current weather vertical. +- Added humidity support to nunjuck unit filter. +- Do not display degree symbol for temperature in Kelvin. + ## [2.6.0] - 2019-01-01 ℹ️ **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`. If you are having issues updating, make sure you are running the latest version of Node. From b79b48baac929bcbf762f07ab6890713ce93caae Mon Sep 17 00:00:00 2001 From: fewieden Date: Sat, 5 Jan 2019 10:32:09 +0100 Subject: [PATCH 18/69] link issues to changelog --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07c9206915..1c346acef8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,10 +22,10 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). ### New weather module -- Fixed weather forecast table display. +- Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). - Dimmed loading indicator for weather forecast. -- Implemented config option `decimalSymbol`. -- Aligned indoor values in current weather vertical. +- Implemented config option `decimalSymbol` [#1499](https://github.com/MichMich/MagicMirror/issues/1499). +- Aligned indoor values in current weather vertical [#1499](https://github.com/MichMich/MagicMirror/issues/1499). - Added humidity support to nunjuck unit filter. - Do not display degree symbol for temperature in Kelvin. From aa6699cf3e611ced83893dc8c52ce8e91e788c1a Mon Sep 17 00:00:00 2001 From: fewieden Date: Sat, 5 Jan 2019 10:33:58 +0100 Subject: [PATCH 19/69] link issues to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c346acef8..75a849a2e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Implemented config option `decimalSymbol` [#1499](https://github.com/MichMich/MagicMirror/issues/1499). - Aligned indoor values in current weather vertical [#1499](https://github.com/MichMich/MagicMirror/issues/1499). - Added humidity support to nunjuck unit filter. -- Do not display degree symbol for temperature in Kelvin. +- Do not display degree symbol for temperature in Kelvin [#1503](https://github.com/MichMich/MagicMirror/issues/1503). ## [2.6.0] - 2019-01-01 From ba8685a122d824d21b8d242d96b8aa5d9cc7c8cf Mon Sep 17 00:00:00 2001 From: fwitte Date: Sat, 5 Jan 2019 13:13:53 +0100 Subject: [PATCH 20/69] readded degreesign --- modules/default/currentweather/currentweather.js | 13 ++++++++----- modules/default/weatherforecast/weatherforecast.js | 9 ++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/default/currentweather/currentweather.js b/modules/default/currentweather/currentweather.js index 7285bd2e19..2a6d24b948 100644 --- a/modules/default/currentweather/currentweather.js +++ b/modules/default/currentweather/currentweather.js @@ -198,16 +198,19 @@ Module.register("currentweather",{ large.appendChild(weatherIcon); var degreeLabel = ""; - if (this.config.degreeLabel) { - switch (this.config.units ) { + if (this.config.units === "metric" || this.config.units === "imperial") { + degreeLabel += "°"; + } + if(this.config.degreeLabel) { + switch(this.config.units) { case "metric": - degreeLabel = " °C"; + degreeLabel += "C"; break; case "imperial": - degreeLabel = " °F"; + degreeLabel += "F"; break; case "default": - degreeLabel = " K"; + degreeLabel += "K"; break; } } diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js index 3afc7f7483..671936966c 100644 --- a/modules/default/weatherforecast/weatherforecast.js +++ b/modules/default/weatherforecast/weatherforecast.js @@ -143,16 +143,19 @@ Module.register("weatherforecast",{ iconCell.appendChild(icon); var degreeLabel = ""; + if (this.config.units === "metric" || this.config.units === "imperial") { + degreeLabel += "°"; + } if(this.config.scale) { switch(this.config.units) { case "metric": - degreeLabel = " °C"; + degreeLabel += "C"; break; case "imperial": - degreeLabel = " °F"; + degreeLabel += "F"; break; case "default": - degreeLabel = " K"; + degreeLabel = "K"; break; } } From c2ff949f2d6d11e852c813b8d5e784f3d9752406 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sat, 5 Jan 2019 13:14:10 +0100 Subject: [PATCH 21/69] adjusted CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a849a2e6..51c62ed84f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500) ### Fixed -- Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503). +- Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503), [#1511](https://github.com/MichMich/MagicMirror/issues/1511). - Fixed unhandled error on bad git data in updatenotiifcation module [#1285](https://github.com/MichMich/MagicMirror/issues/1285). - Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). From 77640714cc47295de7ca39fbb57ef5cb13e4c322 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sat, 5 Jan 2019 16:54:45 +0100 Subject: [PATCH 22/69] adjusted openweathermap module to work with /forecast and forecast/daily --- .../weather/providers/openweathermap.js | 71 ++++++++++++++++--- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index 64df410416..53eca7df14 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -56,8 +56,6 @@ WeatherProvider.register("openweathermap", { }) }, - - /** OpenWeatherMap Specific Methods - These are not part of the default provider methods */ /* * Gets the complete url for the request @@ -87,6 +85,21 @@ WeatherProvider.register("openweathermap", { * Generate WeatherObjects based on forecast information */ generateWeatherObjectsFromForecast(forecasts) { + + if (this.config.weatherEndpoint == "/forecast") { + return this.fetchForecastHourly(forecasts); + } else if (this.config.weatherEndpoint == "/forecast/daily") { + return this.fetchForecastDaily(forecasts); + } + // if weatherEndpoint does not match forecast or forecast/daily, what should be returned? + const days = [new WeatherObject(this.config.units)]; + return days; + }, + + /* + * fetch forecast information for 3-hourly forecast (available for free subscription). + */ + fetchForecastHourly(forecasts) { // initial variable declaration const days = []; // variables for temperature range and rain @@ -96,7 +109,7 @@ WeatherProvider.register("openweathermap", { // variable for date let date = ""; var weather = new WeatherObject(this.config.units); - + for (const forecast of forecasts) { if (date === moment(forecast.dt, "X").format("YYYY-MM-DD")) { @@ -104,10 +117,17 @@ WeatherProvider.register("openweathermap", { // add values from forecast to corresponding variables minTemp.push(forecast.main.temp_min); maxTemp.push(forecast.main.temp_max); - if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { - rain += forecast.rain["3h"] / 25.4; + + if (forecast.hasOwnProperty("rain")) { + if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { + rain += forecast.rain["3h"] / 25.4; + } else if (!isNaN(forecast.rain["3h"])){ + rain += forecast.rain["3h"]; + } else { + rain += 0; + } } else { - rain += forecast.rain["3h"]; + rain += 0; } } else { // a new day @@ -122,7 +142,7 @@ WeatherProvider.register("openweathermap", { minTemp = []; maxTemp = []; - rain *= 0; + rain = 0; // set new date date = moment(forecast.dt, "X").format("YYYY-MM-DD"); @@ -138,15 +158,48 @@ WeatherProvider.register("openweathermap", { maxTemp.push(forecast.main.temp_max); if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { rain += forecast.rain["3h"] / 25.4; - } else { + } else if (!isNaN(forecast.rain["3h"])){ rain += forecast.rain["3h"]; } } } - return days.slice(1); }, + + /* + * fetch forecast information for daily forecast (available for paid subscription or old apiKey). + */ + fetchForecastDaily(forecasts) { + // initial variable declaration + const days = []; + for (const forecast of forecasts) { + const weather = new WeatherObject(this.config.units); + + weather.date = moment(forecast.dt, "X"); + weather.minTemperature = forecast.temp.min; + weather.maxTemperature = forecast.temp.max; + weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); + + // forecast.rain not available if amount is zero + if (forecast.hasOwnProperty("rain")) { + if (this.config.units === "imperial" && !isNaN(forecast.rain)) { + weather.rain = forecast.rain / 25.4; + } else if (!isNaN(forecast.rain["3h"])){ + weather.rain = forecast.rain; + } else { + weather.rain = 0; + } + } else { + weather.rain = 0; + } + + days.push(weather); + } + + return days; + }, + /* * Convert the OpenWeatherMap icons to a more usable name. */ From 9cbf33153365001b11c16868e4a91682973c8f13 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sat, 5 Jan 2019 16:56:47 +0100 Subject: [PATCH 23/69] fixed typo in daily data fetcher --- modules/default/weather/providers/openweathermap.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index 53eca7df14..f5d931c533 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -185,7 +185,7 @@ WeatherProvider.register("openweathermap", { if (forecast.hasOwnProperty("rain")) { if (this.config.units === "imperial" && !isNaN(forecast.rain)) { weather.rain = forecast.rain / 25.4; - } else if (!isNaN(forecast.rain["3h"])){ + } else if (!isNaN(forecast.rain)){ weather.rain = forecast.rain; } else { weather.rain = 0; From bdcc0c5373202056d5df445a9433ca39147913e0 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sat, 5 Jan 2019 17:16:19 +0100 Subject: [PATCH 24/69] another typo fix --- .../weather/providers/openweathermap.js | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index f5d931c533..b39da7601b 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -5,7 +5,7 @@ * * By Michael Teeuw http://michaelteeuw.nl * MIT Licensed. - * + * * This class is the blueprint for a weather provider. */ @@ -64,7 +64,7 @@ WeatherProvider.register("openweathermap", { return this.config.apiBase + this.config.apiVersion + this.config.weatherEndpoint + this.getParams(); }, - /* + /* * Generate a WeatherObject based on currentWeatherInformation */ generateWeatherObjectFromCurrentWeather(currentWeatherData) { @@ -85,7 +85,7 @@ WeatherProvider.register("openweathermap", { * Generate WeatherObjects based on forecast information */ generateWeatherObjectsFromForecast(forecasts) { - + if (this.config.weatherEndpoint == "/forecast") { return this.fetchForecastHourly(forecasts); } else if (this.config.weatherEndpoint == "/forecast/daily") { @@ -95,7 +95,7 @@ WeatherProvider.register("openweathermap", { const days = [new WeatherObject(this.config.units)]; return days; }, - + /* * fetch forecast information for 3-hourly forecast (available for free subscription). */ @@ -109,15 +109,15 @@ WeatherProvider.register("openweathermap", { // variable for date let date = ""; var weather = new WeatherObject(this.config.units); - + for (const forecast of forecasts) { - + if (date === moment(forecast.dt, "X").format("YYYY-MM-DD")) { // the same day as before // add values from forecast to corresponding variables minTemp.push(forecast.main.temp_min); maxTemp.push(forecast.main.temp_max); - + if (forecast.hasOwnProperty("rain")) { if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { rain += forecast.rain["3h"] / 25.4; @@ -139,33 +139,40 @@ WeatherProvider.register("openweathermap", { days.push(weather); // create new weather-object weather = new WeatherObject(this.config.units); - + minTemp = []; maxTemp = []; rain = 0; - + // set new date date = moment(forecast.dt, "X").format("YYYY-MM-DD"); - + // specify date weather.date = moment(forecast.dt, "X"); - + // select weather type by first forecast value of a day, is this reasonable? weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); - + // add values from first forecast of this day to corresponding variables minTemp.push(forecast.main.temp_min); maxTemp.push(forecast.main.temp_max); - if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { - rain += forecast.rain["3h"] / 25.4; - } else if (!isNaN(forecast.rain["3h"])){ - rain += forecast.rain["3h"]; + + if (forecast.hasOwnProperty("rain")) { + if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { + rain += forecast.rain["3h"] / 25.4; + } else if (!isNaN(forecast.rain["3h"])){ + rain += forecast.rain["3h"]; + } else { + rain += 0; + } + } else { + rain += 0; } } } return days.slice(1); }, - + /* * fetch forecast information for daily forecast (available for paid subscription or old apiKey). */ @@ -180,7 +187,7 @@ WeatherProvider.register("openweathermap", { weather.minTemperature = forecast.temp.min; weather.maxTemperature = forecast.temp.max; weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); - + // forecast.rain not available if amount is zero if (forecast.hasOwnProperty("rain")) { if (this.config.units === "imperial" && !isNaN(forecast.rain)) { @@ -199,7 +206,7 @@ WeatherProvider.register("openweathermap", { return days; }, - + /* * Convert the OpenWeatherMap icons to a more usable name. */ From 8431ebf2e81cc0a7a34bacbc8065924c8a2daa31 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sat, 5 Jan 2019 17:16:37 +0100 Subject: [PATCH 25/69] adjusted README --- modules/default/weather/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md index d10297d173..47c5387d17 100644 --- a/modules/default/weather/README.md +++ b/modules/default/weather/README.md @@ -78,17 +78,17 @@ The following properties can be configured: | ---------------------------- | ----------- | `apiVersion` | The OpenWeatherMap API version to use.

**Default value:** `2.5` | `apiBase` | The OpenWeatherMap base URL.

**Default value:** `'http://api.openweathermap.org/data/'` -| `weatherEndpoint` | The OpenWeatherMap API endPoint.

**Possible values:** `/weather`, `/forecast` or `/forecast/daily` (paying users only)
**Default value:** `'/weather'` +| `weatherEndpoint` | The OpenWeatherMap API endPoint.

**Possible values:** `/weather`, `/forecast` (free users) or `/forecast/daily` (paying users or old apiKey only)
**Default value:** `'/weather'` | `locationID` | Location ID from [OpenWeatherMap](https://openweathermap.org/find) **This will override anything you put in location.**
Leave blank if you want to use location.
**Example:** `1234567`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. | `location` | The location used for weather information.

**Example:** `'Amsterdam,Netherlands'`
**Default value:** `false`

**Note:** When the `location` and `locationID` are both not set, the location will be based on the information provided by the calendar module. The first upcoming event with location data will be used. -| `apiKey` | The [OpenWeatherMap](https://home.openweathermap.org) API key, which can be obtained by creating an OpenWeatherMap account.

This value is **REQUIRED** +| `apiKey` | The [OpenWeatherMap](https://home.openweathermap.org) API key, which can be obtained by creating an OpenWeatherMap account.

This value is **REQUIRED** ### Darksky options | Option | Description | ---------------------------- | ----------- | `apiBase` | The DarkSky base URL. The darksky api has disabled [cors](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS), therefore a proxy is required.

**Possible value:** `'https://cors-anywhere.herokuapp.com/https://api.darksky.net'`
This value is **REQUIRED** -| `weatherEndpoint` | The DarkSky API endPoint.

**Possible values:** `/forecast`
This value is **REQUIRED** +| `weatherEndpoint` | The DarkSky API endPoint.

**Possible values:** `/forecast`
This value is **REQUIRED** | `apiKey` | The [DarkSky](https://darksky.net/dev/register) API key, which can be obtained by creating an DarkSky account.

This value is **REQUIRED** | `lat` | The geo coordinate latitude.

This value is **REQUIRED** | `lon` | The geo coordinate longitude.

This value is **REQUIRED** From 40a65eec51a8b9acee62afa72260dba28d8591b7 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sat, 5 Jan 2019 17:16:50 +0100 Subject: [PATCH 26/69] adjusted CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a849a2e6..1fce37242b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,6 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Fixed - Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503). - Fixed unhandled error on bad git data in updatenotiifcation module [#1285](https://github.com/MichMich/MagicMirror/issues/1285). -- Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). ### New weather module - Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). @@ -28,6 +27,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Aligned indoor values in current weather vertical [#1499](https://github.com/MichMich/MagicMirror/issues/1499). - Added humidity support to nunjuck unit filter. - Do not display degree symbol for temperature in Kelvin [#1503](https://github.com/MichMich/MagicMirror/issues/1503). +- Weather forecast now works with openweathermap for both, `/forecast` and `/forecast/daily`, in new weather module. If you use the `/forecast`-weatherEndpoint, the hourly data are converted to daily data, see issues [#1504](https://github.com/MichMich/MagicMirror/issues/1504), [#1513](https://github.com/MichMich/MagicMirror/issues/1513). ## [2.6.0] - 2019-01-01 From 1bbf2d8ce6cf1fdba91bfdc9d5614bb6ba6ca346 Mon Sep 17 00:00:00 2001 From: andogit7 <44971673+andogit7@users.noreply.github.com> Date: Sat, 5 Jan 2019 17:04:33 +0000 Subject: [PATCH 27/69] Update clock.js --- modules/default/clock/clock.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/default/clock/clock.js b/modules/default/clock/clock.js index 705b43032f..23b801d0d0 100644 --- a/modules/default/clock/clock.js +++ b/modules/default/clock/clock.js @@ -137,7 +137,8 @@ Module.register("clock",{ clockCircle.style.backgroundSize = "100%"; // The following line solves issue: https://github.com/MichMich/MagicMirror/issues/611 - clockCircle.style.border = "1px solid black"; + // clockCircle.style.border = "1px solid black"; + clockCircle.style.border = "rgba(0, 0, 0, 0.1)"; //Updated fix for Issue 611 where non-black backgrounds are used } else if (this.config.analogFace != "none") { clockCircle.style.border = "2px solid white"; From a477140a4bc7d64124927682f81f973ee1c8abe2 Mon Sep 17 00:00:00 2001 From: andogit7 <44971673+andogit7@users.noreply.github.com> Date: Sat, 5 Jan 2019 17:08:55 +0000 Subject: [PATCH 28/69] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a849a2e6..2a24345b47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503). - Fixed unhandled error on bad git data in updatenotiifcation module [#1285](https://github.com/MichMich/MagicMirror/issues/1285). - Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). +- Fixed analogue clock border display issuse where non-black backgrounds used (previous fix for issue 611) ### New weather module - Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). From 1d21f39fbca3feeb5b7465acf6b658d4554ab014 Mon Sep 17 00:00:00 2001 From: andogit7 <44971673+andogit7@users.noreply.github.com> Date: Sat, 5 Jan 2019 17:09:15 +0000 Subject: [PATCH 29/69] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a24345b47..6c6521d44a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fixed temperature displays in currentweather and weatherforecast modules [#1503](https://github.com/MichMich/MagicMirror/issues/1503). - Fixed unhandled error on bad git data in updatenotiifcation module [#1285](https://github.com/MichMich/MagicMirror/issues/1285). - Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). -- Fixed analogue clock border display issuse where non-black backgrounds used (previous fix for issue 611) +- Fixed analogue clock border display issue where non-black backgrounds used (previous fix for issue 611) ### New weather module - Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). From 409939360f0608f7330f06828f368d4230bb2f95 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sun, 6 Jan 2019 10:23:15 +0100 Subject: [PATCH 30/69] do not show 0 mm rain value --- modules/default/weather/weather.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 52e9cfee5d..e8898c64d6 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -198,7 +198,7 @@ Module.register("weather",{ } } } else if (type === "rain") { - if (isNaN(value)) { + if (isNaN(value) || value === 0) { value = ""; } else { value = `${value.toFixed(2)} ${this.config.units === "imperial" ? "in" : "mm"}`; From d6046d2422e6b0a26c5cff77e23d4794b27fc217 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sun, 6 Jan 2019 10:24:16 +0100 Subject: [PATCH 31/69] simplified fetchForecastHourly function --- .../weather/providers/openweathermap.js | 45 +++++++------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index b39da7601b..3d257ceee9 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -112,24 +112,7 @@ WeatherProvider.register("openweathermap", { for (const forecast of forecasts) { - if (date === moment(forecast.dt, "X").format("YYYY-MM-DD")) { - // the same day as before - // add values from forecast to corresponding variables - minTemp.push(forecast.main.temp_min); - maxTemp.push(forecast.main.temp_max); - - if (forecast.hasOwnProperty("rain")) { - if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { - rain += forecast.rain["3h"] / 25.4; - } else if (!isNaN(forecast.rain["3h"])){ - rain += forecast.rain["3h"]; - } else { - rain += 0; - } - } else { - rain += 0; - } - } else { + if (date !== moment(forecast.dt, "X").format("YYYY-MM-DD")) { // a new day // calculate minimum/maximum temperature, specify rain amount weather.minTemperature = Math.min.apply(null, minTemp); @@ -152,22 +135,24 @@ WeatherProvider.register("openweathermap", { // select weather type by first forecast value of a day, is this reasonable? weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); + + } + + // the same day as before + // add values from forecast to corresponding variables + minTemp.push(forecast.main.temp_min); + maxTemp.push(forecast.main.temp_max); - // add values from first forecast of this day to corresponding variables - minTemp.push(forecast.main.temp_min); - maxTemp.push(forecast.main.temp_max); - - if (forecast.hasOwnProperty("rain")) { - if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { - rain += forecast.rain["3h"] / 25.4; - } else if (!isNaN(forecast.rain["3h"])){ - rain += forecast.rain["3h"]; - } else { - rain += 0; - } + if (forecast.hasOwnProperty("rain")) { + if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { + rain += forecast.rain["3h"] / 25.4; + } else if (!isNaN(forecast.rain["3h"])){ + rain += forecast.rain["3h"]; } else { rain += 0; } + } else { + rain += 0; } } return days.slice(1); From 8b2d544576a69804e05071543550301a622298eb Mon Sep 17 00:00:00 2001 From: fwitte Date: Sun, 6 Jan 2019 12:24:26 +0100 Subject: [PATCH 32/69] added fade and maxnumberofdays options for forecast --- modules/default/weather/forecast.njk | 6 +++++- modules/default/weather/weather.js | 26 +++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index 556a98ff05..d03d30189e 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -1,7 +1,10 @@ {% if forecast %} + {% set numSteps = forecast | calcNumSteps %} + {% set currentStep = 0 %} + {% set forecast = forecast.slice(0, numSteps) %} {% for f in forecast %} - + {% endif %} + {% set currentStep = currentStep + 1 %} {% endfor %}
{{ f.date.format('ddd') }} @@ -16,6 +19,7 @@
{% else %} diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 52e9cfee5d..818bc40a4f 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -33,6 +33,9 @@ Module.register("weather",{ decimalSymbol: ".", showIndoorTemperature: false, showIndoorHumidity: false, + maxNumberOfDays: 3, + fade: true, + fadePoint: 0.25, // Start on 1/4th of the list. initialLoadDelay: 0, // 0 seconds delay retryDelay: 2500, @@ -198,7 +201,7 @@ Module.register("weather",{ } } } else if (type === "rain") { - if (isNaN(value)) { + if (isNaN(value) || value === 0) { value = ""; } else { value = `${value.toFixed(2)} ${this.config.units === "imperial" ? "in" : "mm"}`; @@ -217,5 +220,26 @@ Module.register("weather",{ this.nunjucksEnvironment().addFilter("decimalSymbol", function(value) { return value.replace(/\./g, this.config.decimalSymbol); }.bind(this)); + + this.nunjucksEnvironment().addFilter("calcNumSteps", function(forecast) { + return Math.min(forecast.length, this.config.maxNumberOfDays); + }.bind(this)); + + this.nunjucksEnvironment().addFilter("opacity", function(currentStep, numSteps) { + if (this.config.fade && this.config.fadePoint < 1) { + if (this.config.fadePoint < 0) { + this.config.fadePoint = 0; + } + var startingPoint = numSteps * this.config.fadePoint; + var numFadesteps = numSteps - startingPoint; + if (currentStep >= startingPoint) { + return 1 - (currentStep - startingPoint) / numFadesteps; + } else { + return 1; + } + } else { + return 1; + } + }.bind(this)); } }); From 63aa840b55cb989fe419b0e633ae6b6da00be714 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sun, 6 Jan 2019 12:30:26 +0100 Subject: [PATCH 33/69] replaced tabs with spaces --- modules/default/weather/forecast.njk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index d03d30189e..315ebff82c 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -1,8 +1,8 @@ {% if forecast %} - {% set numSteps = forecast | calcNumSteps %} - {% set currentStep = 0 %} + {% set numSteps = forecast | calcNumSteps %} + {% set currentStep = 0 %} - {% set forecast = forecast.slice(0, numSteps) %} + {% set forecast = forecast.slice(0, numSteps) %} {% for f in forecast %} @@ -19,7 +19,7 @@ {% endif %} - {% set currentStep = currentStep + 1 %} + {% set currentStep = currentStep + 1 %} {% endfor %}
{{ f.date.format('ddd') }}
{% else %} From 733dfa1467741f749f7aca63fa6b8aea4f088383 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sun, 6 Jan 2019 12:34:27 +0100 Subject: [PATCH 34/69] adjusted README --- modules/default/weather/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md index d10297d173..a035e85e40 100644 --- a/modules/default/weather/README.md +++ b/modules/default/weather/README.md @@ -71,6 +71,9 @@ The following properties can be configured: | `tableClass` | The class for the forecast table.

**Default value:** `'small'` | `colored` | If set to `true`, the min and max temperature are color coded.

**Default value:** `false` | `showRainAmount` | Show the amount of rain in the forecast

**Possible values:** `true` or `false`
**Default value:** `true` +| `fade` | Fade the future events to black. (Gradient)

**Possible values:** `true` or `false`
**Default value:** `true` +| `fadePoint` | Where to start fade?

**Possible values:** `0` (top of the list) - `1` (bottom of list)
**Default value:** `0.25` +| `maxNumberOfDays` | How many days of forecast to return. Specified by config.js

**Possible values:** `1` - `16`
**Default value:** `5` (5 days)
This value is optional. By default the weatherforecast module will return 5 days. ### Openweathermap options From 766f21b5254bb045b94bb0e6687c1f72c05232c2 Mon Sep 17 00:00:00 2001 From: fwitte Date: Sun, 6 Jan 2019 12:34:44 +0100 Subject: [PATCH 35/69] adjusted default values --- modules/default/weather/weather.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 818bc40a4f..0c2304240a 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -33,7 +33,7 @@ Module.register("weather",{ decimalSymbol: ".", showIndoorTemperature: false, showIndoorHumidity: false, - maxNumberOfDays: 3, + maxNumberOfDays: 5, fade: true, fadePoint: 0.25, // Start on 1/4th of the list. From 2dfb349609244aec9c37ca787e106e0388bfc959 Mon Sep 17 00:00:00 2001 From: fwitte Date: Mon, 7 Jan 2019 08:19:50 +0100 Subject: [PATCH 36/69] fixed missing last day display in forecast/hourly --- modules/default/weather/providers/openweathermap.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index 3d257ceee9..9ae7cbd4f3 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -113,7 +113,6 @@ WeatherProvider.register("openweathermap", { for (const forecast of forecasts) { if (date !== moment(forecast.dt, "X").format("YYYY-MM-DD")) { - // a new day // calculate minimum/maximum temperature, specify rain amount weather.minTemperature = Math.min.apply(null, minTemp); weather.maxTemperature = Math.max.apply(null, maxTemp); @@ -135,9 +134,9 @@ WeatherProvider.register("openweathermap", { // select weather type by first forecast value of a day, is this reasonable? weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); - + } - + // the same day as before // add values from forecast to corresponding variables minTemp.push(forecast.main.temp_min); @@ -155,6 +154,13 @@ WeatherProvider.register("openweathermap", { rain += 0; } } + // last day + // calculate minimum/maximum temperature, specify rain amount + weather.minTemperature = Math.min.apply(null, minTemp); + weather.maxTemperature = Math.max.apply(null, maxTemp); + weather.rain = rain; + // push weather information to days array + days.push(weather); return days.slice(1); }, From a79e51c76f8dcfc2ac4dddfb1b18554ecb9af6d5 Mon Sep 17 00:00:00 2001 From: fwitte Date: Mon, 7 Jan 2019 08:51:17 +0100 Subject: [PATCH 37/69] updated +CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a849a2e6..f4fd8af871 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Aligned indoor values in current weather vertical [#1499](https://github.com/MichMich/MagicMirror/issues/1499). - Added humidity support to nunjuck unit filter. - Do not display degree symbol for temperature in Kelvin [#1503](https://github.com/MichMich/MagicMirror/issues/1503). +- Added fade, fadePoint and maxNumberOfDays properties to the forecast mode [#1516](https://github.com/MichMich/MagicMirror/issues/1516) ## [2.6.0] - 2019-01-01 From f680c83d2d6443d1a1500d4e07f6678d40599144 Mon Sep 17 00:00:00 2001 From: Bardo98 <46172278+Bardo98@users.noreply.github.com> Date: Mon, 7 Jan 2019 21:55:18 +0100 Subject: [PATCH 38/69] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75a849a2e6..4b1d85c71c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ℹ️ **Note:** This update uses new dependencies. Please update using the following command: `git pull && npm install`. If you are having issues running Electron, make sure your [Raspbian is up to date](https://www.raspberrypi.org/documentation/raspbian/updating.md). ### Added +- Italian translation for "Feels" ### Updated - Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500) From 984608e23f816966cd9a1d87150b12eb34aca3ec Mon Sep 17 00:00:00 2001 From: Bardo98 <46172278+Bardo98@users.noreply.github.com> Date: Mon, 7 Jan 2019 22:05:26 +0100 Subject: [PATCH 39/69] Added Italian translation of "FEELS" --- translations/it.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/translations/it.json b/translations/it.json index a5eaf2f215..e1a5b80675 100644 --- a/translations/it.json +++ b/translations/it.json @@ -29,5 +29,7 @@ "UPDATE_NOTIFICATION": "E' disponibile un aggiornamento di MagicMirror².", "UPDATE_NOTIFICATION_MODULE": "E' disponibile un aggiornamento del modulo {MODULE_NAME}.", "UPDATE_INFO_SINGLE": "L'installazione è {COMMIT_COUNT} commit indietro rispetto all'attuale branch {BRANCH_NAME}.", - "UPDATE_INFO_MULTIPLE": "L'installazione è {COMMIT_COUNT} commits indietro rispetto all'attuale branch {BRANCH_NAME}." + "UPDATE_INFO_MULTIPLE": "L'installazione è {COMMIT_COUNT} commits indietro rispetto all'attuale branch {BRANCH_NAME}.", + + "FEELS": "Percepiti" } From b01b9758e0503755e97d805d13021be6acf32831 Mon Sep 17 00:00:00 2001 From: Ian Date: Wed, 9 Jan 2019 21:24:14 +0000 Subject: [PATCH 40/69] remove Font Awesome 4 dependency --- vendor/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/vendor/package.json b/vendor/package.json index d14f8bcb00..241374cbc2 100644 --- a/vendor/package.json +++ b/vendor/package.json @@ -11,7 +11,6 @@ }, "dependencies": { "@fortawesome/fontawesome-free": "^5.3.1", - "font-awesome": "^4.7.0", "moment": "^2.17.1", "moment-timezone": "^0.5.11", "nunjucks": "^3.0.1", From ef82039401b5122889fac0d8762a25440328b1e8 Mon Sep 17 00:00:00 2001 From: Ian Date: Wed, 9 Jan 2019 21:29:49 +0000 Subject: [PATCH 41/69] Allow multiple css to be included for one vendor --- vendor/css/font-awesome.css | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 vendor/css/font-awesome.css diff --git a/vendor/css/font-awesome.css b/vendor/css/font-awesome.css new file mode 100644 index 0000000000..2ba4a708ae --- /dev/null +++ b/vendor/css/font-awesome.css @@ -0,0 +1,2 @@ +@import url("../node_modules/@fortawesome/fontawesome-free/css/all.min.css"); +@import url("../node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css"); \ No newline at end of file From 7c3923ad00b1e47b1992987a131d940ae7330fa6 Mon Sep 17 00:00:00 2001 From: Ian Date: Wed, 9 Jan 2019 21:32:43 +0000 Subject: [PATCH 42/69] Use Font Awesome 5 (with backwards compatibility) for all modules --- vendor/vendor.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/vendor/vendor.js b/vendor/vendor.js index abbf1423e5..6acf8427ca 100644 --- a/vendor/vendor.js +++ b/vendor/vendor.js @@ -12,9 +12,7 @@ var vendor = { "moment-timezone.js" : "node_modules/moment-timezone/builds/moment-timezone-with-data.js", "weather-icons.css": "node_modules/weathericons/css/weather-icons.css", "weather-icons-wind.css": "node_modules/weathericons/css/weather-icons-wind.css", - "font-awesome.css": "node_modules/font-awesome/css/font-awesome.min.css", - "font-awesome5.css": "node_modules/@fortawesome/fontawesome-free/css/all.min.css", - "font-awesome5.v4shims.css": "node_modules/@fortawesome/fontawesome-free/css/v4-shims.min.css", + "font-awesome.css": "css/font-awesome.css", "nunjucks.js": "node_modules/nunjucks/browser/nunjucks.min.js" }; From 00922891052041c2c9f02926d77ccd5114698bf0 Mon Sep 17 00:00:00 2001 From: Ian Date: Wed, 9 Jan 2019 21:38:07 +0000 Subject: [PATCH 43/69] revert font awesome reference --- modules/default/calendar/calendar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 38b0426979..7b81380928 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -51,7 +51,7 @@ Module.register("calendar", { // Define required scripts. getStyles: function () { - return ["calendar.css", "font-awesome5.css", "font-awesome5.v4shims.css"]; + return ["calendar.css", "font-awesome.css"]; }, // Define required scripts. From 8546d6730c98471d167c858555458720bf4dae29 Mon Sep 17 00:00:00 2001 From: Ian Date: Thu, 10 Jan 2019 12:44:35 +0000 Subject: [PATCH 44/69] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12d84620c8..387dcdb16c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fixed unhandled error on bad git data in updatenotiifcation module [#1285](https://github.com/MichMich/MagicMirror/issues/1285). - Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). - Fixed analogue clock border display issue where non-black backgrounds used (previous fix for issue 611) +- Fixed compatibility issues caused when modules request different versions of Font Awesome, see issue [#1522](https://github.com/MichMich/MagicMirror/issues/1522). MagicMirror now uses [Font Awesome 5 with v4 shims included for backwards compatibility](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4#shims). ### New weather module - Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). From 8f24cc8d137b508d10f61d8df8d70c9ad6c9a1ac Mon Sep 17 00:00:00 2001 From: fdahms Date: Sat, 12 Jan 2019 18:06:52 +0100 Subject: [PATCH 45/69] editing CHANGELOG --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 387dcdb16c..ad4336c8c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added - Italian translation for "Feels" +- Disabled the screensaver on raspbian with installation script + ### Updated - Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500) @@ -23,6 +25,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Weather forecast now works with openweathermap in new weather module. Daily data are displayed, see issue [#1504](https://github.com/MichMich/MagicMirror/issues/1504). - Fixed analogue clock border display issue where non-black backgrounds used (previous fix for issue 611) - Fixed compatibility issues caused when modules request different versions of Font Awesome, see issue [#1522](https://github.com/MichMich/MagicMirror/issues/1522). MagicMirror now uses [Font Awesome 5 with v4 shims included for backwards compatibility](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4#shims). +- Installation script problems with raspbian ### New weather module - Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). From f87adebe41df0ea9a7fa600daa28dcd313fbdf27 Mon Sep 17 00:00:00 2001 From: fdahms Date: Sat, 12 Jan 2019 18:11:48 +0100 Subject: [PATCH 46/69] Fixing raspbian installer * fixing issue #1377 * fixing problem with old node installation from fresh raspbian * add feature for disable screen saver --- installers/raspberry.sh | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/installers/raspberry.sh b/installers/raspberry.sh index 4e9c20d8bc..6e618c999d 100644 --- a/installers/raspberry.sh +++ b/installers/raspberry.sh @@ -47,7 +47,7 @@ sudo apt-get --assume-yes install curl wget git build-essential unzip || exit # Check if we need to install or upgrade Node.js. echo -e "\e[96mCheck current Node installation ...\e[0m" NODE_INSTALL=false -if command_exists node; then +if command_exists node && command_exists npm; then echo -e "\e[0mNode currently installed. Checking version number."; NODE_CURRENT=$(node -v) echo -e "\e[0mMinimum Node version: \e[1m$NODE_TESTED\e[0m" @@ -152,9 +152,19 @@ fi read -p "Do you want use pm2 for auto starting of your MagicMirror (y/N)?" choice if [[ $choice =~ ^[Yy]$ ]]; then sudo npm install -g pm2 - sudo su -c "env PATH=$PATH:/usr/bin pm2 startup linux -u pi --hp /home/pi" - pm2 start ~/MagicMirror/installers/pm2_MagicMirror.json - pm2 save + if [[ "$(ps --no-headers -o comm 1)" =~ systemd ]]; then #Checking for systemd + sudo pm2 startup systemd -u pi --hp /home/pi + else + sudo su -c "env PATH=$PATH:/usr/bin pm2 startup linux -u pi --hp /home/pi" + fi + pm2 start ~/MagicMirror/installers/pm2_MagicMirror.json + pm2 save +fi +# Disable Screensaver +read -p "Do you want to disable the screen saver? (y/N)?" choice +if [[ $choice =~ ^[Yy]$ ]]; then + su -c "echo -e '@xset s noblank\n@xset s off\n@xset -dpms' >> /etc/xdg/lxsession/LXDE-pi/autostart" + export DISPLAY=:0; xset s noblank;xset s off;xset -dpms fi echo " " From 90c96f7479444c6f77c52a953ba1aefb8a059d67 Mon Sep 17 00:00:00 2001 From: Yvonne Date: Sun, 13 Jan 2019 09:26:37 +1100 Subject: [PATCH 47/69] Update README.md --- modules/default/weather/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md index 89e65de135..1bfa3aff9f 100644 --- a/modules/default/weather/README.md +++ b/modules/default/weather/README.md @@ -2,7 +2,7 @@ This module is aimed to be the replacement for the current `currentweather` and `weatherforcast` modules. The module will be configurable to be used as a current weather view, or to show the forecast. This way the module can be used twice to fullfil both purposes. -The biggest cange is the use of weather providers. This way we are not bound to one API source. And users can choose which API they want to use as their source. +The biggest change is the use of weather providers. This way we are not bound to one API source. And users can choose which API they want to use as their source. The module is in a very early stage, and needs a lot of work. It's API isn't set in stone, so keep that in mind when you want to contribute. From 1c830594829c6544f81230879a8b8f6614c4153d Mon Sep 17 00:00:00 2001 From: Jan Syring-Lingenfelder Date: Sun, 13 Jan 2019 16:07:02 +0100 Subject: [PATCH 48/69] fix: only show repeating count if the event is actually repeating --- modules/default/calendar/calendar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 7b81380928..d9cc829121 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -220,7 +220,7 @@ Module.register("calendar", { var titleWrapper = document.createElement("td"), repeatingCountTitle = ""; - if (this.config.displayRepeatingCountTitle) { + if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) { repeatingCountTitle = this.countTitleForUrl(event.url); From 06e641015f7853d7cb1dc52c8819befc1f2cc0f1 Mon Sep 17 00:00:00 2001 From: Jan Syring-Lingenfelder Date: Sun, 13 Jan 2019 16:25:57 +0100 Subject: [PATCH 49/69] docs: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad4336c8c1..0a1c469366 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fixed analogue clock border display issue where non-black backgrounds used (previous fix for issue 611) - Fixed compatibility issues caused when modules request different versions of Font Awesome, see issue [#1522](https://github.com/MichMich/MagicMirror/issues/1522). MagicMirror now uses [Font Awesome 5 with v4 shims included for backwards compatibility](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4#shims). - Installation script problems with raspbian +- Calendar: only show repeating count if the event is actually repeating [#1534](https://github.com/MichMich/MagicMirror/pull/1534) ### New weather module - Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). From 6d9675a299287a52430fc0bc1e59439f1ff12f09 Mon Sep 17 00:00:00 2001 From: fdahms Date: Sun, 13 Jan 2019 20:07:20 +0100 Subject: [PATCH 50/69] forgot one sudo --- installers/raspberry.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installers/raspberry.sh b/installers/raspberry.sh index 6e618c999d..1551b5fb43 100644 --- a/installers/raspberry.sh +++ b/installers/raspberry.sh @@ -163,7 +163,7 @@ fi # Disable Screensaver read -p "Do you want to disable the screen saver? (y/N)?" choice if [[ $choice =~ ^[Yy]$ ]]; then - su -c "echo -e '@xset s noblank\n@xset s off\n@xset -dpms' >> /etc/xdg/lxsession/LXDE-pi/autostart" + sudo su -c "echo -e '@xset s noblank\n@xset s off\n@xset -dpms' >> /etc/xdg/lxsession/LXDE-pi/autostart" export DISPLAY=:0; xset s noblank;xset s off;xset -dpms fi From 399e1710836420617d6a00725d251f7bc800d2b2 Mon Sep 17 00:00:00 2001 From: Andrew McOlash Date: Wed, 16 Jan 2019 22:51:44 -0800 Subject: [PATCH 51/69] Add in cutting of long vertical titles --- CHANGELOG.md | 2 +- modules/default/calendar/README.md | 1 + modules/default/calendar/calendar.js | 15 ++++++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a1c469366..2dbc26756f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ### Added - Italian translation for "Feels" - Disabled the screensaver on raspbian with installation script - +- Added option to truncate the number of vertical lines a calendar item can span if `wrapEvents` is enabled. ### Updated - Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500) diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md index b272a2d28d..e0d727c8f1 100755 --- a/modules/default/calendar/README.md +++ b/modules/default/calendar/README.md @@ -32,6 +32,7 @@ The following properties can be configured: | `defaultSymbol` | The default symbol.

**Possible values:** See [Font Awsome](http://fontawesome.io/icons/) website.
**Default value:** `calendar` | `maxTitleLength` | The maximum title length.

**Possible values:** `10` - `50`
**Default value:** `25` | `wrapEvents` | Wrap event titles to multiple lines. Breaks lines at the length defined by `maxTitleLength`.

**Possible values:** `true` or `false`
**Default value:** `false` +| `maxTitleLines` | The maximum number of lines a title will wrap vertically before being cut (Only enabled if `wrapEvents` is also enabled).

**Possible values:** `0` - `10`
**Default value:** `3` | `fetchInterval` | How often does the content needs to be fetched? (Milliseconds)

**Possible values:** `1000` - `86400000`
**Default value:** `300000` (5 minutes) | `animationSpeed` | Speed of the update animation. (Milliseconds)

**Possible values:** `0` - `5000`
**Default value:** `2000` (2 seconds) | `fade` | Fade the future events to black. (Gradient)

**Possible values:** `true` or `false`
**Default value:** `true` diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index d9cc829121..f2017a6c58 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -19,6 +19,7 @@ Module.register("calendar", { defaultRepeatingCountTitle: "", maxTitleLength: 25, wrapEvents: false, // wrap events to multiple lines breaking at maxTitleLength + maxTitleLines: 3, fetchInterval: 5 * 60 * 1000, // Update every 5 minutes. animationSpeed: 2000, fade: true, @@ -220,7 +221,7 @@ Module.register("calendar", { var titleWrapper = document.createElement("td"), repeatingCountTitle = ""; - if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) { + if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) { repeatingCountTitle = this.countTitleForUrl(event.url); @@ -584,9 +585,10 @@ Module.register("calendar", { * @param {string} string Text string to shorten * @param {number} maxLength The max length of the string * @param {boolean} wrapEvents Wrap the text after the line has reached maxLength + * @param {number} maxTitleLines The max number of vertical lines before cutting event title * @returns {string} The shortened string */ - shorten: function (string, maxLength, wrapEvents) { + shorten: function (string, maxLength, wrapEvents, maxTitleLines) { if (typeof string !== "string") { return ""; } @@ -595,12 +597,19 @@ Module.register("calendar", { var temp = ""; var currentLine = ""; var words = string.split(" "); + var line = 0; for (var i = 0; i < words.length; i++) { var word = words[i]; if (currentLine.length + word.length < (typeof maxLength === "number" ? maxLength : 25) - 1) { // max - 1 to account for a space currentLine += (word + " "); } else { + line++; + if (line > maxTitleLines - 1) { + if (i < words.length) currentLine += "…"; + break; + } + if (currentLine.length > 0) { temp += (currentLine + "
" + word + " "); } else { @@ -651,7 +660,7 @@ Module.register("calendar", { title = title.replace(needle, replacement); } - title = this.shorten(title, this.config.maxTitleLength, this.config.wrapEvents); + title = this.shorten(title, this.config.maxTitleLength, this.config.wrapEvents, this.config.maxTitleLines); return title; }, From 320743ab8d92c2d915b6f879f65003554eec1f27 Mon Sep 17 00:00:00 2001 From: Andrew McOlash Date: Wed, 16 Jan 2019 22:53:28 -0800 Subject: [PATCH 52/69] fix spacing --- modules/default/calendar/calendar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index f2017a6c58..4220ec8c87 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -221,7 +221,7 @@ Module.register("calendar", { var titleWrapper = document.createElement("td"), repeatingCountTitle = ""; - if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) { + if (this.config.displayRepeatingCountTitle && event.firstYear !== undefined) { repeatingCountTitle = this.countTitleForUrl(event.url); From 2e03868021facdad8ca891a5a759cdb84c80ec9d Mon Sep 17 00:00:00 2001 From: vincep5 Date: Thu, 17 Jan 2019 08:54:16 -0600 Subject: [PATCH 53/69] current.njk JS error and Loading string --- CHANGELOG.md | 1 + modules/default/weather/current.njk | 4 ++-- modules/default/weather/forecast.njk | 4 ++-- modules/default/weather/weather.js | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a1c469366..5f2015f8b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Added humidity support to nunjuck unit filter. - Do not display degree symbol for temperature in Kelvin [#1503](https://github.com/MichMich/MagicMirror/issues/1503). - Added fade, fadePoint and maxNumberOfDays properties to the forecast mode [#1516](https://github.com/MichMich/MagicMirror/issues/1516) +- Fixed Loading string and decimalSymbol string replace [#1538](https://github.com/MichMich/MagicMirror/issues/1538) ## [2.6.0] - 2019-01-01 diff --git a/modules/default/weather/current.njk b/modules/default/weather/current.njk index 55720e23e1..64d22e7bce 100644 --- a/modules/default/weather/current.njk +++ b/modules/default/weather/current.njk @@ -65,9 +65,9 @@ {% endif %} {% else %}
- {{ "LOADING" | translate }} + {{ "LOADING" | translate | safe }}
{% endif %} - + diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index 315ebff82c..56074047c7 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -24,9 +24,9 @@ {% else %}
- {{ "LOADING" | translate }} + {{ "LOADING" | translate | safe }}
{% endif %} - + diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index 0c2304240a..f554c1fe2a 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -62,7 +62,7 @@ Module.register("weather",{ return ["font-awesome.css", "weather-icons.css", "weather.css"]; }, - // Return the scripts that are nessecery for the weather module. + // Return the scripts that are necessary for the weather module. getScripts: function () { return [ "moment.js", @@ -218,7 +218,7 @@ Module.register("weather",{ }.bind(this)); this.nunjucksEnvironment().addFilter("decimalSymbol", function(value) { - return value.replace(/\./g, this.config.decimalSymbol); + return value.toString().replace(/\./g, this.config.decimalSymbol); }.bind(this)); this.nunjucksEnvironment().addFilter("calcNumSteps", function(forecast) { From a0dde39d97ad4bc3d546d14adfa16da486622e6a Mon Sep 17 00:00:00 2001 From: Andrew McOlash Date: Mon, 21 Jan 2019 00:47:53 -0800 Subject: [PATCH 54/69] Fix braces for if check --- modules/default/calendar/calendar.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 4220ec8c87..2c2970ec8e 100755 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -606,7 +606,9 @@ Module.register("calendar", { } else { line++; if (line > maxTitleLines - 1) { - if (i < words.length) currentLine += "…"; + if (i < words.length) { + currentLine += "…"; + } break; } From 053b01e0362dcf66c2f5a427401dea45848f7f12 Mon Sep 17 00:00:00 2001 From: Mike Date: Fri, 25 Jan 2019 07:50:24 +0000 Subject: [PATCH 55/69] Updated README Scanned through it and corrected some spelling mistakes, nothing that affects the core purpose of the document. --- modules/README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/README.md b/modules/README.md index 8bc8f86e01..5fb86df285 100644 --- a/modules/README.md +++ b/modules/README.md @@ -33,8 +33,8 @@ Therefore **we highly recommend you to include the following information in your - A high quality screenshot of your working module - A short, one sentence, clear description what it does (duh!) -- What external API's it depend on, including web links to those -- Wheteher the API/request require a key and the user limitations of those. (Is it free?) +- What external API's it depends upon, including web links to those +- Whether the API/request require a key and the user limitations of those. (Is it free?) Surely this also help you get better recognition and feedback for your work. @@ -46,8 +46,8 @@ A module can be placed in one single folder. Or multiple modules can be grouped ### Files - **modulename/modulename.js** - This is your core module script. -- **modulename/node_helper.js** - This is an optional helper that will be loaded by the node script. The node helper and module script can communicate with each other using an intergrated socket system. -- **modulename/public** - Any files in this folder can be accesed via the browser on `/modulename/filename.ext`. +- **modulename/node_helper.js** - This is an optional helper that will be loaded by the node script. The node helper and module script can communicate with each other using an integrated socket system. +- **modulename/public** - Any files in this folder can be accessed via the browser on `/modulename/filename.ext`. - **modulename/anyfileorfolder** Any other file or folder in the module folder can be used by the core module script. For example: *modulename/css/modulename.css* would be a good path for your additional module styles. ## The Core module file: modulename.js @@ -89,7 +89,7 @@ After the module is initialized, the module instance has a few available module | `this.data` | Object | The data object contain additional metadata about the module instance. (See below) | -The `this.data` data object contain the follwoing metadata: +The `this.data` data object contain the following metadata: - `data.classes` - The classes which are added to the module dom wrapper. - `data.file` - The filename of the core module file. - `data.path` - The path of the module folder. @@ -98,7 +98,7 @@ The `this.data` data object contain the follwoing metadata: #### `defaults: {}` -Any properties defined in the defaults object, will be merged with the module config as defined in the user's config.js file. This is the best place to set your modules's configuration defaults. Any of the module configuration properties can be accessed using `this.config.propertyName`, but more about that later. +Any properties defined in the defaults object, will be merged with the module config as defined in the user's config.js file. This is the best place to set your modules' configuration defaults. Any of the module configuration properties can be accessed using `this.config.propertyName`, but more about that later. #### `requiresVersion:` @@ -134,7 +134,7 @@ loaded: function(callback) { ```` #### `start()` -This method is called when all modules are loaded an the system is ready to boot up. Keep in mind that the dom object for the module is not yet created. The start method is a perfect place to define any additional module properties: +This method is called when all modules are loaded and the system is ready to boot up. Keep in mind that the dom object for the module is not yet created. The start method is a perfect place to define any additional module properties: **Example:** ````javascript @@ -161,7 +161,7 @@ getScripts: function() { } ```` -**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore it's advised not to use any external urls. +**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore, it's advised not to use any external urls. #### `getStyles()` @@ -174,14 +174,14 @@ The getStyles method is called to request any additional stylesheets that need t getStyles: function() { return [ 'script.css', // will try to load it from the vendor folder, otherwise it will load is from the module folder. - 'font-awesome.css', // this file is available in the vendor folder, so it doesn't need to be avialable in the module folder. + 'font-awesome.css', // this file is available in the vendor folder, so it doesn't need to be available in the module folder. this.file('anotherfile.css'), // this file will be loaded straight from the module folder. 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css', // this file will be loaded from the bootstrapcdn servers. ] } ```` -**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore it's advised not to use any external urls. +**Note:** If a file can not be loaded, the boot up of the mirror will stall. Therefore, it's advised not to use any external URLs. #### `getTranslations()` **Should return: Dictionary** @@ -239,7 +239,7 @@ That MagicMirror core has the ability to send notifications to modules. Or even - `notification` - String - The notification identifier. - `payload` - AnyType - The payload of a notification. -- `sender` - Module - The sender of the notification. If this argument is `undefined`, the sender of the notififiction is the core system. +- `sender` - Module - The sender of the notification. If this argument is `undefined`, the sender of the notification is the core system. **Example:** ````javascript @@ -346,7 +346,7 @@ Possible configurable options: - `lockString` - String - When setting lock string, the module can not be shown without passing the correct lockstring. This way (multiple) modules can prevent a module from showing. It's considered best practice to use your modules identifier as the locksString: `this.identifier`. See *visibility locking* below. -**Note 1:** If the hide animation is canceled, for instance because the show method is called before the hide animation was finished, the callback will not be called.
+**Note 1:** If the hide animation is cancelled, for instance because the show method is called before the hide animation was finished, the callback will not be called.
**Note 2:** If the hide animation is hijacked (an other method calls hide on the same module), the callback will not be called.
**Note 3:** If the dom is not yet created, the hide method won't work. Wait for the `DOM_OBJECTS_CREATED` [notification](#notificationreceivednotification-payload-sender). @@ -371,7 +371,7 @@ Possible configurable options: (*Introduced in version: 2.1.0.*) -Visiblity locking helps the module system to prevent unwanted hide/show actions. The following scenario explains the concept: +Visibility locking helps the module system to prevent unwanted hide/show actions. The following scenario explains the concept: **Module B asks module A to hide:** ````javascript @@ -436,7 +436,7 @@ If no translation is found, a fallback will be used. The fallback sequence is as - 4. Translation as defined in core translation file of the fallback language (the first defined core translation file). - 5. The key (identifier) of the translation. -When adding translations to your module, it's a good idea to see if an apropriate translation is already available in the [core translation files](https://github.com/MichMich/MagicMirror/tree/master/translations). This way, your module can benefit from the existing translations. +When adding translations to your module, it's a good idea to see if an appropriate translation is already available in the [core translation files](https://github.com/MichMich/MagicMirror/tree/master/translations). This way, your module can benefit from the existing translations. **Example:** ````javascript @@ -490,7 +490,7 @@ this.translate("RUNNING", { )}); // Will return a translated string for the identifier RUNNING, replacing `{timeUntilEnd}` with the contents of the variable `timeUntilEnd` in the order that translator intended. (has a fallback) ```` -**Example swedish .json file that does not have the variable in it:** +**Example Swedish .json file that does not have the variable in it:** ````javascript { "RUNNING": "Slutar", From 12efb87a23abf641e1836b19eb571aa60ca6f634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Ram=C3=ADrez=20Norambuena?= Date: Sat, 26 Jan 2019 14:42:15 -0500 Subject: [PATCH 56/69] serveronly: Replace the console.log of none for a \n new line --- serveronly/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/serveronly/index.js b/serveronly/index.js index ccd4c294aa..3b8013efbe 100644 --- a/serveronly/index.js +++ b/serveronly/index.js @@ -1,6 +1,5 @@ var app = require("../js/app.js"); app.start(function(config) { - console.log(""); var bindAddress = config.address ? config.address : "localhost"; - console.log("Ready to go! Please point your browser to: http://" + bindAddress + ":" + config.port); + console.log("\nReady to go! Please point your browser to: http://" + bindAddress + ":" + config.port); }); From 5ca3fbeaea6d5c6c11b2f2e8a5b2959db7f4fcc9 Mon Sep 17 00:00:00 2001 From: Jacob Ebey Date: Sat, 9 Feb 2019 12:42:42 -0800 Subject: [PATCH 57/69] Added autoLocation option for weather modules. --- CHANGELOG.md | 1 + .../default/currentweather/currentweather.js | 14 ++++++++- modules/default/currentweather/node_helper.js | 29 +++++++++++++++++++ .../default/weatherforecast/node_helper.js | 29 +++++++++++++++++++ .../weatherforecast/weatherforecast.js | 15 ++++++++-- 5 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 modules/default/currentweather/node_helper.js create mode 100644 modules/default/weatherforecast/node_helper.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d4787a3fe..3ff24c383c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Italian translation for "Feels" - Disabled the screensaver on raspbian with installation script - Added option to truncate the number of vertical lines a calendar item can span if `wrapEvents` is enabled. +- Added autoLocation options for weather forcast and current weather modules. ### Updated - Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500) diff --git a/modules/default/currentweather/currentweather.js b/modules/default/currentweather/currentweather.js index 2a6d24b948..0472b7a186 100644 --- a/modules/default/currentweather/currentweather.js +++ b/modules/default/currentweather/currentweather.js @@ -11,6 +11,7 @@ Module.register("currentweather",{ // Default module config. defaults: { + autoLocation: false, location: false, locationID: false, appid: "", @@ -109,8 +110,19 @@ Module.register("currentweather",{ this.weatherType = null; this.feelsLike = null; this.loaded = false; - this.scheduleUpdate(this.config.initialLoadDelay); + if (this.config.autoLocation) { + this.sendSocketNotification("AUTO_LOCATION"); + } else { + this.scheduleUpdate(this.config.initialLoadDelay); + } + }, + + socketNotificationReceived: function (notification, payload) { + if (notification === "UPDATE_LOCATION") { + this.config.location = payload.location; + this.scheduleUpdate(this.config.initialLoadDelay); + } }, // add extra information of current weather diff --git a/modules/default/currentweather/node_helper.js b/modules/default/currentweather/node_helper.js new file mode 100644 index 0000000000..f650cdb86e --- /dev/null +++ b/modules/default/currentweather/node_helper.js @@ -0,0 +1,29 @@ +var http = require("http"); +var NodeHelper = require("node_helper"); + +module.exports = NodeHelper.create({ + start: function () { + }, + + socketNotificationReceived: function (notification, payload) { + var self = this; + + if (notification === "AUTO_LOCATION") { + console.log("Loading timezone..."); + http.get("http://ip-api.com/json", function (req) { + var data = ""; + req.on("data", function (d) { + data += d; + }); + req.on("end", function () { + var body = JSON.parse(data); + payload.location = body.city + ", " + body.regionName; + self.sendSocketNotification("UPDATE_LOCATION", payload); + }); + }).on("error", function () { + payload.error = "Could not figure out the timezone."; + self.sendSocketNotification("UPDATE_LOCATION", payload); + }); + } + } +}); diff --git a/modules/default/weatherforecast/node_helper.js b/modules/default/weatherforecast/node_helper.js new file mode 100644 index 0000000000..f650cdb86e --- /dev/null +++ b/modules/default/weatherforecast/node_helper.js @@ -0,0 +1,29 @@ +var http = require("http"); +var NodeHelper = require("node_helper"); + +module.exports = NodeHelper.create({ + start: function () { + }, + + socketNotificationReceived: function (notification, payload) { + var self = this; + + if (notification === "AUTO_LOCATION") { + console.log("Loading timezone..."); + http.get("http://ip-api.com/json", function (req) { + var data = ""; + req.on("data", function (d) { + data += d; + }); + req.on("end", function () { + var body = JSON.parse(data); + payload.location = body.city + ", " + body.regionName; + self.sendSocketNotification("UPDATE_LOCATION", payload); + }); + }).on("error", function () { + payload.error = "Could not figure out the timezone."; + self.sendSocketNotification("UPDATE_LOCATION", payload); + }); + } + } +}); diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js index 671936966c..1867da362b 100644 --- a/modules/default/weatherforecast/weatherforecast.js +++ b/modules/default/weatherforecast/weatherforecast.js @@ -11,6 +11,7 @@ Module.register("weatherforecast",{ // Default module config. defaults: { + autoLocation: false, location: false, locationID: false, appid: "", @@ -95,10 +96,20 @@ Module.register("weatherforecast",{ this.forecast = []; this.loaded = false; - this.scheduleUpdate(this.config.initialLoadDelay); - this.updateTimer = null; + + if (this.config.autoLocation) { + this.sendSocketNotification("AUTO_LOCATION"); + } else { + this.scheduleUpdate(this.config.initialLoadDelay); + } + }, + socketNotificationReceived: function (notification, payload) { + if (notification === "UPDATE_LOCATION") { + this.config.location = payload.location; + this.scheduleUpdate(this.config.initialLoadDelay); + } }, // Override dom generator. From 1a97107b2d1ee5e0d3216ad290d976cf1ec9b568 Mon Sep 17 00:00:00 2001 From: Jacob Ebey Date: Sat, 9 Feb 2019 12:49:47 -0800 Subject: [PATCH 58/69] - Converted indentation to tabs. --- modules/default/currentweather/node_helper.js | 38 +++++++++---------- .../default/weatherforecast/node_helper.js | 38 +++++++++---------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/modules/default/currentweather/node_helper.js b/modules/default/currentweather/node_helper.js index f650cdb86e..53956f624e 100644 --- a/modules/default/currentweather/node_helper.js +++ b/modules/default/currentweather/node_helper.js @@ -2,28 +2,28 @@ var http = require("http"); var NodeHelper = require("node_helper"); module.exports = NodeHelper.create({ - start: function () { - }, + start: function () { + }, - socketNotificationReceived: function (notification, payload) { - var self = this; + socketNotificationReceived: function (notification, payload) { + var self = this; if (notification === "AUTO_LOCATION") { - console.log("Loading timezone..."); - http.get("http://ip-api.com/json", function (req) { - var data = ""; - req.on("data", function (d) { - data += d; - }); - req.on("end", function () { - var body = JSON.parse(data); - payload.location = body.city + ", " + body.regionName; - self.sendSocketNotification("UPDATE_LOCATION", payload); - }); - }).on("error", function () { - payload.error = "Could not figure out the timezone."; - self.sendSocketNotification("UPDATE_LOCATION", payload); - }); + console.log("Loading timezone..."); + http.get("http://ip-api.com/json", function (req) { + var data = ""; + req.on("data", function (d) { + data += d; + }); + req.on("end", function () { + var body = JSON.parse(data); + payload.location = body.city + ", " + body.regionName; + self.sendSocketNotification("UPDATE_LOCATION", payload); + }); + }).on("error", function () { + payload.error = "Could not figure out the timezone."; + self.sendSocketNotification("UPDATE_LOCATION", payload); + }); } } }); diff --git a/modules/default/weatherforecast/node_helper.js b/modules/default/weatherforecast/node_helper.js index f650cdb86e..53956f624e 100644 --- a/modules/default/weatherforecast/node_helper.js +++ b/modules/default/weatherforecast/node_helper.js @@ -2,28 +2,28 @@ var http = require("http"); var NodeHelper = require("node_helper"); module.exports = NodeHelper.create({ - start: function () { - }, + start: function () { + }, - socketNotificationReceived: function (notification, payload) { - var self = this; + socketNotificationReceived: function (notification, payload) { + var self = this; if (notification === "AUTO_LOCATION") { - console.log("Loading timezone..."); - http.get("http://ip-api.com/json", function (req) { - var data = ""; - req.on("data", function (d) { - data += d; - }); - req.on("end", function () { - var body = JSON.parse(data); - payload.location = body.city + ", " + body.regionName; - self.sendSocketNotification("UPDATE_LOCATION", payload); - }); - }).on("error", function () { - payload.error = "Could not figure out the timezone."; - self.sendSocketNotification("UPDATE_LOCATION", payload); - }); + console.log("Loading timezone..."); + http.get("http://ip-api.com/json", function (req) { + var data = ""; + req.on("data", function (d) { + data += d; + }); + req.on("end", function () { + var body = JSON.parse(data); + payload.location = body.city + ", " + body.regionName; + self.sendSocketNotification("UPDATE_LOCATION", payload); + }); + }).on("error", function () { + payload.error = "Could not figure out the timezone."; + self.sendSocketNotification("UPDATE_LOCATION", payload); + }); } } }); From c608636b7adbb6e40ea920199825277b99da03c0 Mon Sep 17 00:00:00 2001 From: Jacob Ebey Date: Sat, 9 Feb 2019 13:41:42 -0800 Subject: [PATCH 59/69] - Added autoTimezone property to the clock --- CHANGELOG.md | 1 + modules/default/clock/clock.js | 26 ++++++++++++++++++++----- modules/default/clock/node_helper.js | 29 ++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 modules/default/clock/node_helper.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ff24c383c..7d90b047e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Disabled the screensaver on raspbian with installation script - Added option to truncate the number of vertical lines a calendar item can span if `wrapEvents` is enabled. - Added autoLocation options for weather forcast and current weather modules. +- Added autoTimezone option for the default clock module. ### Updated - Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500) diff --git a/modules/default/clock/clock.js b/modules/default/clock/clock.js index 23b801d0d0..03528bcee9 100644 --- a/modules/default/clock/clock.js +++ b/modules/default/clock/clock.js @@ -26,6 +26,7 @@ Module.register("clock",{ analogShowDate: "top", // options: false, 'top', or 'bottom' secondsColor: "#888888", timezone: null, + autoTimezone: false }, // Define required scripts. getScripts: function() { @@ -39,16 +40,31 @@ Module.register("clock",{ start: function() { Log.info("Starting module: " + this.name); - // Schedule update interval. - var self = this; - setInterval(function() { - self.updateDom(); - }, 1000); + if (this.config.autoTimezone) { + this.sendSocketNotification("AUTO_TIMEZONE"); + } else { + // Schedule update interval. + var self = this; + setInterval(function() { + self.updateDom(); + }, 1000); + } // Set locale. moment.locale(config.language); }, + + socketNotificationReceived: function (notification, payload) { + if (notification === "UPDATE_TIMEZONE") { + var self = this; + self.config.timezone = payload.timezone; + setInterval(function() { + self.updateDom(); + }, 1000); + } + }, + // Override dom generator. getDom: function() { diff --git a/modules/default/clock/node_helper.js b/modules/default/clock/node_helper.js new file mode 100644 index 0000000000..68258b0a03 --- /dev/null +++ b/modules/default/clock/node_helper.js @@ -0,0 +1,29 @@ +var http = require("http"); +var NodeHelper = require("node_helper"); + +module.exports = NodeHelper.create({ + start: function () { + }, + + socketNotificationReceived: function (notification, payload) { + var self = this; + + if (notification === "AUTO_TIMEZONE") { + console.log("Loading timezone..."); + http.get("http://ip-api.com/json", function (req) { + var data = ""; + req.on("data", function (d) { + data += d; + }); + req.on("end", function () { + var body = JSON.parse(data); + payload.timezone = body.timezone; + self.sendSocketNotification("UPDATE_TIMEZONE", payload); + }); + }).on("error", function () { + payload.error = "Could not figure out the timezone."; + self.sendSocketNotification("UPDATE_TIMEZONE", payload); + }); + } + } +}); From 3d5ad29eacda9936e10d056a268a67b3c3ac40d3 Mon Sep 17 00:00:00 2001 From: Jacob Ebey Date: Sat, 9 Feb 2019 13:51:23 -0800 Subject: [PATCH 60/69] - Removed trailing space --- modules/default/weatherforecast/weatherforecast.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/default/weatherforecast/weatherforecast.js b/modules/default/weatherforecast/weatherforecast.js index 1867da362b..c32821dbc5 100644 --- a/modules/default/weatherforecast/weatherforecast.js +++ b/modules/default/weatherforecast/weatherforecast.js @@ -97,7 +97,7 @@ Module.register("weatherforecast",{ this.forecast = []; this.loaded = false; this.updateTimer = null; - + if (this.config.autoLocation) { this.sendSocketNotification("AUTO_LOCATION"); } else { From c5888cec661fc40a1a4c22bce206979a5b03e51d Mon Sep 17 00:00:00 2001 From: Anthony Buisset Date: Sun, 10 Feb 2019 16:17:20 +0100 Subject: [PATCH 61/69] Fix exdate handling when multiple values are specified (comma separated) --- CHANGELOG.md | 1 + .../default/calendar/vendor/ical.js/ical.js | 78 ++++++++++++------- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d4787a3fe..2085491d21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Fixed compatibility issues caused when modules request different versions of Font Awesome, see issue [#1522](https://github.com/MichMich/MagicMirror/issues/1522). MagicMirror now uses [Font Awesome 5 with v4 shims included for backwards compatibility](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4#shims). - Installation script problems with raspbian - Calendar: only show repeating count if the event is actually repeating [#1534](https://github.com/MichMich/MagicMirror/pull/1534) +- Calendar: Fix exdate handling when multiple values are specified (comma separated) ### New weather module - Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). diff --git a/modules/default/calendar/vendor/ical.js/ical.js b/modules/default/calendar/vendor/ical.js/ical.js index f60c5357b8..8f0c532bcd 100644 --- a/modules/default/calendar/vendor/ical.js/ical.js +++ b/modules/default/calendar/vendor/ical.js/ical.js @@ -80,16 +80,45 @@ } } - var addTZ = function(dt, name, params){ + var addTZ = function(dt, params){ var p = parseParams(params); - if (params && p){ - dt[name].tz = p.TZID + if (params && p && dt){ + dt.tz = p.TZID } return dt } + var parseTimestamp = function(val){ + //typical RFC date-time format + var comps = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z)?$/.exec(val); + if (comps !== null) { + if (comps[7] == 'Z'){ // GMT + return new Date(Date.UTC( + parseInt(comps[1], 10), + parseInt(comps[2], 10)-1, + parseInt(comps[3], 10), + parseInt(comps[4], 10), + parseInt(comps[5], 10), + parseInt(comps[6], 10 ) + )); + // TODO add tz + } else { + return new Date( + parseInt(comps[1], 10), + parseInt(comps[2], 10)-1, + parseInt(comps[3], 10), + parseInt(comps[4], 10), + parseInt(comps[5], 10), + parseInt(comps[6], 10) + ); + } + } + + return undefined; + } + var dateParam = function(name){ return function(val, params, curr){ @@ -108,37 +137,24 @@ comps[3] ); - return addTZ(curr, name, params); + curr[name] = addTZ(curr[name], params); + return curr; } } + curr[name] = [] + val.split(',').forEach(function(val){ + var newDate = parseTimestamp(val); + curr[name].push(addTZ(newDate, params)); + }); - //typical RFC date-time format - var comps = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z)?$/.exec(val); - if (comps !== null) { - if (comps[7] == 'Z'){ // GMT - curr[name] = new Date(Date.UTC( - parseInt(comps[1], 10), - parseInt(comps[2], 10)-1, - parseInt(comps[3], 10), - parseInt(comps[4], 10), - parseInt(comps[5], 10), - parseInt(comps[6], 10 ) - )); - // TODO add tz - } else { - curr[name] = new Date( - parseInt(comps[1], 10), - parseInt(comps[2], 10)-1, - parseInt(comps[3], 10), - parseInt(comps[4], 10), - parseInt(comps[5], 10), - parseInt(comps[6], 10) - ); - } + if (curr[name].length === 0){ + delete curr[name]; + } else if (curr[name].length === 1){ + curr[name] = curr[name][0]; } - return addTZ(curr, name, params) + return curr; } } @@ -148,7 +164,11 @@ if (date.exdates === undefined) { date.exdates = []; } - date.exdates.push(date.exdate); + if (Array.isArray(date.exdate)){ + date.exdates = date.exdates.concat(date.exdate); + } else { + date.exdates.push(date.exdate); + } return date; } } From 017a376616ff240c5f667ecfc9ad421ef403ca4a Mon Sep 17 00:00:00 2001 From: stefsims <17434315+stefsims@users.noreply.github.com> Date: Mon, 11 Feb 2019 08:59:16 +0100 Subject: [PATCH 62/69] Update da.json Added FEELS and WEEK --- translations/da.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/translations/da.json b/translations/da.json index 4f4f50e743..11722d640e 100644 --- a/translations/da.json +++ b/translations/da.json @@ -6,6 +6,8 @@ "DAYAFTERTOMORROW": "I overmorgen", "RUNNING": "Slutter om", "EMPTY": "Ingen kommende begivenheder.", + "FEELS": "Føles som", + "WEEK": "Uge {weekNumber}", "N": "N", "NNE": "NNØ", From 56788f093306a8ff37cc26f8984f0f6df00b132d Mon Sep 17 00:00:00 2001 From: stefsims <17434315+stefsims@users.noreply.github.com> Date: Mon, 11 Feb 2019 09:02:42 +0100 Subject: [PATCH 63/69] Update CHANGELOG.md Added danish translation --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d4787a3fe..9061e7ff6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Italian translation for "Feels" - Disabled the screensaver on raspbian with installation script - Added option to truncate the number of vertical lines a calendar item can span if `wrapEvents` is enabled. +- Danish translation for "Feels" and "Weeks" ### Updated - Bumped the Electron dependency to v3.0.13 to support the most recent Raspbian. [#1500](https://github.com/MichMich/MagicMirror/issues/1500) From 77d14bc218bdd6e5dccc71dc0fd28d6210895776 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Wed, 13 Feb 2019 16:12:46 +0100 Subject: [PATCH 64/69] Add donation link. --- README.md | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3d39832c6a..2a284ed8da 100644 --- a/README.md +++ b/README.md @@ -16,18 +16,22 @@ MagicMirror² focuses on a modular plugin system and uses [Electron](http://elec ## Table Of Contents +- [Table Of Contents](#table-of-contents) - [Installation](#installation) - - [Raspberry Pi](#raspberry-pi) - - [General](#general) - - [Server Only](#server-only) - - [Client Only](#client-only) - - [Docker](#docker) + - [Raspberry Pi](#raspberry-pi) + - [Automatic Installation (Raspberry Pi only!)](#automatic-installation-raspberry-pi-only) + - [Manual Installation](#manual-installation) + - [Server Only](#server-only) + - [Client Only](#client-only) + - [Docker](#docker) - [Configuration](#configuration) + - [Raspberry Specific](#raspberry-specific) + - [General](#general) - [Modules](#modules) - [Updating](#updating) -- [Known Issues](#known-issues) - [Community](#community) - [Contributing Guidelines](#contributing-guidelines) +- [Enjoying MagicMirror? Consider a donation!](#enjoying-magicmirror-consider-a-donation) - [Manifesto](#manifesto) ## Installation @@ -199,6 +203,16 @@ Please keep the following in mind: Thanks for your help in making MagicMirror² better! + +## Enjoying MagicMirror? Consider a donation! + +MagicMirror² is opensource and free. That doesn't mean we don't need any money. + +Please consider a donation to help us cover the ongoing costs like webservers and email services. +If we recieve enough donations we might even be able to free up some working hours and spend some extra time improving the MagicMirror² core. + +To donate, please follow [this](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=G5D8E9MR5DTD2&source=url) link. + ## Manifesto A real Manifesto is still to be written. Till then, Michael's response on [one of the repository issues](https://github.com/MichMich/MagicMirror/issues/1174) gives a great summary: From 3a4902ad4ada92fe560c8e54b86f28b39701ecff Mon Sep 17 00:00:00 2001 From: Jon Kolb Date: Wed, 13 Feb 2019 23:44:10 +0000 Subject: [PATCH 65/69] Fix null dereference in moduleNeedsUpdate when the module isn't visible --- CHANGELOG.md | 1 + js/main.js | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb8526de47..a543e80c87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Installation script problems with raspbian - Calendar: only show repeating count if the event is actually repeating [#1534](https://github.com/MichMich/MagicMirror/pull/1534) - Calendar: Fix exdate handling when multiple values are specified (comma separated) +- Fix null dereference in moduleNeedsUpdate when the module isn't visible ### New weather module - Fixed weather forecast table display [#1499](https://github.com/MichMich/MagicMirror/issues/1499). diff --git a/js/main.js b/js/main.js index 7ec9b5f3a2..21a882f8ad 100644 --- a/js/main.js +++ b/js/main.js @@ -173,6 +173,10 @@ var MM = (function() { */ var moduleNeedsUpdate = function(module, newHeader, newContent) { var moduleWrapper = document.getElementById(module.identifier); + if (moduleWrapper === null) { + return false; + } + var contentWrapper = moduleWrapper.getElementsByClassName("module-content"); var headerWrapper = moduleWrapper.getElementsByClassName("module-header"); From 4a97052708ccd7ee71dea3c8686d0449c16ad440 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Thu, 14 Feb 2019 13:50:16 +0100 Subject: [PATCH 66/69] Fix linting error. --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2a284ed8da..e4248411d9 100644 --- a/README.md +++ b/README.md @@ -18,15 +18,15 @@ MagicMirror² focuses on a modular plugin system and uses [Electron](http://elec - [Table Of Contents](#table-of-contents) - [Installation](#installation) - - [Raspberry Pi](#raspberry-pi) - - [Automatic Installation (Raspberry Pi only!)](#automatic-installation-raspberry-pi-only) - - [Manual Installation](#manual-installation) - - [Server Only](#server-only) - - [Client Only](#client-only) - - [Docker](#docker) + - [Raspberry Pi](#raspberry-pi) + - [Automatic Installation (Raspberry Pi only!)](#automatic-installation-raspberry-pi-only) + - [Manual Installation](#manual-installation) + - [Server Only](#server-only) + - [Client Only](#client-only) + - [Docker](#docker) - [Configuration](#configuration) - - [Raspberry Specific](#raspberry-specific) - - [General](#general) + - [Raspberry Specific](#raspberry-specific) + - [General](#general) - [Modules](#modules) - [Updating](#updating) - [Community](#community) From d6a6a5362338e15b84cc1cddb27b6fa29321083a Mon Sep 17 00:00:00 2001 From: fwitte Date: Thu, 14 Feb 2019 16:48:45 +0100 Subject: [PATCH 67/69] updated weather icon display --- modules/default/weather/providers/openweathermap.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index 9ae7cbd4f3..856a52c1c0 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -132,10 +132,14 @@ WeatherProvider.register("openweathermap", { // specify date weather.date = moment(forecast.dt, "X"); - // select weather type by first forecast value of a day, is this reasonable? + // If the first value of today is later than 17:00, we have an icon at least! weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); } + + if (moment(forecast.dt, "X").format("H") >= 8 && moment(forecast.dt, "X").format("H") <= 17) { + weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); + } // the same day as before // add values from forecast to corresponding variables From cbe4d2cd7f92ee550abfed8ab1a4d481e49f45a9 Mon Sep 17 00:00:00 2001 From: vincep5 Date: Thu, 14 Feb 2019 13:00:40 -0600 Subject: [PATCH 68/69] weather module adjustments for rain and snow --- CHANGELOG.md | 1 + modules/default/weather/README.md | 2 +- modules/default/weather/forecast.njk | 6 +-- modules/default/weather/providers/README.md | 2 + modules/default/weather/providers/darksky.js | 17 ++++++-- .../weather/providers/openweathermap.js | 42 ++++++++++++++----- modules/default/weather/weather.css | 2 +- modules/default/weather/weather.js | 6 +-- modules/default/weather/weatherobject.js | 2 + 9 files changed, 58 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 061106b52d..ab838f7b46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Weather forecast now works with openweathermap for both, `/forecast` and `/forecast/daily`, in new weather module. If you use the `/forecast`-weatherEndpoint, the hourly data are converted to daily data, see issues [#1504](https://github.com/MichMich/MagicMirror/issues/1504), [#1513](https://github.com/MichMich/MagicMirror/issues/1513). - Added fade, fadePoint and maxNumberOfDays properties to the forecast mode [#1516](https://github.com/MichMich/MagicMirror/issues/1516) - Fixed Loading string and decimalSymbol string replace [#1538](https://github.com/MichMich/MagicMirror/issues/1538) +- Show Snow amounts in new weather module [#1545](https://github.com/MichMich/MagicMirror/issues/1545) ## [2.6.0] - 2019-01-01 diff --git a/modules/default/weather/README.md b/modules/default/weather/README.md index 9de4df7c73..d15a208fb7 100644 --- a/modules/default/weather/README.md +++ b/modules/default/weather/README.md @@ -70,7 +70,7 @@ The following properties can be configured: | ---------------------------- | ----------- | `tableClass` | The class for the forecast table.

**Default value:** `'small'` | `colored` | If set to `true`, the min and max temperature are color coded.

**Default value:** `false` -| `showRainAmount` | Show the amount of rain in the forecast

**Possible values:** `true` or `false`
**Default value:** `true` +| `showPrecipitationAmount` | Show the amount of rain/snow in the forecast

**Possible values:** `true` or `false`
**Default value:** `false` | `fade` | Fade the future events to black. (Gradient)

**Possible values:** `true` or `false`
**Default value:** `true` | `fadePoint` | Where to start fade?

**Possible values:** `0` (top of the list) - `1` (bottom of list)
**Default value:** `0.25` | `maxNumberOfDays` | How many days of forecast to return. Specified by config.js

**Possible values:** `1` - `16`
**Default value:** `5` (5 days)
This value is optional. By default the weatherforecast module will return 5 days. diff --git a/modules/default/weather/forecast.njk b/modules/default/weather/forecast.njk index 56074047c7..8e997c8579 100644 --- a/modules/default/weather/forecast.njk +++ b/modules/default/weather/forecast.njk @@ -13,9 +13,9 @@ {{ f.minTemperature | roundValue | unit("temperature") }} - {% if config.showRainAmount %} - - {{ f.rain | unit("rain") }} + {% if config.showPrecipitationAmount %} + + {{ f.precipitation | unit("precip") }} {% endif %} diff --git a/modules/default/weather/providers/README.md b/modules/default/weather/providers/README.md index f204a88adb..85d9c3c587 100644 --- a/modules/default/weather/providers/README.md +++ b/modules/default/weather/providers/README.md @@ -103,6 +103,8 @@ A convinience function to make requests. It returns a promise. | weatherType | `string` | Icon name of the weather type.
Possible values: [WeatherIcons](https://www.npmjs.com/package/weathericons) | | humidity | `number` | Percentage of humidity | | rain | `number` | Metric: `millimeters`
Imperial: `inches` | +| snow | `number` | Metric: `millimeters`
Imperial: `inches` | +| precipitation | `number` | Metric: `millimeters`
Imperial: `inches` | #### Current weather diff --git a/modules/default/weather/providers/darksky.js b/modules/default/weather/providers/darksky.js index 4b1bc4ee1f..7bfc4c0f27 100644 --- a/modules/default/weather/providers/darksky.js +++ b/modules/default/weather/providers/darksky.js @@ -8,6 +8,7 @@ * MIT Licensed * * This class is a provider for Dark Sky. + * Note that the Dark Sky API does not provide rainfall. Instead it provides snowfall and precipitation probability */ WeatherProvider.register("darksky", { // Set the name of the provider. @@ -81,12 +82,20 @@ WeatherProvider.register("darksky", { weather.minTemperature = forecast.temperatureMin; weather.maxTemperature = forecast.temperatureMax; weather.weatherType = this.convertWeatherType(forecast.icon); - if (this.config.units === "metric" && !isNaN(forecast.precipAccumulation)) { - weather.rain = forecast.precipAccumulation * 10; - } else { - weather.rain = forecast.precipAccumulation; + weather.snow = 0; + + // The API will return centimeters if units is 'si' and will return inches for 'us' + // Note that the Dark Sky API does not provide rainfall. Instead it provides snowfall and precipitation probability + if (forecast.hasOwnProperty("precipAccumulation")) { + if (this.config.units === "imperial" && !isNaN(forecast.precipAccumulation)) { + weather.snow = forecast.precipAccumulation; + } else if (!isNaN(forecast.precipAccumulation)) { + weather.snow = forecast.precipAccumulation * 10; + } } + weather.precipitation = weather.snow; + days.push(weather); } diff --git a/modules/default/weather/providers/openweathermap.js b/modules/default/weather/providers/openweathermap.js index 856a52c1c0..e388e2788a 100644 --- a/modules/default/weather/providers/openweathermap.js +++ b/modules/default/weather/providers/openweathermap.js @@ -106,6 +106,7 @@ WeatherProvider.register("openweathermap", { var minTemp = []; var maxTemp = []; var rain = 0; + var snow = 0; // variable for date let date = ""; var weather = new WeatherObject(this.config.units); @@ -117,6 +118,8 @@ WeatherProvider.register("openweathermap", { weather.minTemperature = Math.min.apply(null, minTemp); weather.maxTemperature = Math.max.apply(null, maxTemp); weather.rain = rain; + weather.snow = snow; + weather.precipitation = weather.rain + weather.snow; // push weather information to days array days.push(weather); // create new weather-object @@ -125,6 +128,7 @@ WeatherProvider.register("openweathermap", { minTemp = []; maxTemp = []; rain = 0; + snow = 0; // set new date date = moment(forecast.dt, "X").format("YYYY-MM-DD"); @@ -149,20 +153,27 @@ WeatherProvider.register("openweathermap", { if (forecast.hasOwnProperty("rain")) { if (this.config.units === "imperial" && !isNaN(forecast.rain["3h"])) { rain += forecast.rain["3h"] / 25.4; - } else if (!isNaN(forecast.rain["3h"])){ + } else if (!isNaN(forecast.rain["3h"])) { rain += forecast.rain["3h"]; - } else { - rain += 0; } - } else { - rain += 0; + } + + if (forecast.hasOwnProperty("snow")) { + if (this.config.units === "imperial" && !isNaN(forecast.snow["3h"])) { + snow += forecast.snow["3h"] / 25.4; + } else if (!isNaN(forecast.snow["3h"])) { + snow += forecast.snow["3h"]; + } } } + // last day // calculate minimum/maximum temperature, specify rain amount weather.minTemperature = Math.min.apply(null, minTemp); weather.maxTemperature = Math.max.apply(null, maxTemp); weather.rain = rain; + weather.snow = snow; + weather.precipitation = weather.rain + weather.snow; // push weather information to days array days.push(weather); return days.slice(1); @@ -182,20 +193,31 @@ WeatherProvider.register("openweathermap", { weather.minTemperature = forecast.temp.min; weather.maxTemperature = forecast.temp.max; weather.weatherType = this.convertWeatherType(forecast.weather[0].icon); + weather.rain = 0; + weather.snow = 0; // forecast.rain not available if amount is zero + // The API always returns in millimeters if (forecast.hasOwnProperty("rain")) { if (this.config.units === "imperial" && !isNaN(forecast.rain)) { weather.rain = forecast.rain / 25.4; - } else if (!isNaN(forecast.rain)){ + } else if (!isNaN(forecast.rain)) { weather.rain = forecast.rain; - } else { - weather.rain = 0; } - } else { - weather.rain = 0; } + // forecast.snow not available if amount is zero + // The API always returns in millimeters + if (forecast.hasOwnProperty("snow")) { + if (this.config.units === "imperial" && !isNaN(forecast.snow)) { + weather.snow = forecast.snow / 25.4; + } else if (!isNaN(forecast.snow)) { + weather.snow = forecast.snow; + } + } + + weather.precipitation = weather.rain + weather.snow; + days.push(weather); } diff --git a/modules/default/weather/weather.css b/modules/default/weather/weather.css index 3a061bd4bd..639ce7a9ce 100644 --- a/modules/default/weather/weather.css +++ b/modules/default/weather/weather.css @@ -31,7 +31,7 @@ padding-right: 0; } -.weather .rain { +.weather .precipitation { padding-left: 20px; padding-right: 0; } diff --git a/modules/default/weather/weather.js b/modules/default/weather/weather.js index f554c1fe2a..097b1437f2 100644 --- a/modules/default/weather/weather.js +++ b/modules/default/weather/weather.js @@ -49,7 +49,7 @@ Module.register("weather",{ tableClass: "small", onlyTemp: false, - showRainAmount: true, + showPrecipitationAmount: false, colored: false, showFeelsLike: true }, @@ -200,8 +200,8 @@ Module.register("weather",{ value += "K"; } } - } else if (type === "rain") { - if (isNaN(value) || value === 0) { + } else if (type === "precip") { + if (isNaN(value) || value === 0 || value.toFixed(2) === "0.00") { value = ""; } else { value = `${value.toFixed(2)} ${this.config.units === "imperial" ? "in" : "mm"}`; diff --git a/modules/default/weather/weatherobject.js b/modules/default/weather/weatherobject.js index 8768d49d76..f3b34bf2d6 100644 --- a/modules/default/weather/weatherobject.js +++ b/modules/default/weather/weatherobject.js @@ -26,6 +26,8 @@ class WeatherObject { this.weatherType = null; this.humidity = null; this.rain = null; + this.snow = null; + this.precipitation = null; } cardinalWindDirection() { From 954253c7e2059386ad3d60fa33457881ec0e6262 Mon Sep 17 00:00:00 2001 From: Michael Teeuw Date: Fri, 15 Feb 2019 11:15:06 +0100 Subject: [PATCH 69/69] Remove Slack. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index e4248411d9..1cadc57af6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ License Travis Known Vulnerabilities - Slack Status

**MagicMirror²** is an open source modular smart mirror platform. With a growing list of installable modules, the **MagicMirror²** allows you to convert your hallway or bathroom mirror into your personal assistant. **MagicMirror²** is built by the creator of [the original MagicMirror](http://michaelteeuw.nl/tagged/magicmirror) with the incredible help of a [growing community of contributors](https://github.com/MichMich/MagicMirror/graphs/contributors).