 Hi everyone, thanks for joining us in the interest of time. I think I'm going to go ahead and get started to try and leave as much time for Q&A at the end. So thanks very much for joining us in this talk about recurring dates and a smarter way to approach them in Drupal. So my name is Martin Anderson-Clitz on Drupal.org and various social platforms. I go by Manclu and I'm a Solutions Architect at Digital McKidna. So in addition to today's talk, we're also going to be doing a bit of a live demo. So starting with a fresh install of Drupal 9, which you can see here. Basically, stock did also install Olivero and the Jin admin theme. If you're not familiar with Jin, it's sort of an enhanced version of Claro. And so if you wanted to sort of follow along, this is a very basic way to install just Drupal 9. What we're going to be using looks like a little bit more like this in terms of the commands to install these. The notes are available in the chat. I'll also try and remember to post them again later and I've also posted them on Twitter. So lots of ways to get these if you decide you want to just use them later. And if you really want to geek out, you can chain these into one long command. And that's kind of what I've done for my install. So let's flip over to a console and we can see this is the result of that command. And now to install our system for handling recurring dates, we're going to go Composer, Fire, Drupal, Smart, Date, and we wanted to kick that off first because this is still using Composer 1. So it's going to take a few minutes. We're looking forward to when Composer 2 is fully ready. So with that, let's dive right in. We're meant to talk about recurring events and in particular some ways to manage them within Drupal. So definitely recurring events is a common use case. I would say that not all of the sites we built at Digital Kidna that have event management within them require recurring events. But it is pretty common in the calendar applications that your site editors and content authors are using on a daily basis. And so it's pretty common to get requests for this type of functionality. The interfaces will vary a little bit between, let's say, Google Calendar, your Apple Calendar, Microsoft Outlook, and various others. But when you think about it, particularly the recurring functionality has a lot in common. So this is pretty common, being able to have dates that occur sort of daily, weekly, monthly, or annually, being able to set which days it occurs on and to set some kind of an end, either based on the number of recurrences or on an end date. And worth mentioning that a lot of these applications actually use this R rule format as sort of a data interchange format. So either directly in terms of how they actually store those recurring dates, or in some cases they may use a more custom storage method, but use that as a way to sort of import or export. So if you get really deep into the weeds, it may benefit you at some point to understand R rule. We're going to cover it in not a lot of detail because this is a shorter session. But the key things that are going to be in your R rule typically are going to be, again, frequency, some kind of limit as an optional, again, either based on the number of recurrences or an end date, an interval. So whether it's every other week, every three weeks, every six months, those kinds of things. And then there are more complicated options to really give it some more robust functionality and map to real world ways that people want to have things recur that are more complicated. So here are a couple of examples of sort of what the R rule looks like, which is not super friendly, and then a more sort of human friendly way of representing that recurrence rule. Again, in the interest of time, I'm not going to dive too much into those in case you're wondering this table kind of is meant to frighten you because there is a lot of complexity. So when you start to layer on some of those additional options and understand that how they interact with your recurrence rule in terms of whether they restrict or expand the number of instances will actually change based on what the frequency is in terms of your recurrence rule. You start to get an appreciation of how complex this can start to be from a complexity standpoint, how deep the rabbit hole goes. And so you layer on all those complexities about the R rule. On top of that, you could layer on time zones, daylight savings times, leap years, exceptions and overrides. And then even on the output side, regional formatting in terms of differences between the way different languages prefer to represent at dates and times. You start to really understand there's a ton of complexity that you may start to run into. And so fortunately, there are a number of ways with the Drupal space that we can make managing these things much easier. And so the one that we're going to talk the most about today is Smart Date, but then later on we'll also talk about some other options. So Smart Date was a module that I started working on now about a year and a half ago, but the idea came to me actually years ago, I was working on an event-based website and populating some content and started to realize how incredibly tedious it was to populate this content. So you can see when you have sort of your standard date fields, you've got for each of the start and end seven different fields to populate. So year month day, hours, minutes, seconds and then AM or PM and then go through the same process to populate your end dates. And so that's a lot of entry for each and every date that you have to put in. And so I started to reflect on what is it that calendar applications do to make that process much easier and fundamentally there are two things that they do to make it much easier. So first off, they will default to the next hour. So you get sort of a more clean starting date. Typically, you're not going to schedule something for 9.07 AM, you're gonna schedule it for 10 AM or 11 AM. And so rounding that up to the next hour, definitely makes it easier. And then also they have this concept of duration. So typically it will default to a one hour duration, lots of them give you an option to change that default in terms of the duration. But really just by saying you wanna create an event, it populates a very clean set of fields and you may only need to change two or three to actually have the sort of event definition that you want. So those are a couple of the things that I started to realize, okay, if we could build those into Drupal, it would make the process much easier. And then a couple of other things that I'll point out in these interfaces is you can see another common thing is this all day checkbox. And we had done the gesture there. Been getting requests for clients to build those into their websites. In some cases in ways that were fairly custom and actually introduced a lot of complexity in terms of managing some of those events, even though from I'll say a user side, the idea was to make it simple. It actually made the site build a lot more complex. Again, repeating functionality as something that's in there and then also actually in the Google example, you'll notice that it has the capability to manage time zones. So really from an editor experience, wanted to try and draw on some of those ways that calendar apps make the date entry a lot simpler, including things like the all day checkbox and then also to try and provide more natural output for date ranges. So if somebody was to say, hey, what time is that recurring dates field or recurring dates in Drupal talk gonna be at bad camp? I wouldn't say, oh, it's gonna be Friday, October 16th from 9 a.m. to Friday, October 16th at 9.45 a.m. Obviously I would only say the date once and then give the time range. And so we had been similarly getting requests from clients to provide that same kind of deduplication in the output. Again, often using some custom methods that might involve, let's say, some logic built into the twig template, maybe also some logic in the preprocessor, but things that we're having to sort of build again and again. So I started to think, well, maybe these are pieces that should be built together to make it easier to manage dates in Drupal. And then the last piece was I was getting a site ready to launch, did a crawl to see if there were any slides or slow pages. And by far the slowest page, surprisingly was an events archive page that really had almost no data. And so when I looked at the query that views was building, I could see that there was a lot of complexity introduced by the fact that Drupal's core date time and date time range fields store dates and times as strings. And so to be able to do a comparison, so for example, to say show me only the events that happened in the past, it actually has to row by row convert those into a different format to be able to sort of make that logical comparison. So also wanted to do something that could address that kind of a performance issue. And so at that point I realized I needed to create a module that would address the user experience, the performance, and also the output format. And so the approach that I took in building the module was really as much as possible to leverage some of the excellent code and well-tested code that's already within Drupal. So there is a date range field in there that has an HTML5 date time picker with fallbacks. And then from the performance side, there is actually a lot of code already in Drupal core for using timestamps. So if you're looking at your node creation or update intervals or the last time your user was logged in, those are all stored as timestamps. And so there's a lot of code already within Drupal for managing timestamps and also converting from date time objects to timestamps or vice versa. And so by leveraging timestamps, I was able to address kind of the storage and performance side without really having to write a lot of custom code at all. And so that proved to be really effective. But definitely recurring dates was early on one of the things that was requested for smart date. And we'll talk more in depth later on about how the approach that smart day uses is maybe different from particularly some of the ones that came before. But for now we'll just say decided to attach the instances as the pieces that are sort of show up as kind of field alters attached directly to your node with the actual R rule storage being the piece that's extracted away, which meant that from an output standpoint, we didn't have to do a lot of extra custom things, but really just tried to provide some custom formatters to optimize the display of those recurring dates. So we'll get into a little bit more about this during the demo, but really to provide in a way that hopefully gives users the information in a way that that's most useful to them. And then sort of the last big piece that has been developed over time on smart date is really calendar integration. So as this was being discussed, it actually came from the community the suggestion that full calendar view was maybe the best supported calendar module in the sort of Drupal ecosystem. And so originally wrote the integration as a patch for full calendar view, but the maintainer of that module actually created kind of a plugin system so that other modules could do sort of data transformation before the data gets passed into the full calendar on the front end. And so now smart date and full calendar view work together seamlessly. And that includes drag and drop support, the ability to sort of double click to add events. And again, this is all things that we'll see in the demo, but important for this conversation is the fact that because of some of the pragmatic approaches that smart date tries to take for recurring events, the support for showing recurring events in the calendar works sort of seamlessly and out of the box. And then kind of the last piece that I wanna talk about in terms of the evolution of smart date is this idea of starter kits. So in a way similar to the idea of what a feature is, but maybe a bit different in approach, it's really just pre bundled set of configuration. The idea is that it can get you running quickly, but then you sort of build on and extending customized from there. It's not really something that you're meant to like install and then sort of install updates over time. It's really to get you started. And then that becomes either, you know, the thing that you use to test or something that you build on and customize and add complexity to sort of meet your individual use cases from there. So if you use the base smart date starter kit, it creates an event content type and a view to show upcoming and past events. And really not a lot else that, you know, the idea being that you add the complexity to meet your individual use case from there. There's also a calendar kit that on top of that adds a full calendar based view and really embeds a few ideas in terms of what I think are best practices, not only in terms of how users will see the data, but even in terms of creating a really solid admin experience. And we'll talk a little bit about that as we go on. But these are, as I said, my ideas in terms of what makes a good sort of visitor and admin experience, but if you have different ideas, definitely welcome to issue our feature requests or patches. So definitely go into the issue queue for the appropriate starter kit. So with that, let's go back to our command line. We can see that the modules have been installed. So let's go, actually before we do that, let me just show you this is our base install. Let's quickly log in so that I can show you sort of validate that this is really just has our default content types there. And the only differences really are the themes that we've installed. So now let's go and install again, ask us to confirm because there's a few modules there. Once that's done, if we homepage now looks the same, but now we can add an event. And so now what we're seeing is the smart data interface. So let's just give this test event. You can see that it has this duration idea. It has our all day checkbox. It does, it's rounded this up. So I'm in Eastern time, so it's 12, 17. It's defaulted to the next hour. If we do things like change the start date, it will automatically update the end appropriately. And then it preserves this idea of duration. So we can change the duration there. And then once again, if we change the start date, it will appropriately update the end to reflect the sort of selective duration. And you can also customize it. So we could say 30, 10, 30 and a lot of the update duration. So it gives you as the editor or content author a lot of flexibility. Let's go ahead and add a couple more instances just so that we can demonstrate some of the formatting options. Keyboard, there we go. 10, 16, let's go to 30 p.m. And then let's add some all day dates. So it's a calendar picker. And how quickly? It's probably enough for now. So let's dive in and see what the result is. So you can see right away that it's done what we talked about. So it only shows the date once if it started and ends on the same date. Obviously, if it crosses over into the next date then it repeats the date as needed. Same thing with a.m. and p.m. It tries to deduplicate those. And another thing you may notice is that it gives you the option to show a different format for times that fall directly on the hour. For all day events, you optionally can show sort of a label for that. And then it does some duplication, a deduplication for dates. But it's more complicated to do that when you actually include the day of the week. So let's go ahead and alter our event display settings. So, sort of show this in a way that's gonna reflect a little better. So we've got our smart date formatter. These, it ships with some different ones out of the box. It's smart date formats, but you can create your own. Let's switch it to this compact one. Save that. We refresh our events. You can see this one doesn't include any kind of an all day token. Again, the idea being to make it as compact as possible. And this one more clearly illustrates how the date ranges become a lot cleaner in terms of how they're presented. One thing, a bug that I noticed as part of preparing for this presentation is the compact one actually doesn't include a token for the time on the hour. So we can go ahead and show how we can update that. We'll say that these in upcoming version of smart date that will be fixed, but for today that's easy enough to fix ourselves and we'll show how that's done. So smart date formats are similar to core date formats in the sense that they're really based on PHP date strings, but a lot more granular. So in this case, we've got date and time optionally. You can have a time on the hour or something different. So we're gonna go ahead and just take out the minutes and other than that, we'll point out. Here's where you can have your all day label. You can customize the separator within the range as well as what's used to separate the date and time and which comes first. Worth noting that there are differences even in terms of what's preferred between languages. So some of the preferred, for example, German formatting is very different from English in terms of, I think it's quite typically date first, whereas in a number of particularly English language cultures it tends to be more date first or sorry, time first. And so you can also the deduplication, if it doesn't work well for you, you can turn that off. If you're using a custom time zone for an event, it will by default output the site time at the end in brackets or parentheses, but you can turn that off if that's also something you don't want. So let's go ahead and just say that one change to our smart date format. And now you can see that it has updated and it's giving us that cleaner output. And worth noting that the smart date formats, another advantage of using those is that they are more reusable. So between content types, between content types and views, they're exported as configs. So you could potentially even reuse them across sites if you wanted to do that kind of thing. And they're also translatable. So again, you can have a compact format that also adheres to sort of best practices in not only English, but also French and German and sort of customized for each of those sort of cultural norms. So let's quickly switch back. We've covered all of these. Let's talk about time zones. So in terms of the actual widget here, this is the standard one. I will mention passing that as a smart date three, you can actually use this widget with core date time range fields if you don't want to use the custom smart date storage and or potentially maybe you've got an existing site that already has a lot of content using core date time range fields and just want to use the widget. That's definitely possible as a smart date three. But let's go ahead and use the date time and range with time zone format for our new field. So I'll point out that by default, it will give you sort of your Drupal standard list of all of the time zones in the world. But there was a question raised actually at a similar talk or I guess more just generally specifically about smart date earlier this year where somebody asked if it was possible to customize the list of these time zones that are exposed. At the time, the answer was no, but it was actually not terribly hard to implement that. So as of more recent versions of smart date, you can go in, select a couple of these. Let's say we want to add say Denver and Chicago. So suppose our site only needs to support a small handful of time zones, then we can go in and now if we go into edit or event, you can see that we have our time zone field and it's a much simpler experience for our editors to go in and assign those time zones based on the ones that our site actually needs to manage as opposed to potentially much more difficult or complex to manage broader set. So all of that being said, again, we're here to talk more about recurring dates. About recurring dates. So let's go ahead and enable the smart date recurse sub module. That's enabled. And then we need to do then is updates our field because smart date doesn't assume that you want all fields to be recurring or enabled for recurring events. So it's really something you have to in your field to go in and enable. So we're gonna say we want to allow recurring events. It will add this months to ascends. So because the end is optional, I didn't want smart date if you said, I have an event that it's gonna happen every day. I didn't want it to go ahead and just start generating instances until the end of time or until your database blows up, but to be able to put some kind of an intelligent limit on that. So it defaults to 12 months. If you have something that's around planning events farther out that maybe only occur annually or monthly, then maybe you want to set this higher. If you have something that's primarily for daily events, you may want to set this shorter to again, keep the size of the data being generated smaller, but something you can easily customize. So let's go ahead and save that. And then now if we reload our interface, you can see now we have the ability to make these recurring. So you can say, you know, let's make it every other week on Monday and Thursday, or we could say I want to make it every two months on the third Thursday. All of those things that are, I would say notionally somewhat complex are very easy to sort of create and manage within the smart data interface. So let's actually keep our current event, but make a new one. So let's just say events, have it start on Monday, and let's have that set to be current weekly and after 10 occurrences having set that up. You can see it's generated our 10 instances and that works reasonably well if you've got a small number of instances, but if you have something that's going to be recurring, you know, every week for the next 12 months, that may get a bit unwieldy. And so actually let's go back to our display tab. Now, if we refresh, we can see that we actually have a couple of extra formatters. So there's one specifically for occurring as well as a daily range, which is similar to the one that we've just seen, which is the smart data formatter, but has a little bit of tuning in there. So if you have daily ranges, it will show those in a more compact way. Let's go ahead and use our occurring one. Look at the options that it gives us. So by default, it will allow you to show a specified number of recent and upcoming instances. So you could say, here are the next three times that's going to happen and need that at zero. If you don't want to show any in the past, you can also do things like say, let's show the next one as a more prominent field, which sort of makes sense because somebody coming to your website is probably most interested in which one is coming up next. So let's go ahead and update that and save it. If we refresh this, it actually adds classes around these. So you can theme these to be more prominent, but out of the box, it just keeps them separate. So we have our next occurrence and then it will show a number after that. We only had that set as two and it counts the next one as one of those. So we could do something like set this as four if we wanted to show the next as well as another three. So let's refresh another box and you can see that. All of this output is in a twig template. And so within your theme, you can easily customize these if you don't like the way it puts these into details element, you want to change the order, potentially any of those kinds of things. So it really gives you a lot of control in terms of how to customize those. And let's also talk about the calendar integration that we talked about. So you can see just having installed that starter kit, we have a working calendar. From an admin standpoint, you've got this link that it provides directly on the calendar to make it easy and intuitive in terms of how to add events. If I'm looking at a calendar, it makes sense to provide that option in context. And then I will say that for me, the calendar display is not necessarily always an efficient way to allow visitors to sort of browse and navigate content, particularly if you only had two or three a month, you would be able to communicate a lot more in the same real estate by showing more of, let's say a teaser based view where you could have an image, you could talk about location and provide other types of information. But particularly for content editors to be able to sort of visualize when content is happening and potentially be able to manage those, this becomes a really great tool. So I can do something like drag and drop. I have it configured to require a notification, but you can disable that if you don't feel like you need those. And then we can also go in and do things like reschedule within a date or potentially even change the duration. So all of that is very easy to do in a drag and drop way, super intuitive for your editors. And again, it really lines up with a lot of the calendar software that they're using already in other parts of their daily lives to manage this type of information. And we can also double click and you'll see that it has preserved not only the day, but the time at which we clicked and we'll say, create an event. We'll take that. It will take us back to our calendar. And if we go in there, we can see that it's saved that and it's now displaying where we would expect it in our calendar. Also wanted to show a couple of things that are newer in SmartDates. So let's go, Poser, Fire, Goal, and let's force it to use a newer version that is actually, good. So, one of the things, some feedback that I got from the communities that SmartDate could also be used more for things like appointment calendars, if it had recurring on more of an hourly or by minute basis. Once this gets installed, I'll be able to show you a little bit how that works. Again, I left it disabled by default and I'll show you the process of enabling the new options. Again, because I wanted to really preserve the out of the box behavior to be as close to some of the calendar applications as possible. So, let's give it a minute. Things are always slower while I'm streaming my video. Maybe this is a quick scan for questions. Let's see those. Worth pointing out that this version has a schema update. So you will see some errors that will make you unhappy if you don't run your database updates. So let's go ahead and say, yes, major. And now let's go back to our widget configuration and we'll see some new options in here. So, now you actually have the option to specify, excuse me, which frequency values you want to make available. So again, that was to make these available, but not enabled by default. But theoretically, if you had an event system that you wanted to build into a website and only allow sort of, let's say, weekly and monthly recurring values, you'd absolutely have the flexibility to do that. And then that becomes easier to manage from, let's say, a training and support standpoint. So let's go ahead and save those new options. And now let's go at an event. And we can see, have those new options. And we could say, I want this to recur every hour on Monday, Tuesday and Wednesday, but only from, let's say, 9am to noon. Or I could say, let's make it a 30 minute event. And if I switch to minutes by default, it recurs to the same value. I would say it's definitely an edge case where you literally want something to recur every minute. So by minutes, it defaults to your duration. And, but we could do something like say, we want to have a gap in between. So let's make it every 45 minutes. Let's end after the instances get an extra hour. So let's go ahead and save that. And you can't see it as well here. So let's go ahead and change our display back to the original formatter, just so that you can see the full list. And I guess validate that it's, what it's generated is more in line with what you expect. So 30 minute events every 45 minutes, but only within on the days and time ranges that we've specified. So hopefully that's clear. Starting to run a little low on time, but definitely wanted to talk about how smart date may be a bit different from some other modules that provide recurring functionality. So definitely if you were using recurring dates in Drupal 7, you would have been using the recurring dates fields, machine name is date recur. At its core, it's actually really just like a text area that exposes a place for an editor putting in our rule field, which is definitely not super intuitive, but there is a companion module that actually provides the sort of UI options that makes it friendly to use. So nice that it has different options, definitely something you may want to check out if there's something you see that you think smart date could benefit from. Again, definitely open to feature requests, patches and so on. One thing to note about our rule is because it started off as specifically in our rule field, what it's storing directly on the node is really the R rule and then uses a separate table for the instances which can make building your views more complicated. Having a mixture of let's say recurring and core events is definitely gonna be very complicated to set up. And also another pain point is calendars in terms of it has some integrations, a lot of them require patches or are modules that may not be as well maintained. So something to consider there. Definitely smart date we've already talked about, so I'll only cover quickly. Really sort of ease of use and ease of setup has been some of the primary concerns for smart dates. And then as we talked about, it really tries to store the instances as the piece that's directly on the node and then sort of the references out to the R rule instead and the calendar integration is really meant to be easy out of the box and also provides that extra functionality piece. There's also another promising module called recurring events. If you haven't seen it, the maintainer Owen Bush did a session about it in the Drupal GovCon camp recently. And so if this is something you're interested by all means check out his session because it provides a really nice overview of this module and the functionality that provides. A key thing that's really interesting about it is that it has a sub module for registration in a way it's really built as sort of an event and registration system. And so because of that it's not like the other modules in the sense of being a field that you would attach onto a node, it really uses its own custom entities. So that's definitely something to be aware of if you want to have let's say a view on your homepage that's recent content, then it's more complicated to use something like recurring events because it is those different entities. So you might have to create sort of like a different node type with an entity reference or anyway, as I say, it becomes more complicated. I would say it sounds like the UI is deliberately instilled. So I think he wanted to make it sort of a blank canvas. There has been some discussion that maybe at some point there'd be a way to integrate something like smart data at least at a widget level, but those discussions are still early on. Definitely one of the newer pieces in recurring events is this idea of consecutive recurring dates. I would say the by minute recurring to some degree is meant to have some degree of parallel to the same idea of recurring event dates. And recurring events also currently has no time zone handling, but if I recall correctly, that was a question that came up at the GovCon session. It sounds like he's open to implementing. So if this is a module you want to use and that's a feature you need, then I would encourage you to go in and put that in as a feature request against the module. Another newer module that is probably worth touching on is called Bookable Calendar. This one uses the smart data interface directly. In fact, it declares it as a requirement when you install it. Again, it's built for registration, also using custom entities and is definitely work in progress. Currently it only has a development release, but it's definitely under active development. So it's a great time if you like the approach and you think it's something you want to use potentially even contribute to. By all means, check out the module. There is a entity relationship diagram if I recall correctly on the project page to help you understand sort of the approach that's taking under the hood, but it would be great time if you're interested in this module to go in and file feature requests, potentially pitch in with some patches and those kinds of things. So realize I'm running a little on time, but I want to sort of graphically give you a sense of how these sort of three main modules at least compare in terms of their approach. So our current date field, as we mentioned, sort of directly stores the R rule against your node and then abstracts away the instances. And so that because of some of the complexity I could see, I tried to sort of go the reverse way with smart dates. So saving the instances directly against your node and then abstracting away the R rule. And that has definitely had some benefits in terms of things like calendar integration and recurring events because it's a custom entity types doesn't really directly attach to nodes at all, but you have that advantage of having the registration. And since registration is maybe a key concern in terms of which module you might want to use, I thought I should quickly touch on some different considerations in terms of deciding what's the best approach. So these are some of the questions that we'll go through in terms of our own internal decision-making at Digital Kidna. So first off, does it actually need to be registration within Drupal? So a lot of times we'll build an integration with something like Eventbrite that can handle your e-commerce directly as well, a variety of other things that may have social login and other things. So if that meets your use case, it may actually be more robust than something built in Drupal. For simple use cases, you could use Webform. Webform actually has a submodule called, I believe it's event registration demo that has some really good functionality. I think even notifications, there's not anything in there for enforcing like a number of seats available and then sort of counting that down. But if that's something you want to take on, by all means either submit that as a patch to Webform or as a new module and I would love to see that myself. For more complex use cases, you could look at something like recurring events that we talked about or take a look at bookable calendar. And then if you need something really super complex, there are more robust modules, bookable entities anywhere, event and registration or booking and availability management tools, which is a mouthful. I don't know why three letter acronyms are so popular in the space, but that seems to be a thing. So to wrap it up, SmartDate was really built to address the primary problems of sort of the editor experience, the speed and performance of your website and then the format to sort of help your visitors parse the information more easily, but along the way tried to build in a lot of things to make your job easier as a site builder. So managing recurring dates, interactive calendars and time zones really easily and out of the box as we've seen with the demo that we literally installed while we've been here. So I think we're pretty close to time. Wanted to end by saying, there's some great sessions coming up in the next time slot. And if there are questions, by all means would be happy to try and answer those now. Okay, I've been taking notes of the questions. Shall I just start reading them out? Yeah, absolutely. All right, let's see. Rick Fine asked, any support for recurring events that aren't on a pattern are like where the dates are random? And I know you demoed that a bit. Sure. So there's a couple of things. Let me say for, if there, I guess you could say if they're recurring, but not on a pattern, then in a way they're really just multi-valued. So let's go and create an event. So you could just say, let's make this an all day event and then you could make another one. That is, at some point in the future. So let's say sometime in November, but a complete update. And you could just sort of create different ones. If there isn't a pattern, then I don't know how to, how you translate that into logic, but you could by all means just add, extra sort of field out this to represent what those are in sort of a non-pattern way. Hopefully that makes sense. Cool, cool. Looks like he feels you answered it. So brilliant. Dan Kohler asks, is SmartDate available for Drupal 7? SmartDate is not available for Drupal 7. I will say that, and this is maybe a bit of a tangent, there was an issue someone started about doing the migration. So there's code in there. If you're migrating from Drupal 7 to Drupal 8 to help migrate from let's say the Drupal 7 date field into SmartDate and Drupal 8, I believe there's a duration field module that may work for Drupal 7, but no, from day one, SmartDate has been sort of Drupal 8 and newer and it is ready for Drupal 9, I'll say. Okay, next question. Lindsay McLennan asks, is SmartDate compatible with the calendar module? So a calendar module, it's the last time I checked, I think there are at least three different calendar modules in Drupal 8. The calendar module, I think when I was working on the calendar integration had not been updated in a while and the suggestion from the community was that full calendar view was really the best one to go with and so that's really where I focused my effort. So if you look at full calendar view, this is the module that has the plugin system that really allows SmartDate to work with it out of the box without it using any kind of a patch. I think there's at least one other module that uses the full calendar JavaScript library and I believe the calendar module uses its own sort of more custom piece, but the calendar integration that we looked at is really using this module as opposed to the calendar project. Marietta, Shawn DeArmond asks, how does it store recurring events in the database using the core date range field? So I can repeat that. How does it store recurring events in the database using the core date range field? Gotcha. Okay, so the simple answer is that it doesn't. So certain parts of SmartDate only work with sort of the actual SmartDate field. So the time zones, the current events, definitely those pieces are only available if you're actually using a SmartDate field. It's really only the widget. So that's sort of initial view that we saw. This part here is really what you get in terms of using it with core date time range fields. And then as well, you can use the SmartDate formatter and SmartDate formats to do the deduplication in kind of natural language output. But there definitely is a trade-off there of by going to a SmartDate field, you get the extra functionality. Let's see. Benji Fisher had a question about changing the time zone. Benji, do you feel that question already got answered? I think that got addressed later. Okay, cool. Chris Brown asks, is there any ability to throw in exceptions in date spans for holidays or facility close days? He says he works at a museum for context. Yes, for sure there is. So let's go back to our calendar. So let's just open our recurring event here. In addition to managing them sort of within the calendar where it's easy to reschedule them, there's also this managing instances interface where you can do the same kinds of things in terms of saying, for this particular one, I want to change the start or the duration, maybe this particular one for whatever reason is all day. But you could also do things like say, let's just cancel this one outright. And then it'll show in the list because it's technically part of the rule, but it shows as with the strike-through and then the ones that you've overridden are there sort of italicized. So that at a glance, you get a quick sense of all of the actual instances that are part of that recurrence rule. But what alterations that you've made? So I don't know if I can go and save that now. Sort of to try to remember where it was in the pattern that we took one out. I think it was every kind of in there. So hopefully that's clear. Let's see, Alyssa Hansen asks, are you also able to remove the two date in the form but leave the two time if you only allow events that start and end on the same date? That is an interesting use case. So the idea being to almost make that not available and then only have the front and two on the time. I would say that's currently not possible, but it's definitely something that I could try and put my head around how we could make that work, maybe show them in line or something like that. Sounds like maybe it would be a slightly different widget, but if that's something you think you need or have some ideas around how that should work, well, it means go to the smart date issue queue and follow that as a feature request. Definitely something that I would consider for sure. Julie Fox asks, can you add a smart date to a group as opposed to a content type? Add it to what was the word? Group? G-R-O-U-P. Oh, to a group. Yeah, so it doesn't have to be notes. Definitely I know I've tested smart date with taxonomy terms. I know there are a number of people who have used smart date fields on custom entities, excuse me, including the bookable calendar. So some of the more recent updates were to make smart date work better with different kinds of entities. So as long as your entity is fieldable, then it's definitely easy to, should be easy to use smart date with that. The Sean DeArmond asks, does recurring work on core date range fields? Currently it does not. Lindsay MacLennan asks, is the monthly calendar view responsive? Let's see, monthly calendar view responsive. Let's see. Counter. I feel like when I tested this before, it's sort of, I mean, it's not terrible in the sense that it, you know, it kind of gives you the display. But again, for, particularly for things like responsive considerations, even from accessibility standpoints, this kind of a calendar view is really not your best bet in terms of people consuming the information. But to me, this is really an awesome tool for more sort of on the administrative side to be able to sort of visualize your content and manage it. Let's see, Kyle Koch asks, if smart date is just a starting point out of the box and you build it out to a more full featured customized app, does this mean you cannot easily apply patches or updates after you've built out your calendars? So I guess the thing to clarify there is that the bits that are the starting point are really the starter kits. So the, you know, this content type that gets generated or the views around it in terms of, you know, being able to display data or so on. Those don't tend to get a lot of changes. So yes, for those configuration pieces, you wouldn't really be able to sort of patch them or what have you on an ongoing basis, but definitely smart date itself as sort of, you know, the field based on plugins and all those kinds of things is definitely something that you can patch and upgrade over time. Which in fact, we actually did as part of the demo when we went from the 3.0 version to 3.0 one version and then got those additional features. Let's see, Robert Yarmond asks, is it possible to add fields to each recurring date for instance, a separate link for each date? So currently it is not possible. I've been trying to sort of think about if there's a way that you could associate like a fieldable entity with each instance. And so that may be something in a future version of smart date that would allow you to do those kinds of things because I definitely feel like there is a use case for that. So I guess the honest answer for that is not yet, but stay tuned. Okay, let's see. Benji Fisher's got a couple of questions. First is, how about import and export such as to Google Calendar or iCal? So the sort of iCal integration, I would, in all honesty is not necessarily something that I've worked on yet, but definitely should be possible. Again, because the classes already exist sort of in core to take time stamps and turn them into like a daytime object. And I expect that any modules that currently provide that kind of export to Google Calendar type of functionality would probably be looking for that Drupal daytime object. So if there's a case where you need that, I would say open a feature request and that's definitely something we could take a look at. There was some work done, I wanna say a couple of months ago around having it work with some of the modules that do like serialization of data. So if you had a solution where you were moving content between environments by getting it serialized, that should work. Okay. Benji also asks, if you add a recurring date, it makes multiple field instances or deltas. What happens if you then edit the recurrence rule? So if you, let's say, you build out your set of, sorry, let me start out. You create your recurring date. Let's say it starts on a Monday and you have it recurred for five times and then you come back later and you change it to start on a Wednesday. It would effectively resave all of those occurrences that come after. So it would shift them to Wednesdays individually in terms of how they're saved in the database. All right, it looks like we're on our last one. Dan Wilga asks, is it possible to enter times without dates? We would use this for creating a class schedule view where the schedule repeats every week infinitely and clarification, can you like to enter a day of the week or time without specifying an actual calendar date? So currently that type of functionality isn't supported. Trying to remember, I think there's been discussion about that in the issue you could search through there. I think there are Drupal modules that are intended to manage sort of times without dates, but I feel like that's maybe doesn't marry up super well to the things that smart data is intended to do. So there's probably other modules that are better suited for that type of use case. All right, look at that. We have two whole minutes to spare. All right, well, if there aren't any other questions, then I wanted to thank everybody for attending the session. And as I say, if there are ways that you'd like smart data to better suit what you're trying to do, then by all means, we'd love to hear from you in the issue queue. All right, this has been awesome. I'm so glad I wanted to do this one. So, everyone.