diff --git a/packages/app/src/pages/calendar/calendar.fullcalendar.tsx b/packages/app/src/pages/calendar/calendar.fullcalendar.tsx index 0de2a5a7..f1df1840 100644 --- a/packages/app/src/pages/calendar/calendar.fullcalendar.tsx +++ b/packages/app/src/pages/calendar/calendar.fullcalendar.tsx @@ -46,7 +46,7 @@ import { PopoverViewEvent } from "./popovers/view-event/view-event"; export const CalendarFullcalendar: FC = () => { const { hidePopover, showPopover } = usePopover(); const { view, setView, isReady } = useViewSettings(); - const { currentDay, language, formats, weekStartDay, overlapThresholdString } = useConfig(); + const { currentDay, language, formats, weekStartDay, overlapThresholdString, canEditEvents, isDragAndDropEnabled } = useConfig(); const calendar = useRef(null); const [draft, setDraft] = useState(null); @@ -275,6 +275,7 @@ export const CalendarFullcalendar: FC = () => { nextDayThreshold={overlapThresholdString} fixedWeekCount dayMaxEventRows + editable={canEditEvents && isDragAndDropEnabled} selectable selectMirror={false} selectMinDistance={5} diff --git a/packages/app/src/types/config.ts b/packages/app/src/types/config.ts index 13ae673d..15c82bbe 100644 --- a/packages/app/src/types/config.ts +++ b/packages/app/src/types/config.ts @@ -24,6 +24,7 @@ export type CalendarConfig = { currentSiteId: number; currentDay: Date; siteMap: SiteMap; + isDragAndDropEnabled: boolean; isQuickCreateEnabled: boolean; isMultiSite: boolean; canEditEvents: boolean; diff --git a/packages/plugin/src/Controllers/AppController.php b/packages/plugin/src/Controllers/AppController.php index c5e718cd..47313468 100644 --- a/packages/plugin/src/Controllers/AppController.php +++ b/packages/plugin/src/Controllers/AppController.php @@ -63,6 +63,7 @@ public function actionIndex(?string $year = null, ?string $month = null, ?string 'canEditEvents' => $user && $user->can('calendar-manageEvents') && !empty($calendarOptions), 'isMultiSite' => \Craft::$app->getIsMultiSite(), 'isQuickCreateEnabled' => $this->getSettingsService()->isQuickCreateEnabled(), + 'isDragAndDropEnabled' => $this->getSettingsService()->isDragAndDropEnabled(), 'weekStartDay' => $this->getSettingsService()->getFirstDayOfWeek(), 'overlapThreshold' => $this->getSettingsService()->getOverlapThreshold(), ]; diff --git a/packages/plugin/src/Elements/Db/EventQuery.php b/packages/plugin/src/Elements/Db/EventQuery.php index 2e563797..970d0837 100644 --- a/packages/plugin/src/Elements/Db/EventQuery.php +++ b/packages/plugin/src/Elements/Db/EventQuery.php @@ -327,15 +327,16 @@ public function setOverlapThreshold(?int $overlapThreshold = null): self protected function beforePrepare(): bool { - $events = Event::TABLE; + $eventsTable = Event::TABLE; + $eventsAlias = 'calendar_events'; // $occurrences = OccurrenceRecord::TABLE; $calendar = CalendarRecord::TABLE; $users = Table::USERS; - $this->joinElementTable($events); + $this->joinElementTable($eventsTable); if (!$this->joinedTables) { - $this->join('INNER JOIN', $calendar, "{$calendar}.[[id]] = {$events}.[[calendarId]]"); - $this->join('LEFT JOIN', $users, "{$users}.[[id]] = {$events}.[[authorId]]"); + $this->join('INNER JOIN', $calendar, "{$calendar}.[[id]] = [[{$eventsAlias}.calendarId]]"); + $this->join('LEFT JOIN', $users, "{$users}.[[id]] = [[{$eventsAlias}.authorId]]"); $this->joinedTables = true; } @@ -345,25 +346,25 @@ protected function beforePrepare(): bool // $occExists = (new Query()) // ->select(new Expression('1')) // ->from(["occ" => $occurrences]) - // ->where("[[occ.eventId]] = {$events}.[[id]]") + // ->where("[[occ.eventId]] = [[{$eventsAlias}.id]]") // ; // // $this->subQuery->andWhere(['exists', $occExists]); $this->query->select([ - $events.'.[[calendarId]]', - $events.'.[[authorId]]', - $events.'.[[startDate]]', - $events.'.[[endDate]]', - $events.'.[[until]]', - $events.'.[[timezone]]', - $events.'.[[allDay]]', - $events.'.[[rrule]]', - $events.'.[[repeatType]]', - $events.'.[[repeatEndType]]', - $events.'.[[postDate]]', - $events.'.[[dateCreated]]', - $events.'.[[dateUpdated]]', + "[[{$eventsAlias}.calendarId]]", + "[[{$eventsAlias}.authorId]]", + "[[{$eventsAlias}.startDate]]", + "[[{$eventsAlias}.endDate]]", + "[[{$eventsAlias}.until]]", + "[[{$eventsAlias}.timezone]]", + "[[{$eventsAlias}.allDay]]", + "[[{$eventsAlias}.rrule]]", + "[[{$eventsAlias}.repeatType]]", + "[[{$eventsAlias}.repeatEndType]]", + "[[{$eventsAlias}.postDate]]", + "[[{$eventsAlias}.dateCreated]]", + "[[{$eventsAlias}.dateUpdated]]", $users.'.[[username]]', $calendar.'.[[name]]', ]); @@ -377,7 +378,7 @@ protected function beforePrepare(): bool } if (!$isWildcard) { - $this->subQuery->andWhere(Db::parseParam($events.'.[[calendarId]]', $this->calendarId)); + $this->subQuery->andWhere(Db::parseParam("[[{$eventsAlias}.calendarId]]", $this->calendarId)); } } @@ -390,14 +391,14 @@ protected function beforePrepare(): bool } if ($this->authorId) { - $this->subQuery->andWhere(Db::parseParam($events.'.[[authorId]]', $this->authorId)); + $this->subQuery->andWhere(Db::parseParam("[[{$eventsAlias}.authorId]]", $this->authorId)); } if ($this->dateCreated) { $value = $this->dateCreated; $this->subQuery->andWhere( Db::parseParam( - $events.'.[[dateCreated]]', + "[[{$eventsAlias}.dateCreated]]", \is_array($value) ? $value : $this->extractDateAsFormattedString($value) ) ); @@ -407,7 +408,7 @@ protected function beforePrepare(): bool $value = $this->dateUpdated; $this->subQuery->andWhere( Db::parseParam( - $events.'.[[dateUpdated]]', + "[[{$eventsAlias}.dateUpdated]]", \is_array($value) ? $value : $this->extractDateAsFormattedString($value) ) ); @@ -417,7 +418,7 @@ protected function beforePrepare(): bool $value = $this->postDate; $this->subQuery->andWhere( Db::parseParam( - $events.'.[[postDate]]', + "[[{$eventsAlias}.postDate]]", \is_array($value) ? $value : $this->extractDateAsFormattedString($value) ) ); @@ -426,7 +427,7 @@ protected function beforePrepare(): bool if ($this->startDate) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[startDate]]', + "[[{$eventsAlias}.startDate]]", $this->extractDateAsFormattedString($this->startDate) ) ); @@ -435,7 +436,7 @@ protected function beforePrepare(): bool if ($this->startsBefore) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[startDate]]', + "[[{$eventsAlias}.startDate]]", $this->extractDateAsFormattedString($this->startsBefore), '<' ) @@ -445,7 +446,7 @@ protected function beforePrepare(): bool if ($this->startsBeforeOrAt) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[startDate]]', + "[[{$eventsAlias}.startDate]]", $this->extractDateAsFormattedString($this->startsBeforeOrAt), '<=' ) @@ -455,7 +456,7 @@ protected function beforePrepare(): bool if ($this->startsAfter) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[startDate]]', + "[[{$eventsAlias}.startDate]]", $this->extractDateAsFormattedString($this->startsAfter), '>' ) @@ -465,7 +466,7 @@ protected function beforePrepare(): bool if ($this->startsAfterOrAt) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[startDate]]', + "[[{$eventsAlias}.startDate]]", $this->extractDateAsFormattedString($this->startsAfterOrAt), '>=' ) @@ -475,7 +476,7 @@ protected function beforePrepare(): bool if ($this->endsAfter) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[endDate]]', + "[[{$eventsAlias}.endDate]]", $this->extractDateAsFormattedString($this->endsAfter), '>' ) @@ -485,7 +486,7 @@ protected function beforePrepare(): bool if ($this->endsAfterOrAt) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[endDate]]', + "[[{$eventsAlias}.endDate]]", $this->extractDateAsFormattedString($this->endsAfterOrAt), '>=' ) @@ -495,7 +496,7 @@ protected function beforePrepare(): bool if ($this->endsBefore) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[endDate]]', + "[[{$eventsAlias}.endDate]]", $this->extractDateAsFormattedString($this->endsBefore), '<' ) @@ -505,7 +506,7 @@ protected function beforePrepare(): bool if ($this->endsBeforeOrAt) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[endDate]]', + "[[{$eventsAlias}.endDate]]", $this->extractDateAsFormattedString($this->endsBeforeOrAt), '<=' ) @@ -515,27 +516,27 @@ protected function beforePrepare(): bool if ($this->endDate) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[endDate]]', + "[[{$eventsAlias}.endDate]]", $this->extractDateAsFormattedString($this->endDate) ) ); } if ($this->allDay) { - $this->subQuery->andWhere(Db::parseParam($events.'.[[allDay]]', $this->allDay)); + $this->subQuery->andWhere(Db::parseParam("[[{$eventsAlias}.allDay]]", $this->allDay)); } if ($this->until) { $this->subQuery->andWhere( Db::parseParam( - $events.'.[[until]]', + "[[{$eventsAlias}.until]]", $this->extractDateAsFormattedString($this->until) ) ); } if ($this->timezone) { - $this->subQuery->andWhere(Db::parseParam($events.'.[[timezone]]', $this->timezone)); + $this->subQuery->andWhere(Db::parseParam("[[{$eventsAlias}.timezone]]", $this->timezone)); } if ($this->allowedCalendarsOnly) { @@ -548,7 +549,7 @@ protected function beforePrepare(): bool } if (!PermissionHelper::isAdmin() && Calendar::getInstance()->settings->isAuthoredEventEditOnly()) { - $this->subQuery->andWhere($events.'.[[authorId]]', \Craft::$app->user->id); + $this->subQuery->andWhere(["[[{$eventsAlias}.authorId]]" => \Craft::$app->user->id]); } } diff --git a/packages/plugin/src/Elements/Event.php b/packages/plugin/src/Elements/Event.php index 2e7a837e..8a084ff9 100644 --- a/packages/plugin/src/Elements/Event.php +++ b/packages/plugin/src/Elements/Event.php @@ -738,7 +738,9 @@ public function jsonSerialize(): array 'handle' => $this->getSite()->handle, 'language' => $this->getSite()->language, ], - 'editable' => $this->isEditable(), + 'canEdit' => $this->isEditable(), + 'startEditable' => $this->isEditable() && Calendar::getInstance()->settings->isDragAndDropEnabled(), + 'durationEditable' => $this->isEditable() && Calendar::getInstance()->settings->isDragAndDropEnabled(), 'enabled' => (bool) $this->enabled, 'backgroundColor' => $this->getCalendar()->color, 'borderColor' => $this->getCalendar()->getDarkerColor(), diff --git a/packages/plugin/src/Models/SettingsModel.php b/packages/plugin/src/Models/SettingsModel.php index 5513d7e2..caab61e9 100644 --- a/packages/plugin/src/Models/SettingsModel.php +++ b/packages/plugin/src/Models/SettingsModel.php @@ -14,6 +14,7 @@ class SettingsModel extends Model public const DEFAULT_SHOW_MINI_CAL = true; public const DEFAULT_SHOW_DISABLED_EVENTS = true; public const DEFAULT_VIEW = Calendar::VIEW_DASHBOARD; + public const DEFAULT_IS_DRAG_AND_DROP_ENABLED = true; public const DEFAULT_ALLOW_QUICK_CREATE = true; public const DEFAULT_AUTHORED_EVENT_EDIT_ONLY = false; public const DEFAULT_FIRST_DAY_OF_WEEK = -1; @@ -37,6 +38,7 @@ class SettingsModel extends Model public array|bool|null $showDisabledEvents = null; public array|bool|null $quickCreateEnabled = null; + public null|array|bool $isDragAndDropEnabled = null; public ?string $defaultView = null; @@ -93,6 +95,7 @@ public function __construct(array $attributes = []) $this->defaultView = self::DEFAULT_VIEW; $this->guestAccess = null; $this->quickCreateEnabled = self::DEFAULT_ALLOW_QUICK_CREATE; + $this->isDragAndDropEnabled = self::DEFAULT_IS_DRAG_AND_DROP_ENABLED; $this->showDisabledEvents = self::DEFAULT_SHOW_DISABLED_EVENTS; $this->authoredEventEditOnly = self::DEFAULT_AUTHORED_EVENT_EDIT_ONLY; $this->firstDayOfWeek = self::DEFAULT_FIRST_DAY_OF_WEEK; diff --git a/packages/plugin/src/Resources/Bundles/EventEditBundle.php b/packages/plugin/src/Resources/Bundles/EventEditBundle.php index 84e0419f..5eb3d989 100644 --- a/packages/plugin/src/Resources/Bundles/EventEditBundle.php +++ b/packages/plugin/src/Resources/Bundles/EventEditBundle.php @@ -14,8 +14,8 @@ public function getScripts(): array } return [ - 'js/event-builder/vendor.js', - 'js/event-builder/event-builder.js', + 'js/app/vendor.js', + 'js/app/event-builder.js', ]; } } diff --git a/packages/plugin/src/Resources/css/code-packs/code-pack.css b/packages/plugin/src/Resources/css/code-packs/code-pack.css index f9796399..1ed29177 100644 --- a/packages/plugin/src/Resources/css/code-packs/code-pack.css +++ b/packages/plugin/src/Resources/css/code-packs/code-pack.css @@ -1,11 +1,11 @@ +#components-wrapper { + margin: 25px -10px 0; +} #components-wrapper:after { content: ""; display: table; clear: both; } -#components-wrapper { - margin: 25px -10px 0; -} #components-wrapper > div { position: relative; box-sizing: border-box; diff --git a/packages/plugin/src/Resources/css/resources/cards.css b/packages/plugin/src/Resources/css/resources/cards.css index cbe27fad..fc4bfffc 100644 --- a/packages/plugin/src/Resources/css/resources/cards.css +++ b/packages/plugin/src/Resources/css/resources/cards.css @@ -3,15 +3,13 @@ ul.cards { grid-template-columns: auto auto auto; column-gap: 20px; row-gap: 20px; + margin-top: 40px; } @media (min-width: 1550px) { ul.cards { grid-template-columns: repeat(4, 1fr); } } -ul.cards { - margin-top: 40px; -} ul.cards:focus { outline: none; } diff --git a/packages/plugin/src/Resources/css/resources/resources.css b/packages/plugin/src/Resources/css/resources/resources.css index f2b9dddc..a6b7b4a2 100644 --- a/packages/plugin/src/Resources/css/resources/resources.css +++ b/packages/plugin/src/Resources/css/resources/resources.css @@ -3,15 +3,13 @@ ul.cards { grid-template-columns: auto auto auto; column-gap: 20px; row-gap: 20px; + margin-top: 40px; } @media (min-width: 1550px) { ul.cards { grid-template-columns: repeat(4, 1fr); } } -ul.cards { - margin-top: 40px; -} ul.cards:focus { outline: none; } diff --git a/packages/plugin/src/Resources/css/widgets/month.css b/packages/plugin/src/Resources/css/widgets/month.css index c36ebe6d..c06c3d28 100644 --- a/packages/plugin/src/Resources/css/widgets/month.css +++ b/packages/plugin/src/Resources/css/widgets/month.css @@ -65,7 +65,7 @@ border-radius: 1px; } .calendar-mini-cal .fc-content-skeleton td:hover { - background-color: rgb(95.2648221344, 100.9644268775, 110.7351778656); + background-color: #5f656f; color: #fff; } .calendar-mini-cal .fc-content-skeleton td.fc-today { @@ -73,7 +73,7 @@ background-color: #e5422b; } .calendar-mini-cal .fc-content-skeleton td.fc-today:hover { - background-color: rgb(196.8571428571, 45.5, 24.1428571429); + background-color: #c52e18; color: #ffffff; } .calendar-mini-cal .fc-content-skeleton td:hover { diff --git a/packages/plugin/src/Resources/js/app/app.js b/packages/plugin/src/Resources/js/app/app.js index 13cfed12..57c1dc44 100644 --- a/packages/plugin/src/Resources/js/app/app.js +++ b/packages/plugin/src/Resources/js/app/app.js @@ -1 +1 @@ -!function(){var n,e,t,r={3574:function(n){function e(n){var e=new Error("Cannot find module '"+n+"'");throw e.code="MODULE_NOT_FOUND",e}e.keys=function(){return[]},e.resolve=e,e.id=3574,n.exports=e},8509:function(n,e,t){var r,o,i,a,c,l,s,d,u,f=t(1085),p=t(4637),h=t(2225),v=t.n(h),g=window.location.href.replace(/(.*\/calendar).*/i,"$1"),b=function(n,e){void 0===e&&(e=!0),n=(n=(null!=n?n:"").replace(/\/+/g,"/").replace(/^\/(.*)/,"$1").replace(/\/$/,"")).length?"/".concat(n):"";var t=v()("".concat(g).concat(n));return e?t.href:t.pathname},y=t(5873),x=t(4041),m=function(){return m=Object.assign||function(n){for(var e,t=1,r=arguments.length;t=o&&a>=o&&i+e.height<=r-o&&a+e.width<=t-o}(n,t,r,o,i.padding)});return c||function(n,e,t,r,o){var i=r-o-e.height,a=t-o-e.width;return m(m({},n),{top:k(n.top,o,i),left:k(n.left,o,a)})}(a[0],t,r,o,i.padding)}({anchorRect:e,popoverRect:t,viewportWidth:n.viewportWidth,viewportHeight:n.viewportHeight,options:n.options});return{top:o.top,left:o.left,position:o.position,arrow:j({placement:o,anchorRect:e,popoverRect:t,arrowPadding:r})}}({anchorRect:i,popoverRect:l,viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,options:c,arrowPadding:14});a(M(M({},d),{top:d.top-s.top,left:d.left-s.left}))}}else a(void 0)},[e,c,t,r]);return(0,x.useLayoutEffect)(function(){l()},[l]),(0,x.useEffect)(function(){if(e){var n=function(){return l()};return window.addEventListener("resize",n),window.addEventListener("scroll",n,!0),function(){window.removeEventListener("resize",n),window.removeEventListener("scroll",n,!0)}}},[e,l]),i},N=t(7065),O=function(n,e){return Object.defineProperty?Object.defineProperty(n,"raw",{value:e}):n.raw=e,n},A=N.Ay.div(r||(r=O(["\n position: relative;\n"],["\n position: relative;\n"]))),E=N.Ay.div(o||(o=O(["\n position: absolute;\n top: 0;\n left: 0;\n z-index: 10;\n\n border: 1px solid var(--border-hairline-dark);\n border-radius: 5px;\n background-color: white;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.1);\n"],["\n position: absolute;\n top: 0;\n left: 0;\n z-index: 10;\n\n border: 1px solid var(--border-hairline-dark);\n border-radius: 5px;\n background-color: white;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.1);\n"]))),T=N.Ay.span(i||(i=O(["\n position: absolute;\n width: 0;\n height: 0;\n pointer-events: none;\n z-index: 12;\n\n ","\n"],["\n position: absolute;\n width: 0;\n height: 0;\n pointer-events: none;\n z-index: 12;\n\n ","\n"])),function(n){var e=n.left,t=n.top;switch(n.side){case"top":return"\n top: -9px;\n left: ".concat(null!=e?e:0,'px;\n transform: translateX(-50%);\n\n &::before,\n &::after {\n content: "";\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n }\n\n &::before {\n border-left: 9px solid transparent;\n border-right: 9px solid transparent;\n border-bottom: 9px solid var(--border-hairline-dark);\n }\n\n &::after {\n top: 1px;\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-bottom: 8px solid white;\n }\n ');case"bottom":return"\n bottom: -1px;\n left: ".concat(null!=e?e:0,'px;\n transform: translateX(-50%);\n\n &::before,\n &::after {\n content: "";\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n }\n\n &::before {\n border-left: 9px solid transparent;\n border-right: 9px solid transparent;\n border-top: 9px solid var(--border-hairline-dark);\n }\n\n &::after {\n top: -1px;\n border-left: 8px solid transparent;\n border-right: 8px solid transparent;\n border-top: 8px solid white;\n }\n ');case"left":return"\n left: -9px;\n top: ".concat(null!=t?t:0,'px;\n transform: translateY(-50%);\n\n &::before,\n &::after {\n content: "";\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n }\n\n &::before {\n border-top: 9px solid transparent;\n border-bottom: 9px solid transparent;\n border-right: 9px solid var(--border-hairline-dark);\n }\n\n &::after {\n left: 1px;\n border-top: 8px solid transparent;\n border-bottom: 8px solid transparent;\n border-right: 8px solid white;\n }\n ');default:return"\n right: -1px;\n top: ".concat(null!=t?t:0,'px;\n transform: translateY(-50%);\n\n &::before,\n &::after {\n content: "";\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n }\n\n &::before {\n border-top: 9px solid transparent;\n border-bottom: 9px solid transparent;\n border-left: 9px solid var(--border-hairline-dark);\n }\n\n &::after {\n left: -1px;\n border-top: 8px solid transparent;\n border-bottom: 8px solid transparent;\n border-left: 8px solid white;\n }\n ')}}),I=(0,x.createContext)(null),S=function(){var n=(0,x.useContext)(I);if(!n)throw new Error("usePopover must be used within a PopoverProvider");return n},P=function(n){var e,t,r=n.children,o=(0,x.useState)(),i=o[0],a=o[1],c=(0,x.useRef)(null),l=(0,x.useRef)(null),s=(0,x.useCallback)(function(n,e,t){a({content:n,anchor:e,options:t})},[]),d=(0,x.useCallback)(function(){return a(void 0)},[]),u=C({state:i,bridgeRef:c,popoverRef:l}),p=(null==i?void 0:i.content)&&(0,f.jsxs)(E,{ref:l,style:{top:null!==(e=null==u?void 0:u.top)&&void 0!==e?e:0,left:null!==(t=null==u?void 0:u.left)&&void 0!==t?t:0,visibility:u?"visible":"hidden"},children:[u&&(0,f.jsx)(T,{side:u.arrow.side,top:u.arrow.top,left:u.arrow.left}),i.content]});return(0,f.jsx)(I.Provider,{value:{showPopover:s,hidePopover:d},children:(0,f.jsxs)(A,{ref:c,children:[p,r]})})},z=t(7916),L=t(482),R=t(6158),U=t(4081),Y=/^(\d{4})-(\d{2})-(\d{2})$/,Q=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2})(\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})?$/,_=function(n){return"string"==typeof n?new Date(n):n},B=function(n){if("string"==typeof n){var e=n.match(Y);if(e){var t=e[1],r=e[2],o=e[3];return new Date(Date.UTC(Number(t),Number(r)-1,Number(o),0,0,0,0))}var i=n.match(Q);if(i){t=i[1],r=i[2],o=i[3];var a=i[4],c=i[5],l=i[6],s=void 0===l?"0":l,d=i[7],u=void 0===d?"":d,f=u?Number(u.slice(1).padEnd(3,"0")):0;return new Date(Date.UTC(Number(t),Number(r)-1,Number(o),Number(a),Number(c),Number(s),f))}var p=new Date(n);if(Number.isNaN(p.getTime()))throw new Error("Invalid date string passed to UTCify: ".concat(n))}var h=_(n);return new Date(Date.UTC(h.getFullYear(),h.getMonth(),h.getDate(),h.getHours(),h.getMinutes(),h.getSeconds(),h.getMilliseconds()))},G=function(n){var e=(0,z.a)((0,L.g)((0,R.g)((0,U.$)(n,0),0),0),0);return B(e)},H=function(n){var e=_(n);return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds())},Z=function(n){return H(new Date(1e3*n))},F=function(n){if("string"==typeof n){if(n.match(Y))return n;var e=n.match(Q);if(e){var t=e[2],r=e[3];return"".concat(e[1],"-").concat(t,"-").concat(r)}throw new Error("Invalid date string passed to utcDateKey: ".concat(n))}var o=String(n.getUTCFullYear()),i=String(n.getUTCMonth()+1).padStart(2,"0"),a=String(n.getUTCDate()).padStart(2,"0");return"".concat(o,"-").concat(i,"-").concat(a)},W=function(n){return F(n).replaceAll("-","/")},X=function(n,e){return void 0===e&&(e={}),n?"undefined"!=typeof Craft?Craft.t("calendar",n,e):function(n,e){void 0===e&&(e={});for(var t=0,r=Object.entries(e);t0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]1,s=i&&(null==r?void 0:r[i])?r[i]:Craft.t("calendar","Site Picker"),d=(0,x.useMemo)(function(){if(l)return{text:s,icon:"site",click:function(e,r){var o=$(".fc-sitepicker-button");if(void 0===o.data("initialized")){for(var i=$("
",{class:"menu"}).insertAfter(r),l=$("