From 2ccd56ef363dcfc4667b556e5a3755c4efa2d921 Mon Sep 17 00:00:00 2001 From: Kristjan ESPERANTO <35647502+KristjanESPERANTO@users.noreply.github.com> Date: Tue, 25 Mar 2025 19:13:37 +0100 Subject: [PATCH] feat: Add individual rotation time for each page (#88) --- MMM-pages.js | 18 ++++++++++++++---- README.md | 47 +++++++++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/MMM-pages.js b/MMM-pages.js index 7e1ece5..86d6e05 100644 --- a/MMM-pages.js +++ b/MMM-pages.js @@ -12,6 +12,7 @@ Module.register('MMM-pages', { hiddenPages: {}, animationTime: 1000, rotationTime: 0, + timings: { default: 0 }, rotationFirstPage: 0, // Keep for compatibility rotationHomePage: 0, rotationDelay: 10000, @@ -48,12 +49,17 @@ Module.register('MMM-pages', { } if (this.config.rotationFirstPage) { - Log.warn('[MMM-pages] The config option "rotationFirstPage" is deprecated. Please used "rotationHomePage" instead.'); + Log.warn('[MMM-pages] The config option "rotationFirstPage" is deprecated. Please use "rotationHomePage" instead.'); this.config.rotationHomePage = this.config.rotationFirstPage; } + if (this.config.rotationTime) { + Log.warn('[MMM-pages] The config option "rotationTime" is deprecated. Please use "timings" instead.'); + this.config.timings.default = this.config.rotationTime; + } + // Disable rotation if an invalid input is given - this.config.rotationTime = Math.max(this.config.rotationTime, 0); + this.config.timings.default = Math.max(this.config.timings.default, 0); this.config.rotationDelay = Math.max(this.config.rotationDelay, 0); this.config.rotationHomePage = Math.max(this.config.rotationHomePage, 0); @@ -221,11 +227,15 @@ Module.register('MMM-pages', { * @param {number} delay the delay, in milliseconds. */ resetTimerWithDelay(delay) { - if (this.config.rotationTime > 0) { + if (this.config.timings.default > 0 || Object.keys(this.config.timings).length > 1) { // This timer is the auto rotate function. clearInterval(this.timer); // This is delay timer after manually updating. clearInterval(this.delayTimer); + let currentRotationTime = this.config.timings.default; + if (this.config.timings[this.curPage]) { + currentRotationTime = this.config.timings[this.curPage]; + } const self = this; this.delayTimer = setTimeout(() => { @@ -235,7 +245,7 @@ Module.register('MMM-pages', { // message, so we need to trigger it for ourselves. self.sendNotification('PAGE_INCREMENT'); self.notificationReceived('PAGE_INCREMENT'); - }, self.config.rotationTime); + }, currentRotationTime); }, delay); } else if (this.config.rotationHomePage > 0) { // This timer is the auto rotate function. diff --git a/README.md b/README.md index 29394ef..c646b23 100644 --- a/README.md +++ b/README.md @@ -71,10 +71,13 @@ The first element of the array is the first page, the second element is the seco { module: "MMM-pages", config: { - rotationTime: 1000 * 20, // rotate every 20 seconds + timings: { + default: 5000, // rotate every 5 seconds + 0: 20000 // page 0 rotates every 20 seconds + }, modules: [ - ["newsfeed"], // page 1 - ["calendar", "compliments"], // page 2 + ["newsfeed"], // page 0 + ["calendar", "compliments"], // page 1 ], fixed: [ // modules that are always shown "clock", @@ -103,11 +106,14 @@ Instead of using the module name, you can also use a class name for each page. T { module: "MMM-pages", config: { - rotationTime: 1000 * 20, // rotate every 20 seconds + timings: { + default: 20000, // rotate every 20 seconds + 2: 30000 // page 2 rotates every 30 seconds + }, modules: [ + ["page0"], // class name for page 0 ["page1"], // class name for page 1 ["page2"], // class name for page 2 - ["page3"], // class name for page 3 ], fixed: ["fixed_page"], hiddenPages: { @@ -121,15 +127,23 @@ Instead of using the module name, you can also use a class name for each page. T You have to add the class name to the config of the module you want to show on a specific page. You can even add more than one class name to show a module instance on multiple pages. ```js - { // newsfeed on page 1 + { // newsfeed on page 0 module: "newsfeed", + classes: "page0", + position: "...", + config: { + ... + } + }, + { // first calendar instance on page 1 + module: "calendar", classes: "page1", position: "...", config: { ... } }, - { // first calendar instance on page 2 + { // second calendar instance on page 2 module: "calendar", classes: "page2", position: "...", @@ -137,17 +151,9 @@ You have to add the class name to the config of the module you want to show on a ... } }, - { // second calendar instance on page 3 - module: "calendar", - classes: "page3", - position: "...", - config: { - ... - } - }, - { // this compliments instance appears on page 1 and 3 + { // this compliments instance appears on page 0 and 2 module: "compliments", - classes: "page1 page3", + classes: "page0 page2", position: "...", config: { ... @@ -158,14 +164,15 @@ You have to add the class name to the config of the module you want to show on a ### Configuration options -| Option | Type | Default Value | Description | -| --- | --- | --- | --- | +| Option | Type | Default Value | Description | +| ------------------- | -------------------------- | ------------------------ | ----------- | | `modules` | `[[String...]...]` | `[]` | A 2D String array of what each module should be on which page. Note that all entries must take their class name (e.g. this module's class name is `MMM-pages`, while the default modules may just have `newsfeed`, without the `MMM-` prefix. | | `fixed` | `[String...]` | `["MMM-page-indicator"]` | Which modules should show up all the time. | | `excludes` | *NA* | *NA* | **Deprecated**. Use `fixed` instead. | | `hiddenPages` | `{String: [String...]...}` | `{}` | An Object defining special `hiddenPages` which are not available on the normal page rotation and only accessible via a notification. Modules defined in `fixed` are ignored and need to be also added if you wish to have them on any hidden page. | | `animationTime` | `int` | `1000` | Fading animation time. Set to `0` for instant change. Value is in milliseconds (1 second = 1000 milliseconds). | -| `rotationTime` | `int` | `0` | Time, in milliseconds, between automatic page changes. | +| `rotationTime` | *NA* | *NA* | **Deprecated**. Use `timings` instead. | +| `timings` | `object` | `{ default: 0 }` | An object whose keys define the rotation time of the pages in milliseconds.
Example, where each page is 3 seconds, except page 3 which is 20 seconds:
`{ default: 3000, 2: 20000 }`
If a page is not defined, it will use the `default` value.
*Note:* Remember that the numbering starts at 0, so the first page is `0`, the second page is `1`, and so forth. | | `rotationDelay` | `int` | `10000` | Time, in milliseconds, of how long should a manual page change linger before returning to automatic page changing. In other words, how long should the timer wait for after you manually change a page. This does include the animation time, so you may wish to increase it by a few seconds or so to account for the animation time. | | `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. |