• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

MMM-CalendarExt3

Scheduled Pinned Locked Moved Utilities
666 Posts 79 Posters 2.2m Views 83 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G Offline
    gonzonia @gonzonia
    last edited by Dec 7, 2024, 2:56 AM

    Also, I’m using the xrandr mode for mmm-pir since I’m in Raspbian 11 and when I use dpms it doesn’t wake the screen for some reason.

    1 Reply Last reply Reply Quote 0
    • S Offline
      sdetweil @gonzonia
      last edited by sdetweil Dec 7, 2024, 12:49 PM Dec 7, 2024, 4:33 AM

      @gonzonia when a module is hidden , nothing shows

      Sam

      How to add modules

      learning how to use browser developers window for css changes

      G 1 Reply Last reply Dec 11, 2024, 12:40 AM Reply Quote 0
      • R Offline
        Ragged4310
        last edited by Dec 8, 2024, 6:08 PM

        My wife takes appointments for her business, so she has a lot of events each day she works. I want to be able to merge back-to-back events and show the start time of the first event and the end time of the last event to reduce the number of entries on the calendar.

        Ideally, I would like something that could account for gaps between appointments as well since she will still be at work. Ie) I can set the transformer to combine all events that are <= 2 hours apart, and it will show me the start time of the first event and the end time of the last event. I know it’s asking for a lot, and it’s probably not even possible, but I wanted to ask.

        M 1 Reply Last reply Dec 9, 2024, 2:19 AM Reply Quote 0
        • M Offline
          MMRIZE @Ragged4310
          last edited by Dec 9, 2024, 2:19 AM

          @Ragged4310
          Could you show me the example of the events?

          R 1 Reply Last reply Dec 9, 2024, 10:42 PM Reply Quote 0
          • R Offline
            Ragged4310 @MMRIZE
            last edited by Ragged4310 Dec 9, 2024, 10:50 PM Dec 9, 2024, 10:42 PM

            @MMRIZE said in MMM-CalendarExt3:

            @Ragged4310
            Could you show me the example of the events?

            alt text

            I would like to consolidate the events with the little yellow massage person if its possible since she is gone for the whole time and it hogs up the event space. I tried using chatgpt and perplexity, but everytime they gave me something the calendar would not load.

            For Dec 11 she has 3 appointments back to back, instead of it taking up 3 lines I would prefer if I could get it to show 2:00PM - 7:00PM for one event.

            For Dec 23, she currently only has 2 appointments and there’s a small gap. Since the gap is < 2 hours I would like if I could consolidate that as well so it would show 10:00AM - 2:00PM.

            I don’t know the event transformer too well, so I’m not sure if it can handle something like that.

            Edit- Another thing I thought of… if it is possible to merge…
            Is there a way to store how many events were merged? I’ll use the Dec 11 for the example again. If I can merge all 3 events into one, could I have it stored in a variable where I can display (3) at the end of the event to indicate there were 3 events?

            M 2 Replies Last reply Dec 9, 2024, 10:54 PM Reply Quote 0
            • M Offline
              MMRIZE @Ragged4310
              last edited by Dec 9, 2024, 10:54 PM

              @Ragged4310
              Now I c. I’ll try, wait a little.

              1 Reply Last reply Reply Quote 0
              • M Offline
                MMRIZE @Ragged4310
                last edited by MMRIZE Dec 9, 2024, 11:51 PM Dec 9, 2024, 11:49 PM

                @Ragged4310
                Instead of eventTransformer, we’ll use eventPayload because, this conversion should be applied to whole events, not a single event.

                Insert this property into your config section of CX3 in config/config.js

                /* `MMM-CalendarExt3` config section in config/config.js */
                eventPayload: (payload) => {
                	const fulldays = payload.filter(ev => ev.fullDayEvent === true)
                	const singleEvents = payload.filter(ev => ev.fullDayEvent === false).sort((a, b) => a.startDate - b.startDate || a.endDate - b.endDate)
                	const EventsArranged = singleEvents.reduce((acc, ev) => {
                		const dateObj = new Date(+ev.startDate)
                		const key = `${ev.title}-${new Date(dateObj).toLocaleDateString('en-CA')}`
                		if (!acc.has(key)) {
                			acc.set(key, [ev])
                		} else {
                			acc.get(key).push(ev)
                		}
                		return acc
                	}, new Map())
                	const collapsed = Array.from(EventsArranged.entries()).map(([ key, value ]) => {
                		const newEvent = { ...value[ 0 ] }
                		if (value.length > 1) {
                			newEvent.title = newEvent.title + ` <sub class="collapsed">${value.length}</sub>`
                			newEvent.endDate = Math.max(...value.map(ev => ev.endDate))
                			newEvent.startDate = Math.min(...value.map(ev => ev.startDate))
                		}
                		return newEvent
                	})
                	return [ ...fulldays, ...collapsed ]
                },
                

                And to beautify, add some CSS code into css/custom.css

                /* css/custom.css */
                .CX3 .title sub::after,
                #CX3_POPOVER .title sub::after {
                  content: "]";
                }
                
                .CX3 .title sub::before,
                #CX3_POPOVER .title sub::before {
                  content: "[";
                }
                

                It will work like;

                BEFORE
                eabb34b9-27cd-4132-8ac5-ddf356d95837-image.png

                e64973d9-6437-488b-9353-aa82156c9afc-image.png

                AFTER
                368277c0-828e-413f-9902-086f39c36429-image.png

                e56bb5b4-8e92-483e-9c02-a463c69f16ae-image.png


                • This code will not affect the fullday events.
                • Not considered every aspect, like inter-day events or untested errors.
                R 1 Reply Last reply Dec 11, 2024, 12:03 AM Reply Quote 0
                • R Offline
                  Ragged4310 @MMRIZE
                  last edited by Dec 11, 2024, 12:03 AM

                  @MMRIZE Thanks for the reply! I haven’t had too much time to play around with it just yet. Would I be completely replacing the event transformer with the payload, or would I be using both? If I’m using both, does the order matter?

                  I currently use the transformer to set the icons and transform the title. Does your code only account for stuff that has the same name? With my wife’s schedule, her bookings are all something like this:

                  Jane Doe: 60 - Deep Tissue Massage
                  Jane Doe: 60 - Reflexology
                  Break
                  Jane Doe: 30 - Reiki

                  etc., but I transform it to hide her client’s names on our calendar since it’s visible to whoever is in the house.

                          eventTransformer: (ev) => {
                              
                            const formatTime = (date) => new Intl.DateTimeFormat("en-US", {
                              hour: "numeric",
                              minute: "numeric",
                              hour12: true,
                            }).format(new Date(date));
                          
                            const startTime = formatTime(ev.startDate);
                            const endTime = formatTime(ev.endDate);
                          
                            if (!ev.originalTitle) {
                              ev.originalTitle = ev.title;
                            }
                          
                            const titleParts = ev.originalTitle.split(":");
                            const eventTitle = titleParts.length > 1 ? titleParts[1].trim() : ev.originalTitle;
                          
                            // Set default icon
                            ev.symbol = ["fluent:vehicle-car-profile-ltr-clock-16-filled"];
                          
                            // Check if the event is not an all-day event
                            if (!ev.isFullday) {
                              ev.title = `${startTime} ${eventTitle}`;
                            } else {
                              ev.title = eventTitle;
                            }
                          
                            // Rest of your existing conditions
                            if (ev.originalTitle.toLowerCase().includes('work')) {
                              ev.symbol = ["material-symbols:work-history-outline-sharp"];
                              ev.title = `${startTime} - ${endTime}`;
                            }
                          
                            if (ev.calendarName === "Family" && ev.originalTitle.toLowerCase().includes('windcreek')) {
                              ev.symbol = ["mdi:casino"];
                            }
                          
                            if (ev.calendarName === "Family" && ev.originalTitle.toLowerCase().includes('board')) {
                              ev.symbol = ["mdi:cards-playing-spade-multiple"];
                            }
                          
                            if (ev.calendarName === "Abigail") {
                              if (ev.originalTitle.match(/kung fu|tai chi/i)) {
                                ev.symbol = ["icon-park-solid:kungfu"];
                                ev.title = `${startTime} - ${endTime}`;
                              } else if (ev.originalTitle.match(/massage|reiki|trade|break|reflexology|deep|initial visit/i)) {
                                ev.symbol = ["tabler:massage"];
                                ev.title = `${startTime} - ${endTime}`;
                              }
                            } else if (ev.calendarName === "Sebastian") {
                              ev.title = `${startTime} - ${endTime}`;
                            } else if (ev.calendarName == "Birthday") {
                              ev.symbol = ["mingcute:cake-fill"];
                            } else if (ev.calendarName == "Appointment") {
                              ev.symbol = ["lsicon:work-order-appointment-outline"];
                            } else if (ev.calendarName == "Holiday") {
                              ev.symbol = ["openmoji:flag-us-outlying-islands"];
                            }
                          
                            return ev;
                          }
                  

                  Instead of checking the title directly, could I use some a contains check to see if it contains the character ‘:’ or ‘-’? I’ll be playing around with this tomorrow once I have some free time available.

                  M 1 Reply Last reply Dec 11, 2024, 11:40 AM Reply Quote 0
                  • G Offline
                    gonzonia @sdetweil
                    last edited by Dec 11, 2024, 12:40 AM

                    @sdetweil Just to close the loop on this. I updated MMM-Pir (there was another update soon after I posted) and switched to the updated MMM-Scenes2 and everything seems stable now.

                    S 1 Reply Last reply Dec 11, 2024, 1:07 AM Reply Quote 1
                    • S Offline
                      sdetweil @gonzonia
                      last edited by Dec 11, 2024, 1:07 AM

                      @gonzonia awesome

                      Sam

                      How to add modules

                      learning how to use browser developers window for css changes

                      1 Reply Last reply Reply Quote 0
                      • 1
                      • 2
                      • 56
                      • 57
                      • 58
                      • 59
                      • 60
                      • 66
                      • 67
                      • 58 / 67
                      58 / 67
                      • First post
                        578/666
                        Last post
                      Enjoying MagicMirror? Please consider a donation!
                      MagicMirror created by Michael Teeuw.
                      Forum managed by Sam, technical setup by Karsten.
                      This forum is using NodeBB as its core | Contributors
                      Contact | Privacy Policy