Merge pull request #4 from KristjanESPERANTO/develop

Review
This commit is contained in:
sam detweiler 2024-09-23 14:10:49 -07:00 committed by GitHub
commit 5e018ed78f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 1736 additions and 130 deletions

View file

@ -1,14 +0,0 @@
{
"extends": "airbnb-base",
"globals": {
"Module": true,
"Log": true,
"MM": true
},
"rules": {
"comma-dangle": "off",
"object-shorthand": "off",
"func-names": "off",
"space-before-function-paren": "off"
}
}

View file

@ -10,6 +10,7 @@ A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
(Please paste any information on reproducing the issue, for example:)
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
@ -23,14 +24,16 @@ If applicable, add screenshots to help explain your problem. If you believe you
have aptly described your issue in words, feel free to ignore/delete this section.
**Please fill out the following information;**
- Node version: [This can be obtained by running `node --version`]
- Have you updated to the latest MagicMirror core? [yes/no]
- Please post the relevant part of your config file here:
- Node version: [This can be obtained by running `node --version`]
- Have you updated to the latest MagicMirror core? [yes/no]
- Please post the relevant part of your config file here:
```json
(Paste the part of the config file here)
```
- Please post any errors you see about MMM-Pages in the console (Hit F12 > Console when the Magic Mirror window is focused), or write **None** if there aren't any:
```
```
- Please post any errors you see about MMM-pages in the console (Hit F12 > Console when the MagicMirror window is focused), or write **None** if there aren't any:
**Additional context**
Add any other context about the problem here.

View file

@ -27,7 +27,7 @@ Module.register('MMM-pages', {
/**
* Apply any styles, if we have any.
*/
getStyles: function () {
getStyles () {
return ['pages.css'];
},
@ -38,7 +38,7 @@ Module.register('MMM-pages', {
* @param {number} x The dividend
* @param {number} n The divisor
*/
mod: function (x, n) {
mod (x, n) {
return ((x % n) + n) % n;
},
@ -46,7 +46,7 @@ Module.register('MMM-pages', {
* Pseudo-constructor for our module. Makes sure that values aren't negative,
* and sets the default current page to 0.
*/
start: function () {
start () {
// Clamp homePage value to [0, num pages).
if (this.config.homePage >= this.config.modules.length || this.config.homePage < 0) {
this.config.homePage = 0;
@ -56,12 +56,12 @@ Module.register('MMM-pages', {
// Compatibility
if (this.config.excludes.length) {
Log.warn('[Pages]: The config option "excludes" is deprecated. Please use "fixed" instead.');
Log.warn('[MMM-pages]: The config option "excludes" is deprecated. Please use "fixed" instead.');
this.config.fixed = this.config.excludes;
}
if (this.config.rotationFirstPage) {
Log.warn('[Pages]: The config option "rotationFirstPage" is deprecated. Please used "rotationHomePage" instead.');
Log.warn('[MMM-pages]: The config option "rotationFirstPage" is deprecated. Please used "rotationHomePage" instead.');
this.config.rotationHomePage = this.config.rotationFirstPage;
}
@ -71,7 +71,7 @@ Module.register('MMM-pages', {
this.config.rotationHomePage = Math.max(this.config.rotationHomePage, 0);
if (!this.config.useLockString) {
Log.log('[Pages]: User opted to not use lock strings!');
Log.log('[MMM-pages]: User opted to not use lock strings!');
}
},
@ -93,28 +93,28 @@ Module.register('MMM-pages', {
* @param {string} notification the notification ID
* @param {number|string} payload the page to change to/by
*/
notificationReceived: function (notification, payload) {
notificationReceived (notification, payload) {
switch (notification) {
case 'PAGE_CHANGED':
Log.log('[Pages]: received a notification '
Log.log('[MMM-pages]: received a notification '
+ `to change to page ${payload} of type ${typeof payload}`);
this.curPage = payload;
this.updatePages();
break;
case 'PAGE_INCREMENT':
Log.log('[Pages]: received a notification to increment pages!');
Log.log('[MMM-pages]: received a notification to increment pages!');
this.changePageBy(payload, 1);
this.updatePages();
break;
case 'PAGE_DECREMENT':
Log.log('[Pages]: received a notification to decrement pages!');
Log.log('[MMM-pages]: received a notification to decrement pages!');
// We can't just pass in -payload for situations where payload is null
// JS will coerce -payload to -0.
this.changePageBy(payload ? -payload : payload, -1);
this.updatePages();
break;
case 'DOM_OBJECTS_CREATED':
Log.log('[Pages]: received that all objects are created;'
Log.log('[MMM-pages]: received that all objects are created;'
+ ' will now hide things!');
this.sendNotification('MAX_PAGES_CHANGED', this.config.modules.length);
this.sendNotification('NEW_PAGE', this.curPage);
@ -134,12 +134,12 @@ Module.register('MMM-pages', {
this.notificationReceived('PAGE_CHANGED', this.config.homePage);
break;
case 'SHOW_HIDDEN_PAGE':
Log.log(`[Pages]: received a notification to change to the hidden page "${payload}" of type "${typeof payload}"`);
Log.log(`[MMM-pages]: received a notification to change to the hidden page "${payload}" of type "${typeof payload}"`);
this.setRotation(false);
this.showHiddenPage(payload);
break;
case 'LEAVE_HIDDEN_PAGE':
Log.log("[Pages]: received a notification to leave the current hidden page ");
Log.log("[MMM-pages]: received a notification to leave the current hidden page ");
this.animatePageChange();
this.setRotation(true);
break;
@ -157,9 +157,9 @@ Module.register('MMM-pages', {
* @param {number} fallback the fallback value to use. Accepts negative
* numbers.
*/
changePageBy: function (amt, fallback) {
changePageBy (amt, fallback) {
if (typeof amt !== 'number' && typeof fallback === 'undefined') {
Log.warn(`[Pages]: ${amt} is not a number!`);
Log.warn(`[MMM-pages]: ${amt} is not a number!`);
}
if (typeof amt === 'number' && !Number.isNaN(amt)) {
@ -179,15 +179,15 @@ Module.register('MMM-pages', {
* Handles hiding the current page's elements and showing the next page's
* elements.
*/
updatePages: function () {
// Update iff there's at least one page.
updatePages () {
// Update if there's at least one page.
if (this.config.modules.length !== 0) {
this.animatePageChange();
if (!this.rotationPaused) {
this.resetTimerWithDelay(0);
}
this.sendNotification('NEW_PAGE', this.curPage);
} else { Log.error("[Pages]: Pages aren't properly defined!"); }
} else { Log.error("[MMM-pages]: Pages aren't properly defined!"); }
},
/**
@ -198,7 +198,7 @@ Module.register('MMM-pages', {
* @param {string} [targetPageName] the name of the hiddenPage we want to show.
* Optional and only used when we want to switch to a hidden page
*/
animatePageChange: function (targetPageName) {
animatePageChange (targetPageName) {
let lockStringObj = { lockString: this.identifier };
if (!this.config.useLockString) {
// Passing in an undefined object is equivalent to not passing it in at
@ -235,7 +235,7 @@ Module.register('MMM-pages', {
*
* @param {number} delay the delay, in milliseconds.
*/
resetTimerWithDelay: function (delay) {
resetTimerWithDelay (delay) {
if (this.config.rotationTime > 0) {
// This timer is the auto rotate function.
if(this.timer){
@ -247,11 +247,11 @@ Module.register('MMM-pages', {
clearTimeout(this.delayTimer);
this.delayTimer=null
}
let rotation_timeout=this.config.rotationTime
let rotationTimeout=this.config.rotationTime
if(this.config.pageTimeout.length){
for(let pageInfo of this.config.pageTimeout){
if((pageInfo.pageNumber) -1 == this.curPage){
rotation_timeout= pageInfo.timeout
rotationTimeout= pageInfo.timeout
break;
}
}
@ -264,7 +264,7 @@ Module.register('MMM-pages', {
// message, so we need to trigger it for ourselves.
self.sendNotification('PAGE_INCREMENT');
self.notificationReceived('PAGE_INCREMENT');
}, rotation_timeout);
}, rotationTimeout);
}, delay, this);
} else if (this.config.rotationHomePage > 0) {
// This timer is the auto rotate function.
@ -277,11 +277,11 @@ Module.register('MMM-pages', {
clearTimeout(this.delayTimer);
this.delayTimer=null
}
let rotation_timeout=this.config.rotationHomePage
let rotationTimeout=this.config.rotationHomePage
if(this.config.pageTimeout.length){
for(let pageInfo of this.config.pageTimeout){
if((pageInfo.pagenumber) -1 == this.curPage){
rotation_timeout= pageInfo.timeout
rotationTimeout= pageInfo.timeout
break;
}
}
@ -295,7 +295,7 @@ Module.register('MMM-pages', {
// message, so we need to trigger it for ourselves.
self.sendNotification('PAGE_CHANGED', 0);
self.notificationReceived('PAGE_CHANGED', self.config.homePage);
}, rotation_timeout);
}, rotationTimeout);
}, delay);
}
},
@ -308,12 +308,12 @@ Module.register('MMM-pages', {
*
* @param {boolean} isRotating the parameter, if you want to pause or resume.
*/
setRotation: function (isRotating) {
setRotation (isRotating) {
const stateBaseString = (isRotating) ? "resum" : "paus";
if (isRotating === this.rotationPaused) {
Log.warn(`[Pages]: Was asked to ${stateBaseString}e but rotation is already ${stateBaseString}ed!`);
Log.warn(`[MMM-pages]: Was asked to ${stateBaseString}e but rotation is already ${stateBaseString}ed!`);
} else {
Log.log(`[Pages]: ${stateBaseString}ing rotation`);
Log.log(`[MMM-pages]: ${stateBaseString}ing rotation`);
if (!isRotating) {
if(this.timer){
this.timer_clear_function(this.timer);
@ -335,7 +335,7 @@ Module.register('MMM-pages', {
*
* @param {string} name the name of the hiddenPage we want to show
*/
showHiddenPage: function (name) {
showHiddenPage (name) {
// Only proceed if the named hidden page actually exists
if (name in this.config.hiddenPages) {
this.animatePageChange(name);

56
eslint.config.mjs Normal file
View file

@ -0,0 +1,56 @@
import eslintPluginJs from "@eslint/js";
import eslintPluginStylistic from "@stylistic/eslint-plugin";
import globals from "globals";
const config = [
{
files: ["**/*.js", "**/*.mjs"],
},
{
languageOptions: {
globals: {
...globals.browser,
...globals.node,
Log: "readonly",
MM: "readonly",
Module: "readonly",
},
},
plugins: {
...eslintPluginStylistic.configs["all-flat"].plugins,
},
rules: {
...eslintPluginJs.configs.all.rules,
...eslintPluginStylistic.configs["all-flat"].rules,
"@stylistic/array-element-newline": "off",
"@stylistic/brace-style": ["error", "1tbs", { allowSingleLine: true }],
"@stylistic/comma-dangle": ["error", "only-multiline"],
"@stylistic/dot-location": ["error", "property"],
"@stylistic/function-call-argument-newline": "off",
"@stylistic/indent": ["error", 2],
"@stylistic/max-statements-per-line": ["error", { max: 2 }],
"@stylistic/object-curly-spacing": "off",
"@stylistic/padded-blocks": "off",
"@stylistic/quote-props": ["error", "consistent-as-needed"],
"init-declarations": "off",
"@stylistic/quotes": ["error", "double"],
"@stylistic/multiline-comment-style": "off",
"@stylistic/multiline-ternary": "off",
"capitalized-comments": "off",
"consistent-this": "off",
"max-lines": "off",
"max-lines-per-function": "off",
"max-statements": "off",
"no-empty-function": "off",
"no-inline-comments": "off",
"no-magic-numbers": "off",
"no-negated-condition": "off",
"no-ternary": "off",
"no-undefined": "off",
"one-var": "off",
"sort-keys": "off",
},
}
];
export default config;

1543
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

32
package.json Normal file
View file

@ -0,0 +1,32 @@
{
"name": "mmm-pages",
"version": "1.0.0",
"description": "Add pages to your MagicMirror².",
"main": "MMM-pages.js",
"scripts": {
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"test": "npm run lint"
},
"repository": {
"type": "git",
"url": "git+https://github.com/sdetweil/MMM-pages.git"
},
"keywords": [
"MagicMirror",
"pages",
"slides"
],
"author": "Edward Shen",
"license": "MIT",
"bugs": {
"url": "https://github.com/sdetweil/MMM-pages/issues"
},
"homepage": "https://github.com/sdetweil/MMM-pages#readme",
"devDependencies": {
"@eslint/js": "^9.10.0",
"@stylistic/eslint-plugin": "^2.8.0",
"eslint": "^9.10.0",
"globals": "^15.9.0"
}
}

146
readme.md
View file

@ -1,27 +1,6 @@
# Maintainer needed
Hello, it's been 5 years since I've written this! While I'm happy to see it
thriving, it's also about time I step away. I haven't had a MagicMirror up
in years, and to be frank, I'm hoping someone else will be willing to take
up maintainership of the project.
I find this project to be in a near complete form. Other than a few mishaps of
me not having proper testing before pushing out code, more often than not any
problems that people have usually isn't often because of this project. The few
issues that do exist aren't very hard to fix nor are they severe that they
impact the project in any large manner. It's just I haven't had the time nor
motivation to fix them.
I don't think there are expectations for this project to have new features, so
a maintainer should really only need to just make sure people are getting help
when they raise issues and fix the rare bug that pops out every so often. If
you're interested, please don't hesitate to reach out.
---
# MMM-pages
This [MagicMirror²][mm] Module allows you to have pages in your MagicMirror!
This [MagicMirror²][mm] module allows you to have pages in your MagicMirror!
Want to have more modules in your MagicMirror, but want to keep the format?
Or, want to have grouped modules that are themed together? Look no further!
@ -31,9 +10,11 @@ Note that this module does not provide any method of manually changing the page!
You should ask other developers to add a notification to their modules, or add
one yourself!
To display what page you're on, check out the [page indicator module][page indicator].
## Installation
In your terminal, go to your MagicMirror's Module folder:
In your terminal, go to your MagicMirror's module folder:
```bash
cd ~/MagicMirror/modules
@ -42,69 +23,74 @@ cd ~/MagicMirror/modules
Clone this repository:
```bash
git clone https://github.com/sdetweil/MMM-pages.git
git clone https://github.com/sdetweil/MMM-pages
```
Configure the module in your config.js file.
## Update
*\<self-promotion>*
Go to the modules folder inside your MagicMirror's module folder and pull the latest version:
To display what page you're on, I'd highly recommend checking out my
[page indicator module][page indicator].
```bash
cd ~/MagicMirror/modules/MMM-pages
git pull
```
*\<\\self-promotion>*
## Using the module
## Configuration
To use this module, add it to the modules array in the `config/config.js` file.
Note: module names used in the following example are fictitious.
this approach uses the module names as the page organization technique, as the modulename is added as a css class in the MM page content.
Because the modulename is used, this approach does not support multiple instances of the same module with data
on different pages. (like your calendar on page 1, and someone elses on page 2)
Note: module names used in the following example are fictitious.
This approach uses the module names as the page organization technique, as the modulename is added as a CSS class in the MM page content.
Because the modulename is used, this approach does not support multiple instances of the same module with data
on different pages (like your calendar on page 1, and someone elses on page 2).
```js
modules: [
{
module: 'MMM-pages',
config: {
modules:
[[ "newsfeed" ],
[ "calendar", "compliments" ]],
fixed: [ "clock", "weather", "MMM-page-indicator" ],
hiddenPages: {
"screenSaver": [ "clock", "MMM-SomeBackgroundImageModule" ],
"admin": [ "MMM-ShowMeSystemStatsModule", "MMM-AnOnScreenMenuModule" ],
},
}
{
module: "MMM-pages",
config: {
modules: [
["newsfeed"],
["calendar", "compliments"]
],
fixed: ["clock", "weather", "MMM-page-indicator"],
hiddenPages: {
"screenSaver": ["clock", "MMM-SomeBackgroundImageModule"],
"admin": ["MMM-ShowMeSystemStatsModule", "MMM-AnOnScreenMenuModule"]
}
}
]
},
];
```
and alternative approach, is to define a fixed MMM-pages config
```js
modules: [
{
module: 'MMM-pages',
config: {
modules:
[[ "page1" ],
[ "page2" ],
[ "page3" ],
],
fixed: [ "fixed_page" ],
hiddenPages: {
"screenSaver": [ "screensaver_page" ],
"admin": [ "admin_page" ],
},
}
{
module: "MMM-pages",
config: {
modules: [
["page1"],
["page2"],
["page3"]
],
fixed: ["fixed_page"],
hiddenPages: {
"screenSaver": ["screensaver_page"],
"admin": ["admin_page"]
}
}
]
},
];
```
and then at each module, add a classes: property to indicate the page(s) this module is supposed to appear on
```
{
```js
{
module:"newsfeed",
classes:"page1",
},
@ -117,11 +103,13 @@ and then at each module, add a classes: property to indicate the page(s) this mo
classes:"page2",
}
```
etc
if u want a modules content on multiple pages the classes would list those page names
```
{
etc.
If u want a modules content on multiple pages the classes would list those page names
```js
{
module:"newsfeed",
classes:"page1",
},
@ -132,14 +120,14 @@ if u want a modules content on multiple pages the classes would list those page
{
module:"calendar", // second calendar instance on page 3
classes:"page3",
},
},
{
module:"compliments",
classes:"page1 page2", // this module appears on multiple pages
}
```
## Configuration options
### Configuration options
| Option | Type | Default Value | Description |
| --- | --- | --- | --- |
@ -153,13 +141,11 @@ if u want a modules content on multiple pages the classes would list those page
| `rotationHomePage` | `int` | `0` | Time, in milliseconds, before automatically returning to the home page. If a home page is not set, this returns to the leftmost page instead. |
| `rotationFirstPage` | *NA* | *NA* | **Deprecated**. Use `rotationHomePage` instead. |
| `homePage` | `int` | `0` | Which page index is the home page. If none is set, this returns to the leftmost page instead. |
| `useLockString` | `bool` | `true` | Whether or not to use a lock string to show or hide pages. If disabled, other modules may override when modules may be shown. _Advanced users only. Only override this if you know what you're doing._
| `pageTimeout ` | `[]` | `{pageNumber:x,timeout:nnnn}`| array of structures, enable different timeouts for different pages
|||| pageNumber starts at 1 for the first page, timeout is in milliseconds
| `useLockString` | `bool` | `true` | Whether or not to use a lock string to show or hide pages. If disabled, other modules may override when modules may be shown. *Advanced users only. Only override this if you know what you're doing.* |
| `pageTimeout` | `[]` | `{pageNumber:x,timeout:nnnn}`| array of structures, enable different timeouts for different pages. |
|||| `pageNumber` starts at 1 for the first page, timeout is in milliseconds. |
For the `module` configuration option, the first element of the outer array
should consist of elements that should be on the first page. The second element
should consist of elements that should be on the second page, and so forth.
For the `module` configuration option, the first element of the outer array should consist of elements that should be on the first page. The second element should consist of elements that should be on the second page, and so forth.
## Notifications
@ -197,7 +183,7 @@ index of 1, and the page to the right of that has an index of 2. Thus, to change
to the third page, your module should send out:
```js
this.sendNotification("PAGE_CHANGED", 2);
this.sendNotification("PAGE_CHANGED", 2);
```
This module keeps internal track of how many pages you have, defined by your
@ -209,8 +195,8 @@ MMM-pages notifications.
### Initialization
_This section provides documentation on what notifications the module sends on
startup. This section isn't necessary to read for most users._
*This section provides documentation on what notifications the module sends on
startup. This section isn't necessary to read for most users.*
MMM-pages doesn't activate until we receive the `DOM_OBJECTS_CREATED`
notification, as that notification ensures all modules have been loaded. On this