Changes for page Calendar Macro
Last modified by Benjamin Fischer on 2025/07/10 12:57
From version 1.1
edited by Benjamin Fischer
on 2024/11/05 16:22
on 2024/11/05 16:22
Change comment:
Install extension [org.xwiki.contrib:application-mocca-calendar-ui/2.9.6]
To version 8.1
edited by Benjamin Fischer
on 2025/07/10 12:57
on 2025/07/10 12:57
Change comment:
Install extension [org.xwiki.contrib:application-mocca-calendar-ui/2.9.10]
Summary
-
Objects (3 modified, 1 added, 0 removed)
Details
- XWiki.JavaScriptExtension[0]
-
- Code
-
... ... @@ -79,7 +79,7 @@ 79 79 var params = "page=" + encodeURIComponent(page) + "&isResize=" + (isResize ? "1" : "0") + "&delta=" + delta.asMilliseconds() + "&startDate=" + startDate.format() 80 80 if (endDate) { params += "&endDate=" + endDate.format(); } 81 81 params += "&allDay=" + (startDate.hasTime()?"":"1"); 82 - var url = this.updateEventUrl + params; 82 + var url = this.updateEventUrl + '&' + params; 83 83 jQuery.ajax(url).fail(function (data) { 84 84 savingBox.hide(); 85 85 this.displayError(); ... ... @@ -727,3 +727,11 @@ 727 727 } // if the XWiki.widgets.ModalPopup is defined 728 728 729 729 }); 730 + 731 +// Toggle the Filter Events by Calendar section. 732 +require(['jquery'], function ($) { 733 + $('#toggleCalendarsFilter').on('click', function() { 734 + $(this).children('span').toggleClass('fa-angle-up fa-angle-down'); 735 + $('#calendarsFilter form').toggleClass('hidden'); 736 + }); 737 +});
- XWiki.StyleSheetExtension[0]
-
- Code
-
... ... @@ -83,3 +83,35 @@ 83 83 div.fc-view.fc-plainList-view { 84 84 border-width: 0; 85 85 } 86 + 87 +/* Filterable calendars */ 88 +#calendarsFilter { 89 + h4 { 90 + display: inline-block; 91 + margin-right: 10px; 92 + } 93 + #toggleCalendarsFilter { 94 + margin-bottom: 10px; 95 + span.fa-angle-down { 96 + font-weight: bold; 97 + } 98 + } 99 + ul { 100 + list-style: none; 101 + padding: 0; 102 + li { 103 + float: left; 104 + margin-right: 10px; 105 + margin-bottom: 10px; 106 + label { 107 + margin: 0; 108 + } 109 + input, label { 110 + cursor: inherit; 111 + } 112 + } 113 + } 114 + input[type='submit'] { 115 + display: block; 116 + } 117 +} - Content Type
-
... ... @@ -1,1 +1,1 @@ 1 - CSS1 +LESS
- XWiki.WikiMacroClass[0]
-
- Macro code
-
... ... @@ -1,5 +1,4 @@ 1 1 {{velocity output="false"}} 2 -$services.localization.use('document', 'Calendar.Translations') 3 3 #if('#dateTimePicker_import()' == "#dateTimePicker_import()") 4 4 #set($picker_macro = false) 5 5 ## A simple date picker widget. ... ... @@ -73,35 +73,83 @@ 73 73 #if("$!dateFormat" == "") 74 74 #set($dateFormat = "dd.MM.yyyy HH:mm:ss") 75 75 #end 75 +#set ($eventLimit = $xcontext.macro.params.eventLimit) 76 +#if (!$eventLimit) 77 + #set ($eventLimit = false) 78 +#end 76 76 77 77 ## 78 78 ## some hardwired values that you can feel free to customize 79 79 ## 80 -#set($jsonUrl = $xwiki.getDocument("MoccaCalendar.Code.JSONService").getURL("get")) 81 -#set($newPageNameUrl = $xwiki.getDocument("MoccaCalendar.Code.NewEventNameService").getURL("get")) 82 -#set($dateCheckUrl = $xwiki.getDocument("MoccaCalendar.Code.DateCheckService").getURL("get")) 83 -#set($updateUrl = $xwiki.getDocument("MoccaCalendar.Code.UpdateService").getURL("get")) 84 -#set($deleteEventInstanceUrl = $xwiki.getDocument("MoccaCalendar.Code.DeleteEventInstanceService").getURL("get")) 83 +#set($jsonUrl = $xwiki.getURL('MoccaCalendar.Code.JSONService', 'get')) 84 +#set($newPageNameUrl = $xwiki.getURL('MoccaCalendar.Code.NewEventNameService', 'get')) 85 +#set($dateCheckUrl = $xwiki.getURL('MoccaCalendar.Code.DateCheckService', 'get')) 86 +#set($deleteEventInstanceUrl = $xwiki.getURL('MoccaCalendar.Code.DeleteEventInstanceService', 'get')) 85 85 #set($left = "prev,next today") 86 86 #set($center = "title") 87 87 #set($right = "agendaDay,agendaWeek,month,plainList") 90 +## Can create event in the current calendar or in the space or wiki calendar view if at least one calendar is editable for the current user. 91 +#set ($canCreateEvents = $xwiki.hasAccessLevel('edit', $xcontext.getUser(), $calendarDoc) || ($filter != 'page' && $services.moccacalendar.allEditableCalendars.size() > 0)) 92 +#set ($calendarsFilter = $request.parameterMap['calendarsFilter']) 93 +{{/velocity}} 88 88 89 -#set($canCreateEvents = $xwiki.hasAccessLevel("edit", $xcontext.getUser(), $calendarDoc)) 90 - 91 -{{/velocity}}{{velocity}}#if($xcontext.action=='view'){{html clean="false" wiki="false"}} 95 +{{velocity}} 96 +#if ($xcontext.action == 'view' && $filter != 'page') 97 + #set ($statement = "select doc.fullName, calendar.color from Document doc, doc.object(MoccaCalendar.MoccaCalendarClass) calendar where doc.name <> 'MoccaCalendarTemplate'") 98 + #set ($results = $services.query.xwql($statement).execute()) 99 + #if ($results.size() > 1) 100 + (% id="calendarsFilter" %)((( 101 + #set ($hasCalendarsFilter = "$!request.calendarsFilter" != '') 102 + ==== $services.localization.render('MoccaCalendar.calendarevent.filterEvents') ==== 103 + {{html clean="false"}} 104 + <div class="btn-group flat-buttons"> 105 + <a id="toggleCalendarsFilter" class="btn btn-default"> 106 + #set ($faClass = 'fa-angle-down') 107 + #if ($hasCalendarsFilter) 108 + #set ($faClass = 'fa-angle-up') 109 + #end 110 + <span class="fa $faClass"></span> 111 + </a> 112 + </div> 113 + <form action="" method="post" #if(!$hasCalendarsFilter)class="hidden"#end> 114 + <ul class="btn-group flat-buttons"> 115 + #foreach ($result in $results) 116 + #set ($docFullName = $result[0]) 117 + #set ($backgroundColor = $result[1]) 118 + #set ($checked = $calendarsFilter.contains($docFullName)) 119 + #set ($title = $xwiki.getDocument($docFullName).displayTitle) 120 + <li> 121 + <a class="btn btn-default"> 122 + <input type="checkbox" id="$docFullName" name="calendarsFilter" value="$docFullName" #if ($checked) checked #end style="accent-color:$backgroundColor"/> 123 + <label for="$docFullName">$title</label> 124 + </a> 125 + </li> 126 + #end 127 + </ul> 128 + <input type="submit" class="btn btn-primary" value="$services.localization.render('MoccaCalendar.calendarevent.filterEvents.submit')" /> 129 + </form> 130 + {{/html}} 131 + ))) 132 + #end 133 +#end 134 +#if ($xcontext.action=='view' || $xcontext.action=='export') 135 +{{html clean="false" wiki="false"}} 92 92 #if($canCreateEvents) 93 93 ## create event link 94 94 <div class="calendar-buttons"> 95 95 <span class="buttonwrapper"> 96 -<button class="btn btn-success" id="calendar${calcounter}-btn"><span class="glyphicon glyphicon-plus"></span> $escapetool. html($services.localization.render('MoccaCalendar.calendarevent.create'))</button>140 +<button class="btn btn-success" id="calendar${calcounter}-btn"><span class="glyphicon glyphicon-plus"></span> $escapetool.xml($services.localization.render('MoccaCalendar.calendarevent.create'))</button> 97 97 </span> 98 98 </div> 99 99 ## end create event link 100 100 #end 101 101 <div id="calendar${calcounter}"></div> 102 -#if($calcounter==0 && $canCreateEvents) 103 -## show event description form to trigger load of CK Editor resources 104 -<form class="hidden">$xwiki.getDocument('MoccaCalendar.MoccaCalendarEventTemplate').getObject('MoccaCalendar.MoccaCalendarEventClass').display('description','edit')</form> 146 +#if ($calcounter == 0 && $canCreateEvents) 147 + ## Show event description form to trigger load of CK Editor resources. 148 + <form class="hidden"> 149 + #set ($eventObject = $xwiki.getDocument('MoccaCalendar.MoccaCalendarEventTemplate').getObject('MoccaCalendar.MoccaCalendarEventClass')) 150 + $eventObject.display('description','edit').replace('{{html clean="false" wiki="false"}}', '').replace('{{/html}}', '') 151 + </form> 105 105 #end 106 106 <script type="text/javascript"> 107 107 require(['jquery', 'moccacalendar'], function(jQuery) { ... ... @@ -114,6 +114,7 @@ 114 114 outputSyntax: 'plain', 115 115 calendarDoc: "$!escapetool.javascript($calendarDoc)", 116 116 filter: "$!escapetool.javascript($filter)", 164 + calendarsFilter: "$!escapetool.javascript($stringtool.join($calendarsFilter, ','))", 117 117 classname: "MoccaCalendar.MoccaCalendarEventClass", 118 118 startfield: "startDate", 119 119 endfield: "endDate", ... ... @@ -122,6 +122,7 @@ 122 122 123 123 // page is now ready, initialize the calendar... 124 124 var calendar = jQuery('#calendar${calcounter}').fullCalendar({ 173 + eventLimit: $escapetool.javascript($eventLimit), 125 125 events: { 126 126 url : "$!escapetool.javascript($jsonUrl)", 127 127 type: 'GET', ... ... @@ -202,12 +202,37 @@ 202 202 }); 203 203 jQuery('#calendar${calcounter}-btn').click( function(e) { calendarHelper.showCreateEvent(); e.preventDefault(); }); 204 204 // helper to be used in callback above 205 -#set($newPageParams = "template=MoccaCalendar.MoccaCalendarEventTemplate&parentFROM=${escapetool.url($calendarDoc)}&form_token=${services.csrf.getToken()}&ocalcaction=create") 206 -#set($randomDocUrl = $xwiki.getURL("randomPage${util.generateRandomString(10)}",'edit',$newPageParams)) 207 -#set($updateUrlParams="?xpage=plain&outputSyntax=plain&calendarDoc=${escapetool.url(${calendarDoc})}&") 208 - var calendarHelper = new XWiki.MoccaCalendar.Helper(calendar, "$!escapetool.javascript($dateFormat)", "$escapetool.javascript($jsonUrl)", "$escapetool.javascript($randomDocUrl)", "$escapetool.javascript("${updateUrl}${updateUrlParams}")", "$escapetool.javascript($newPageNameUrl)", "$escapetool.javascript($dateCheckUrl)","$escapetool.javascript($deleteEventInstanceUrl)","$escapetool.javascript($newPageParams)", "${escapetool.javascript($services.csrf.getToken())}"); 209 - }); 254 +#set ($newPageParams = $escapetool.url({ 255 + 'template': 'MoccaCalendar.MoccaCalendarEventTemplate', 256 + 'parentFROM': $calendarDoc, 257 + 'form_token': $services.csrf.token, 258 + 'ocalcaction': 'create' 259 +})) 260 +## If the current user is not allowed to edit the current calendar, then create the temporary randomPage in a calendar that can be edited by the current user. 261 +#set ($randomSpace = 'MoccaCalendar') 262 +#if ($services.moccacalendar.allEditableCalendars.size() > 0) 263 + #set ($randomSpace = $services.model.serialize($services.model.resolveDocument($services.moccacalendar.allEditableCalendars[0]).lastSpaceReference)) 264 +#end 265 +#set ($randomDocUrl = $xwiki.getURL("${randomSpace}.randomPage${util.generateRandomString(10)}",'edit',$newPageParams)) 266 +#set ($updateUrlParams = $escapetool.url({ 267 + 'xpage': 'plain', 268 + 'outputSyntax': 'plain', 269 + 'calendarDoc': $calendarDoc 270 +})) 271 +#set ($updateUrl = $xwiki.getURL('MoccaCalendar.Code.UpdateService', 'get', $updateUrlParams)) 272 +var calendarHelper = new XWiki.MoccaCalendar.Helper(calendar, 273 + "$escapetool.javascript($dateFormat)", 274 + "$escapetool.javascript($jsonUrl)", 275 + "$escapetool.javascript($randomDocUrl)", 276 + "$escapetool.javascript($updateUrl)", 277 + "$escapetool.javascript($newPageNameUrl)", 278 + "$escapetool.javascript($dateCheckUrl)", 279 + "$escapetool.javascript($deleteEventInstanceUrl)", 280 + "$escapetool.javascript($newPageParams)", 281 + "$escapetool.javascript($services.csrf.token)" 282 +); 210 210 }); 284 +}); 211 211 </script> 212 212 {{/html}} 213 213 #else ## of #if($xcontext.action=='view') - defaultCategory
-
... ... @@ -1,0 +1,1 @@ 1 +Content
- XWiki.WikiMacroParameterClass[9]
-
- Parameter default value
-
... ... @@ -1,0 +1,1 @@ 1 +false - Parameter name
-
... ... @@ -1,0 +1,1 @@ 1 +eventLimit - Parameter description
-
... ... @@ -1,0 +1,1 @@ 1 +Sets a limit on daily event display. Extra events appear in a popover. If false (default) shows all events, else (true) restricts them to the day cell’s height. - Parameter mandatory
-
... ... @@ -1,0 +1,1 @@ 1 +No