Business Power - Stuttgart-Villa Berg
Asset-Herausgeber
The following has evaluated to null or missing: ==> lionsEventUtilService.getLionsEventDisplayModel(getterUtil.getLong(.vars['articleGroupId']), getterUtil.getString(.vars['articleId'])) [in template "10154#10194#LIONS_EVENT_V2" at line 41, column 26] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: lionsEventDisplayModel = lionsEventUt... [in template "10154#10194#LIONS_EVENT_V2" at line 41, column 1] ----
1<#-- LR7.x Version 06.11.2023 07:37h auf Basis des _Relaunch Bericht-->
2<#-- Hinweise
3 Alle Zurgiffe auf die DDL in Attempt - Recover Blöcke eingebait um keinen Fehler zu generieren
4 wenn eine Zugriffskollision auf die DDL stattfindet
5-->
6
7<#assign
8defaultTeilnehmerliste = "Teilnehmer Clubveranstaltungen"
9reservierungsZeit_ms = 120000
10reservierungsZeitPuffer_ms = 1000
11
12optionsValue = ""
13optionsComment = ""
14
15namespace = themeDisplay.getPortletDisplay().getNamespace()
16groupLocalServiceUtil = staticUtil["com.liferay.portal.kernel.service.GroupLocalServiceUtil"]
17journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")
18localeUtil = staticUtil["com.liferay.portal.kernel.util.LocaleUtil"]
19ddlRecordLocalService = serviceLocator.findService("com.liferay.dynamic.data.lists.service.DDLRecordLocalService")
20lionsImageService = serviceLocator.findService("de.lions.foundation.service.LionsImageService")
21lionsGroupService = serviceLocator.findService("de.lions.foundation.service.LionsGroupService")
22lionsEventUtilService = serviceLocator.findService("de.lions.event.util.service.LionsEventUtilService")
23lionsEventICSService = serviceLocator.findService("de.lions.event.util.service.LionsEventICSService")
24serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()
25
26imageUrlArray = []
27imgCntr = 0
28
29articleAuthorId = .vars['reserved-article-author-id'].data?number
30articleId = .vars['reserved-article-id'].data
31
32ausgebucht = false
33wirklichAusgebucht = false
34vorReserviert = false
35
36namespace = randomNumber(5)
37myRecordCreationKey = namespace
38/>
39
40<#assign
41lionsEventDisplayModel = lionsEventUtilService.getLionsEventDisplayModel(getterUtil.getLong(.vars['articleGroupId']), getterUtil.getString(.vars['articleId']))
42icsString = lionsEventICSService.getICSString(themeDisplay, lionsEventDisplayModel)
43
44recordSetId = lionsEventDisplayModel.getRecordSetId()
45gueltigeRecordSetId = lionsEventDisplayModel.isRecordSetCorrectConfigured()
46anzTickets = lionsEventDisplayModel.getNumberOfTickets()
47begrenzteTeilnemerzahl = (anzTickets > 0)
48
49gastRegistrierungErlaubt = lionsEventDisplayModel.isGuests()
50
51<#-- @ G. Ortwein Anmeldung abgelaufen wurde nicht korrekte abgefragt - korrigiert -->
52
53anmeldungAbgelaufen = lionsEventDisplayModel.isRegistrationDateReached()
54/>
55
56
57<#-- Start: prüfen auf Konfigurationsfehler bei den Optionen -->
58
59<#-- @ G. Ortwein - das müsste iregendwie schöner gehen...
60mir fiel aber ichts besseres ein -->
61
62<#if themeDisplay.isSignedIn() && (user.userId == articleAuthorId) >
63
64 <#if options.getSiblings()?has_content>
65 <#assign basisListe = [''] />
66 <#list options.getSiblings() as cur_options>
67 <#if cur_options.getData() !=''>
68 <#assign basis = cur_options.getData()?replace("\\W", "", "r") >
69 <#if basisListe?seq_index_of(basis) lt 0>
70 <#assign basisListe += [ basis ] >
71 <#else>
72 <div class="portlet-msg-alert"><h3><b>Konfigurationsfehler!</b></h3>
73 <b>${cur_options.getData()}</b> intern abgebildet auf: "<b>${basis}</b>" ist nicht
74 eindeutig! Bitte wählen sie einen eindeutigen Begriff
75 </div>
76 </#if>
77 <#assign suchstringListe = [''] />
78 <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer>
79 <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") >
80 <#if suchstringListe?seq_index_of(suchstring) lt 0 >
81 <#assign suchstringListe += [ suchstring ] >
82 <#else>
83 <div class="portlet-msg-alert"><h3><b>Konfigurationsfehler!</b></h3>
84 <b>Konfigurationsfehler: ${cur_options.getData()}.${cur_options_optionAnswer.getData()}</b>
85 intern abgebildet auf: "<b>${basis}.${suchstring}</b>" ist nicht eindeutig! Bitte
86 wählen sie einen eindeutigen Begriff
87 </div>
88 </#if>
89 </#list>
90 </#if>
91 </#list>
92 </#if>
93</#if>
94
95<#-- Ende: Prüfen auf Konfigurationsfehler beinden Optionen -->
96
97
98
99<#if gueltigeRecordSetId && (themeDisplay.isSignedIn() || gastRegistrierungErlaubt)>
100 <#assign
101 recordSetId = lionsEventDisplayModel.getRecordSet().getRecordSetId()
102 gastRegistrierungErlaubt = lionsEventDisplayModel.hasAddRecordPermission(themeDisplay)
103 />
104
105 <#if !gastRegistrierungErlaubt >
106 <#-- Id = 0 entfernt Programmteile zur Registrierung -->
107 <#assign
108 recordSetId = 0
109 />
110 </#if>
111<#else>
112<#-- Id = 0 entfernt Programmteile zur Registrierung -->
113 <#assign recordSetId = 0 />
114</#if>
115
116
117
118<#-- CSS Ergänzungen -->
119
120<#-- autocomplete -->
121
122<style>
123 /*the container must be positioned relative:*/
124 .autocomplete {
125 position: relative;
126 display: inline-block;
127 }
128
129
130 .autocomplete-items {
131 position: absolute;
132 border: 1px solid #d4d4d4;
133 border-bottom: none;
134 border-top: none;
135 z-index: 99;
136 /*position the autocomplete items to be the same width as the container:*/
137 top: 100%;
138 left: 0;
139 right: 0;
140 }
141
142 .autocomplete-items div {
143 padding: 10px;
144 cursor: pointer;
145 background-color: #fff;
146 border-bottom: 1px solid #d4d4d4;
147 }
148
149 /*when hovering an item:*/
150 .autocomplete-items div:hover {
151 background-color: #e9e9e9;
152 }
153
154 /*when navigating through the items using the arrow keys:*/
155 .autocomplete-active {
156 background-color: DodgerBlue !important;
157 color: #ffffff;
158 }
159
160</style>
161
162<#-- Rückmelde Buttons -->
163
164<style>
165 .attendance-submit-button {
166 width: 2.5em;
167 height: 2.5em;
168 line-height: 2.5em;
169 font-size: 2em;
170 margin: 2px;
171 text-align: center;
172 vertical-align: middle;
173 }
174
175 .attendance-submit-button:hover {
176 width: 2.6em;
177 height: 2.6em;
178 }
179
180 .attendance-submit-button:active {
181 width: 2.4em;
182 height: 2.4em;
183 }
184
185 .attendance-submit-button.disabled {
186 background-color: lightgrey !important;
187 color: grey;
188 }
189
190 .attendance-submit-button.update {
191 color: grey;
192 }
193
194 .attendance-submit-button.green {
195 background-color: lightgreen;
196 }
197
198 .attendance-submit-button.yellow {
199 background-color: yellow;
200 }
201
202 .attendance-submit-button.red {
203 background-color: red;
204 }
205</style>
206
207<#-- List Visualisierung Rückmledung -->
208
209<style>
210 .attendance-visual {
211 width: 2em;
212 height: 2em;
213 line-height: 2em;
214 font-size: 1.5em;
215 margin: 2px;
216 text-align: center;
217 vertical-align: middle;
218 color: black;
219 }
220
221 .attendance-visual.green {
222 background-color: lightgreen;
223 }
224
225 .attendance-visual.yellow {
226 background-color: yellow;
227 }
228
229 .attendance-visual.red {
230 background-color: red;
231 }
232</style>
233
234<#-- Edit Button -->
235
236<style>
237 .attendance-edit-button {
238 width: 2em;
239 height: 2em;
240 line-height: 2em;
241 font-size: 1.5em;
242 margin: 2px;
243 text-align: center;
244 vertical-align: middle;
245 background-color: lightgrey !important;
246 color: black;
247 }
248
249 .attendance-edit-button:hover {
250 width: 2.1em;
251 height: 2.1em;
252 }
253
254 .attendance-edit-button:active {
255 width: 1.9em;
256 height: 1.9em;
257 }
258</style>
259
260<#-- Ende CSS Ergänzungen -->
261
262
263<#-------- -->
264
265<#setting time_zone=eventDate.timezone.getData()>
266
267
268
269<#if themeDisplay.isSignedIn()>
270 <#if !gueltigeRecordSetId && (recordSetId > 0)>
271 <div class="portlet-msg-alert">
272 <h3><b>Konfigurationsfehler!</b></h3>
273 <b>Bitte geben Sie eine korrekte Nummer der Teilnehmerliste ein!</b><br>
274 <u>Mögliche Werte sind:</u><br>
275 <#list lionsEventUtilService.getRecordSets(themeDisplay.getSiteGroupId()) as cur_recordSet>
276 ${cur_recordSet.recordSetId}: ${cur_recordSet.name}<br>
277 </#list>
278 sowie<br>
279 0: automatische Auswahl der Liste mit dem Namen "${defaultTeilnehmerliste}"
280 </div>
281 </#if>
282</#if>
283
284
285<script type="text/javascript">
286
287 function addNonEmptyEntry(prefix, entry, postfix) {
288 s0 = prefix + entry + postfix;
289 if (entry == null) s0 = "";
290 if (entry == "null") s0 = "";
291 if (entry == "nil") s0 = "";
292 if (entry == "") s0 = "";
293 if (entry == " ") s0 = "";
294 return s0;
295 }
296
297 function makeNavUrl(name, street, zip, city, country) {
298 addresslink = "";
299 this.beautyText = "";
300 addresslink += addNonEmptyEntry("", name, ", ");
301 addresslink += addNonEmptyEntry("", street, ", ");
302 addresslink += addNonEmptyEntry("", addNonEmptyEntry("", zip, "") + "+" + addNonEmptyEntry("", city, ""), "");
303 addresslink += addNonEmptyEntry("+", country, "");
304
305 if (navigator.userAgent.match(/iPhone|iPod|iPad/i)) {
306 addresslink = "https://maps.apple.com/?q=" + encodeURIComponent(addresslink);
307 } else {
308 addresslink = "https://maps.google.com/?q=" + encodeURIComponent(addresslink);
309 }
310
311 this.beautyText += addNonEmptyEntry("<a href=\"", addresslink, "\"target=\"_blank\">");
312 this.beautyText += addNonEmptyEntry("", name, "<br>");
313 this.beautyText += addNonEmptyEntry("", street, "<br>");
314 this.beautyText += addNonEmptyEntry("", addNonEmptyEntry("", zip, "") + " " + addNonEmptyEntry("", city, ""), "<br>");
315 this.beautyText += addNonEmptyEntry("", country, "<br>");
316 if (addNonEmptyEntry("<a href=\"", addresslink, "\"target=\"_blank\">") !== "") {
317 this.beautyText += "</a>";
318 }
319 //console.log(this.beautyText);
320 return this.beautyText;
321
322 }
323
324
325 //-------------------------------
326
327 function updateSelectedOptions(updateObject, jsonUpdateString) {
328
329 console.log("updateSelectedOptions");
330 console.log(jsonUpdateString);
331 console.log(updateObject);
332
333
334 <#-- Optionen auslesen -->
335
336
337 <#assign empty_options_map>
338 {
339 <#if options.getSiblings()?has_content>
340 <#assign noOptions = 0>
341 <#list options.getSiblings() as cur_options>
342 <#if noOptions != 0>
343 ,
344 </#if>
345
346 .
347 ${cur_options.getData()?replace("\\W", "", "r")}.
348 :
349 []
350 <#assign noOptions++>
351 </#list>
352 </#if>
353 }
354 </#assign>
355
356 <#assign empty_options_map = empty_options_map?replace("\\s+","","r")>
357
358 if (jsonUpdateString == "") {
359 jsonUpdateString = "${empty_options_map}";
360 jsonUpdateString = jsonUpdateString.replaceAll('.', '\"');
361 }
362
363 var optionData = JSON.parse(jsonUpdateString);
364
365
366 for (var key in optionData) {
367 <#--
368 console.log(key);
369 console.log(JSON.stringify(optionData[key]));
370 -->
371
372 var optionsToSelect = JSON.stringify(optionData[key]);
373
374 var select = document.querySelector(updateObject + " select[id='" + key + "']");
375
376 if (select !== undefined && select !== null) {
377 for (var i = 0, l = select.options.length, o; i < l; i++) {
378 o = select.options[i];
379 <#--
380 console.log("oValue", o.value, o.value != "");
381 -->
382 o.selected = ((optionsToSelect.indexOf(o.value) != -1) && (o.value != ""));
383 }
384 }
385 }
386
387 }
388
389 //----------------------------------
390
391
392 function updateEntryInputField(updateObject1, name, email, recordSetId, key, updateObject2, jsonUpdateString, updateObject3, decision, updateObject4, comment) {
393 var recordIdField = document.querySelector("div.anmeldenameFeld input[id='activeRecordSet']");
394 recordIdField.value = recordSetId;
395
396 var textField = document.querySelector("div.anmeldenameFeld input[id='partnerGastName']");
397 textField.value = name;
398
399 var partnerGastEMail = document.querySelector("div.anmeldenameFeld input[id='partnerGastEMail']");
400 partnerGastEMail.value = email;
401
402 var activeRecordCreationKey = document.querySelector("div.anmeldenameFeld input[id='activeRecordCreationKey']");
403 activeRecordCreationKey.value = key;
404
405 var participantComment = document.querySelector("div.rm-comment-form textarea[id='participantComment']");
406 participantComment.value = comment;
407
408
409 json = jsonUpdateString.replaceAll('.', '\"');
410 console.log(json);
411 updateSelectedOptions(updateObject2, json);
412
413 updateAttendanceButtons(decision);
414
415 window.location.hash = "MyFeedbackAnker1";
416 window.location.hash = "MyFeedbackAnker2";
417
418 if ((parseInt(recordSetId) == 0) || (name.length > 0)) {
419
420 document.querySelector("div.anmeldenameFeld").hidden = false;
421 ;
422 if (document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value == "") {
423 document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").focus();
424 }
425 } else {
426 document.querySelector("div.anmeldenameFeld").hidden = true;
427 }
428
429 }
430
431
432 function updateAttendanceButtons(decision) {
433 if (decision !== "update") {
434 document.querySelectorAll('.attendance-submit-button').forEach(function (el) {
435 el.classList.add('disabled');
436 });
437 document.querySelectorAll('.attendance-submit-button').forEach(function (el) {
438 el.classList.remove('update');
439 });
440
441 } else {
442 document.querySelectorAll('.attendance-submit-button').forEach(function (el) {
443 el.classList.add('update');
444 });
445 }
446
447 console.log("DECISION: ", decision);
448 if (decision === "ja") {
449 document.querySelectorAll(".attendance-submit-button.green").forEach(function (el) {
450 el.classList.remove('disabled');
451 });
452 }
453
454 if (decision === "vielleicht") {
455 document.querySelectorAll(".attendance-submit-button.yellow").forEach(function (el) {
456 el.classList.remove('disabled');
457 });
458 }
459
460 if (decision === "nein") {
461 document.querySelectorAll(".attendance-submit-button.red").forEach(function (el) {
462 el.classList.remove('disabled');
463 });
464 }
465
466 if (decision === "all") {
467 document.querySelectorAll(".attendance-submit-button.green").forEach(function (el) {
468 el.classList.remove('disabled');
469 });
470 document.querySelectorAll(".attendance-submit-button.yellow").forEach(function (el) {
471 el.classList.remove('disabled');
472 });
473 document.querySelectorAll(".attendance-submit-button.red").forEach(function (el) {
474 el.classList.remove('disabled');
475 });
476 }
477 }
478
479 function ensureNameFilled() {
480 document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value = document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value.trim().replaceAll(/(\s\s\s*)/g, ' ');
481 if (document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value == "") {
482 document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").focus();
483 } else {
484 var guestName = document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value;
485 console.log(guestName);
486 var indexOfGuestName = jsListeNamen.indexOf(guestName);
487 console.log(indexOfGuestName);
488 var guestEMail = "";
489 if (indexOfGuestName >= 0) {
490 guestEMail = jsListeEMail[indexOfGuestName];
491 }
492 console.log(guestEMail);
493
494 var guestEMailField = document.querySelector("div.anmeldenameFeld form input[name='partnerGastEMail']");
495 if (guestEMailField.value == "") {
496 guestEMailField.value = guestEMail;
497 }
498
499 }
500
501 updateAttendanceButtons('update');
502 }
503
504
505 function icsDownload${namespace}() {
506 var filename = encodeURIComponent("Kalender-${themeDisplay.getLayout().getGroup().getName(locale)?replace(" ", "_")?js_string}" + ".ics");
507 var icaldata = '${icsString?js_string}';
508 downloadIcsFile(filename, icaldata);
509 }
510
511 function downloadIcsFile(filename, text) {
512 var element = document.createElement('a');
513 element.setAttribute('href', 'data:text/calendar;charset=utf-8,' + encodeURIComponent(text));
514 element.setAttribute('download', filename);
515
516 element.style.display = 'none';
517 document.body.appendChild(element);
518
519 element.click();
520
521 document.body.removeChild(element);
522 }
523</script>
524
525
526<#-- --------------------------------- -->
527
528
529<#macro renderImage
530image
531>
532 <#if image.getData()?has_content>
533
534 <@addFrescoImageUrl image.getData() />
535
536 <#assign
537 imageCssClass = "img-fluid crop-center position-absolute h-100 w-100"
538 fileVersion = lionsImageService.getFileVersionFromWebContentString(image.data)!""
539 />
540
541 <div class="image-wrapper aspect-ratio aspect-ratio-3-to-2 w-100">
542 <#if fileVersion?? && fileVersion?has_content>
543 <@adaptive_media_image["img"]
544 fileVersion=fileVersion
545 class=imageCssClass
546 alt=image.alt.getData()
547 data\-image\-id=getNextId() />
548 <#else>
549 <img class="${imageCssClass}"
550 src="${image.getData()}" alt="${image.alt.getData()}"
551 data-image-id="${getNextId()}">
552 </#if>
553 </div>
554 <@renderImageCaption image/>
555 </#if>
556</#macro>
557
558<#macro renderSlider
559images
560showArrows=true
561>
562 <div class="swiper-navigation-wrapper">
563 <div class="swiper-button-next"></div>
564 <div class="swiper-button-prev"></div>
565 </div>
566
567 <div class="swiper swiper-container swiper-container-${namespace} h-100">
568 <div class="swiper-wrapper">
569 <#list images as cur_image>
570
571 <@addFrescoImageUrl cur_image.getData() />
572
573 <#assign
574 imageCssClass = "position-absolute img-fluid w-100 h-100 crop-center"
575 imageAlt = cur_image.alt?has_content?then(cur_image.alt.getData(), '')
576 fileVersion = lionsImageService.getFileVersionFromWebContentString(cur_image.data)!""
577 />
578
579 <div class="swiper-slide ${cur_image?is_first?then('active', '')}">
580 <div class="aspect-ratio aspect-ratio-3-to-2">
581 <#if fileVersion?? && fileVersion?has_content>
582 <@adaptive_media_image["img"]
583 fileVersion=fileVersion
584 class=imageCssClass
585 alt=imageAlt
586 data\-image\-id=getNextId() />
587 <#else>
588 <img class="${imageCssClass}"
589 src="${cur_image.getData()}"
590 alt="${imageAlt}"
591 data-image-id="${getNextId()}">
592 </#if>
593 </div>
594 <@renderImageCaption cur_image />
595 </div>
596 </#list>
597 </div>
598 <#-- Add Pagination -->
599 <div class="swiper-pagination"></div>
600 <#-- Add Arrows -->
601 </div>
602
603 <script type="module">
604 import Swiper from '/o/lions-js-module-loader/third-party/swiper.min.js';
605
606 function initSwiper${namespace}(selector, showArrows) {
607 let config =
608 {
609 slidesPerView: 'auto',
610 centeredSlides: true,
611 loop: true,
612 spaceBetween: 30,
613 speed: 1200,
614 pagination: {
615 el: '.swiper-pagination',
616 clickable: true,
617 },
618 };
619
620 if (showArrows) {
621 config.navigation = {
622 nextEl: '.swiper-button-next',
623 prevEl: '.swiper-button-prev',
624 };
625 }
626
627 new Swiper(selector, config);
628 }
629
630 initSwiper${namespace}('.swiper-container-${namespace}', ${showArrows?c});
631 </script>
632</#macro>
633
634<#macro renderImageCaption
635image
636>
637 <#assign
638 imageCaption = (image.caption?? && image.caption.getData()?has_content)?then(image.caption.getData(), "")
639 imageSource = (image.source?? && image.source.getData()?has_content)?then(image.source.getData(), "")
640 />
641
642 <#if imageCaption?has_content || imageSource?has_content>
643 <div class="image-caption">
644 <#if imageCaption?has_content || imageSource?has_content>
645 ${imageCaption}
646 </#if>
647 <#if imageCaption?has_content || imageSource?has_content>
648 <span class="px-1">|</span>
649 </#if>
650 <#if imageSource?has_content>
651 ${imageSource}
652 </#if>
653 </div>
654 </#if>
655</#macro>
656
657<#function getNextId >
658 <#assign imgCntr = imgCntr + 1>
659 <#return imgCntr>
660</#function>
661
662<#macro addFrescoImageUrl url >
663 <#assign imageUrlArray = imageUrlArray + [url] />
664</#macro>
665
666<#function randomNumber salt>
667 <#local str= .now?long />
668 <#assign str = (str * salt)/3 />
669 <#return str[(str?string?length-5)..]/>
670</#function>
671
672<#-- Hier beginnt die Ausgabe des Veranstaltungshinweises -->
673
674<div class="container lions-event event-${articleId} lions-report lions-report-${articleId} mt-4">
675 <div class="headline row justify-content-center pb-2">
676 <div class="col-md-7">
677 <div class="row align-items-center">
678 <div class="col">
679 <h1>${.vars['reserved-article-title'].data}</h1>
680 </div>
681 <div class="col-auto">
682 <button onclick="javascript:icsDownload${namespace}();"
683 class="btn btn-primary btn-sm" type="button">
684 <i class="far fa-calendar-alt"></i> <i class="ml-1 fas fa-cloud-download-alt"></i>
685 </button>
686 </div>
687 </div>
688 </div>
689 </div>
690
691 <#-- Zunächst erfolgt die Ausgabe der Termingrunddaten wie Datum, Ort und Zeit in einer Tabelle -->
692
693 <div class="content row justify-content-center">
694 <div class="col-md-7">
695 <div class="row" style="font-weight: bold">
696 <div class="col">
697 <div class="row">
698 <div class="col">
699 Datum: ${lionsEventDisplayModel.getStartDateFormatted()}
700 </div>
701 </div>
702
703 <#if lionsEventDisplayModel.isDisplayStartTime() >
704 <div class="row">
705 <div class="col">
706 Beginn: ${lionsEventDisplayModel.getStartTimeFormatted()}
707 </div>
708 </div>
709 </#if>
710
711 <#if lionsEventDisplayModel.isDisplayEndTime() && lionsEventDisplayModel.isDisplayEndDate() >
712 <div class="row">
713 <div class="col">
714 Ende: ${lionsEventDisplayModel.getEndDateTimeFormatted()}
715 </div>
716 </div>
717 <#elseif lionsEventDisplayModel.isDisplayEndTime()>
718 <div class="row">
719 <div class="col">
720 Ende: ${lionsEventDisplayModel.getEndTimeFormatted()}
721 </div>
722 </div>
723 </#if>
724
725 <#if lionsEventDisplayModel.isDisplayDoorsOpenTime() >
726 <div class="row">
727 <div class="col">
728 Einlass: ${lionsEventDisplayModel.getDoorsOpenTimeFormatted()}
729 </div>
730 </div>
731 </#if>
732
733 <#if lionsEventDisplayModel.isDisplayRegistrationUntilDate() >
734 <div class="row">
735 <div class="col">
736 Anmeldeschluß:
737 <nobr>${lionsEventDisplayModel.getRegistrationAllowedUntilDateTimeFormatted()}</nobr>
738 </div>
739 </div>
740 </#if>
741
742 <#if lionsEventDisplayModel.isRegistrationDateReached() >
743 <div class="row">
744 <div class="col">
745 Anmeldung abgelaufen
746 </div>
747 </div>
748 </#if>
749 </div>
750 <div class="col-auto text-right">
751 <div id="Veranstaltungsort">
752 ${lionsEventDisplayModel.getLocationName()}<br>
753 ${lionsEventDisplayModel.getStreetAndNumber()}<br>
754 ${lionsEventDisplayModel.getZipCode()} ${lionsEventDisplayModel.getCity()}<br>
755 </div>
756 <#if validator.isNotNull(lionsEventDisplayModel.getOnlineUri()) >
757 <div id="OnlineUri" class="pt-2">
758 <a href="${lionsEventDisplayModel.getOnlineUri()}">Online teilnehmen...</a>
759 </div>
760 </#if>
761 </div>
762 </div>
763
764 <#-- Piktogramme und Text für zulässige Optionen anzeigen -->
765 <#if lionsEventDisplayModel.isPartner() >
766 <div class="row">
767 <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;">
768 <@clay["icon"] symbol="user"/>
769 </div>
770 <div class="col">mit Partnern</div>
771 </div>
772 </#if>
773 <#if lionsEventDisplayModel.isGuests() >
774 <div class="row">
775 <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;">
776 <@clay["icon"] symbol="users"/>
777 </div>
778 <div class="col">mit Gästen</div>
779 </div>
780 </#if>
781
782 <#if lionsEventDisplayModel.isFood() >
783 <div class="row">
784 <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;">
785 <i class="fas fa-utensils"></i>
786 </div>
787 <div class="col">mit mit Essen</div>
788 </div>
789 </#if>
790
791 <#if anzTickets gt 0>
792 <div class="row">
793 <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;">
794 <b>#</b><@clay["icon"] symbol="user"/>
795 </div>
796 <div class="col">Maximal ${anzTickets} Teilnehmer</div>
797 </div>
798 </#if>
799 </div>
800 </div>
801
802 <#-- Inhalte des Termins und Einladungstext ausgeben -->
803 <#-- Hier begnnt die Ausgabe der Berichts - Kompatiblen Inhalte von Prodyne _Relaunch_Bericht übernommen -->
804
805 <#if validator.isNotNull(lionsEventDisplayModel.getTeaserText(false)) >
806 <div class="abstract row justify-content-center pt-2">
807 <div class="col-md-7">
808 ${lionsEventDisplayModel.getTeaserText(false)}
809 </div>
810 </div>
811 </#if>
812
813 <!-- Images -->
814 <#if images.getSiblings()?size gt 0 >
815 <@liferay_util["html-top"]>
816 <meta name="image" property="og:image" content="${images.getSiblings()[0].getData()}">
817 </@>
818
819 <#if images.getSiblings()?size gt 1 >
820 <div class="row justify-content-center pt-3">
821
822 <div class="col-md-9 slider-col">
823 <@renderSlider
824 images=images.getSiblings()
825 />
826 </div>
827 </div>
828 <#elseif images.getSiblings()[0].getData()?has_content >
829 <div class="row justify-content-center pt-3">
830 <div class="col-md-9">
831 <@renderImage
832 image=images.getSiblings()[0]
833 />
834 </div>
835 </div>
836 </#if>
837 </#if>
838
839
840 <div class="content row justify-content-center">
841 <div class="col-md-7">
842 <p>${lionsEventDisplayModel.getContent()}</p>
843 </div>
844 </div>
845
846 <link rel="stylesheet" type="text/css" href="${themeDisplay.getPathThemeCss()}/fresco.css"/>
847
848 <script type="module">
849 import Fresco from '/o/lions-js-module-loader/third-party/fresco.js';
850
851 function getThumbnailUrl(url) {
852 let pattern = new RegExp("(\\?|\\&)(imageThumbnail=).*?(&|$)");
853
854 if (url && url.search(pattern) >= 0) {
855 url = url.replace(pattern, "$1$3");
856 }
857 return url + ((url.indexOf('?') > -1) ? '&imageThumbnail=1' : '?imageThumbnail=1');
858 }
859
860 function createImageElement(url) {
861 let imageElement = {};
862 imageElement.url = url;
863 imageElement.options = {};
864 imageElement.options.thumbnail = getThumbnailUrl(url);
865 return imageElement;
866 }
867
868
869 let imageUrls = [<#list imageUrlArray as imageElement>'${imageElement}', </#list>]
870 let frescoImages = [];
871 imageUrls.forEach(url => frescoImages.push(createImageElement(url)));
872
873 // lightbox start
874 document.querySelectorAll('.lions-report-${articleId} img').forEach(function (img) {
875 img.addEventListener('click', () => {
876 Fresco.show(frescoImages, $(this).data('image-id'));
877 });
878 });
879 document.querySelector('.lions-report-${articleId}').classList.add('lightbox');
880 // lightbox end
881 </script>
882
883 <#-- Hier Endet die Ausgabe der Berichts - Kompatiblen Inhalte von Prodyne _Relaunch_Bericht übernommen -->
884
885 <div class="abstract row justify-content-center pt-2">
886 <div class="col-md-7">
887 <p>
888 <#if validator.isNotNull(organizer.getData())>
889
890 <b><i>
891
892 Veranstalter: ${organizer.getData()} ${organizer.orgStreetAndNumber.getData()} ${organizer.orgZip.getData()} ${organizer.orgCity.getData()}</i></b>
893
894 </#if>
895 </p>
896 <p><i>Online gestellt von: ${.vars['reserved-article-author-name'].data}<br>
897
898 <#assign DatumModified_Data = .vars['reserved-article-modified-date'].data>
899
900 <#if validator.isNotNull(DatumModified_Data)>
901 <#assign DatumModified_DateObj = dateUtil.parseDate("EE, dd MMM yyyy HH:mm:ss Z", DatumModified_Data, locale)>
902 Letzte
903 Änderung: ${dateUtil.getDate(DatumModified_DateObj, "EE, d. MMM yyyy HH:mm", locale, themeDisplay.getTimeZone())}
904 </i></p>
905 </#if>
906 </div>
907 </div>
908
909
910 <#if recordSetId != 0 >
911
912
913
914 <#-- Record Set auswählen -->
915
916
917 <#-- start add reservation record -->
918
919 <#-- sofern die Teilnehmerzahl begrenzt ist, Buchung vorreservieren -->
920 <#if begrenzteTeilnemerzahl >
921
922 <#assign dateTimeVorReserviert = .now?datetime?long >
923
924 <#assign reservationFormValues = {"Veranstaltung":"${articleId}","Name":"","Teilnahme": "res","Optionen":""} >
925
926 <#--<#assign newDDLRecord = ddlRecordLocalService.addRecord(user.userId, groupId, recordSetId, 0, reservationFormValues, serviceContext) >-->
927
928 <#assign vorReserviert = true >
929
930 <script>
931 Liferay.Service(
932 '/ddl.ddlrecord/add-record',
933 {
934 groupId: ${groupId},
935 recordSetId: ${recordSetId},
936 displayIndex: 0,
937 fieldsMap: JSON.stringify({
938 "Veranstaltung": "${articleId}",
939 "Name": '',
940 "eMail": '',
941 "Teilnahme": 'res',
942 "Optionen": '',
943 })
944 },
945 function (obj) {
946
947 }
948 );
949 </script>
950 </#if>
951
952 <#-- end add reservation record -->
953
954
955
956 <#assign records = ddlRecordLocalService.getRecords(recordSetId)>
957
958 <#-- Rückmeldungen ermitteln -->
959 <#assign anzTeilnehmer = 0>
960 <#assign aktuellJa = 0>
961 <#assign aktuellVielleicht = 0>
962 <#assign aktuellNein = 0>
963 <#assign aktuellRes = 0 >
964 <#list records?sort_by("modifiedDate") as cur_record>
965 <#attempt>
966 <#-- ${cur_record}<br> -->
967 <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) >
968 <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) >
969 <#if entscheidung == "ja" >
970 <#assign aktuellJa += 1 >
971 <#elseif entscheidung == "vielleicht" >
972 <#assign aktuellVielleicht = aktuellVielleicht +1 >
973 <#elseif entscheidung == "nein" >
974 <#assign aktuellNein += 1 >
975 <#elseif entscheidung == "res" >
976 <#assign reservationCreateDate_DateObj = cur_record.getCreateDate() >
977 <#--
978 CreateDate: ${reservationCreateDate_DateObj?iso_utc}<br>
979 -->
980 <#assign nowDateTime_DateObj = .now>
981 <#--
982 NowDate: ${nowDateTime_DateObj?iso_utc}<br>
983 -->
984 <#assign dateDifference = nowDateTime_DateObj?long - (reservationCreateDate_DateObj?long ) />
985 <#--
986 Difference: ${dateDifference}<br>
987 Reservierungszeit: ${reservierungsZeit_ms}<br>
988 -->
989 <#if dateDifference gte (reservierungsZeit_ms + reservierungsZeitPuffer_ms)>
990 <#-- Abgelaufen: ${cur_record.recordId}<br> -->
991 <#--<#assign deletedDDLRecord = ddlRecordLocalService.deleteRecord(cur_record.recordId) >-->
992 <script>
993 Liferay.Service(
994 '/ddl.ddlrecord/delete-record',
995 {
996 recordId: ${cur_record.recordId}
997 },
998 function (obj) {
999
1000 }
1001 );
1002 </script>
1003
1004
1005 <#elseif (themeDisplay.isSignedIn() && cur_record.userId == user.userId) &&(cur_record.recordId != newDDLRecord.getRecordId()) >
1006 <#-- eigene abgelaufene Reservierungen bereinigen -->
1007 <#--<#assign deletedDDLRecord = ddlRecordLocalService.deleteRecord(cur_record.recordId) >-->
1008 <script>
1009 Liferay.Service(
1010 '/ddl.ddlrecord/delete-record',
1011 {
1012 recordId: ${cur_record.recordId}
1013 },
1014 function (obj) {
1015
1016 }
1017 );
1018 </script>
1019 <#else>
1020 <#assign aktuellRes += 1 >
1021 <#-- aktuellRes: ${aktuellRes}<br> -->
1022 </#if>
1023 </#if>
1024 </#if>
1025 <#recover>
1026 </#attempt>
1027 </#list>
1028 <#-- aus irgendeinem Grund werden bei Aufruf aus dem Asset Herausgeber immer zwei Reservierungen angelegt -->
1029
1030 <#-- Aktuelle Vorreservierungen: ${aktuellRes}<br> -->
1031
1032 <#assign anzTeilnehmer = aktuellJa + aktuellVielleicht + aktuellNein>
1033
1034 <#assign ausgebucht = false >
1035 <#if (anzTickets != 0) && (anzTickets <= (aktuellJa+aktuellRes-1))>
1036 <#assign ausgebucht = true >
1037 </#if>
1038 <#assign wirklichAusgebucht = false >
1039 <#if (anzTickets != 0) && (anzTickets <= aktuellJa)>
1040 <#assign wirklichAusgebucht = true >
1041 </#if>
1042 <#-- Ende Rückmeldungen Ermitteln -->
1043
1044 <#-- Eigene Rückmeldung prüfen -->
1045
1046 <#-- noch ist kein eigener Record gefunden, d.h. ID auf 0 setzen -->
1047
1048
1049
1050 <#assign myRecord = 0 >
1051 <#assign essenValue = 0 >
1052 <#-- weitere Teilnhemer -->
1053 <#assign partnerErlaubt = false >
1054 <#assign gaesteErlaubt = false >
1055
1056 <#if ddlId?? && ddlId.partner?? && getterUtil.getBoolean(ddlId.partner.getData())>
1057
1058 <#if ddlId.getData() == "" >
1059 <#else>
1060 <#assign partnerErlaubt = true >
1061 </#if>
1062
1063 </#if>
1064
1065 <#if ddlId?? && ddlId.guests?? && getterUtil.getBoolean(ddlId.guests.getData())>
1066
1067 <#if ddlId.getData() == "" >
1068 <#else>
1069 <#assign gaesteErlaubt = true >
1070 </#if>
1071
1072 </#if>
1073
1074
1075
1076 <#-- prüfen, ob es eine Rückmeldung des angemeldeten Users gibt -->
1077 <#-- Records neu einlesen, da sie modifiziert wurden !!! -->
1078 <#assign records = ddlRecordLocalService.getRecords(recordSetId)>
1079
1080 <#if records?has_content>
1081
1082 <#list records as cur_record>
1083
1084
1085 <#attempt>
1086 <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) && cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) != "res" && (cur_record.userId == user.userId) >
1087
1088
1089
1090 <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" >
1091 <#else>
1092 <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale)>
1093 <#-- ${entscheidung}<p> -->
1094 <#assign myRecord = cur_record.recordId >
1095 <#-- ${myRecord} -->
1096
1097
1098 <#assign optionsValue = "" >
1099
1100
1101 <#if cur_record.getDDMFormFieldValues("Optionen")?? >
1102 <#assign optionsValue = cur_record.getDDMFormFieldValues("Optionen")?first.getValue().getString(locale) >
1103 <#-- Optionen ${optionsValue}<br> -->
1104
1105 </#if>
1106
1107 <#assign optionsComment = "" >
1108 <#if cur_record.getDDMFormFieldValues("Kommentar")?? >
1109 <#assign optionsComment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale) >
1110 </#if>
1111
1112
1113
1114 </#if>
1115 </#if>
1116 <#recover>
1117 </#attempt>
1118 </#list>
1119 </#if>
1120
1121
1122
1123
1124 <#-- --------------------------------------------- -->
1125 <#-- Start Autocomplete Name -->
1126 <#-- --------------------------------------------- -->
1127
1128 <#assign listeNamen = []>
1129 <#assign listeEMail = []>
1130
1131 <#list records?reverse as cur_record>
1132 <#attempt>
1133 <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) >
1134
1135 <#else>
1136 <#-- nur Namen zeigen, die man selbst schon einmal eingegeben hat -->
1137 <#if user.userId == cur_record.userId >
1138
1139 <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" && (user.userId == cur_record.userId)>
1140
1141 <#if listeNamen?seq_contains(cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale))>
1142 <#else>
1143 <#assign listeNamen = listeNamen + [cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)]>
1144 <#if cur_record.getDDMFormFieldValues("eMail")?? >
1145 <#assign listeEMail += [cur_record.getDDMFormFieldValues("eMail")?first.getValue().getString(locale)]>
1146 <#else>
1147 <#assign listeEMail += [""]>
1148 </#if>
1149 </#if>
1150
1151
1152
1153 </#if>
1154
1155 </#if>
1156
1157 </#if>
1158 <#recover>
1159 </#attempt>
1160 </#list>
1161
1162
1163 <script>
1164 function autocomplete(inp, arr) {
1165 /*the autocomplete function takes two arguments,
1166 the text field element and an array of possible autocompleted values:*/
1167 var currentFocus;
1168 /*execute a function when someone writes in the text field:*/
1169 inp.addEventListener("input", function (e) {
1170 var a, b, i, val = this.value;
1171 /*close any already open lists of autocompleted values*/
1172 closeAllLists();
1173 if (!val) {
1174 return false;
1175 }
1176 currentFocus = -1;
1177 /*create a DIV element that will contain the items (values):*/
1178 a = document.createElement("DIV");
1179 a.setAttribute("id", this.id + "autocomplete-list");
1180 a.setAttribute("class", "autocomplete-items");
1181 /*append the DIV element as a child of the autocomplete container:*/
1182 this.parentNode.appendChild(a);
1183 /*for each item in the array...*/
1184 for (i = 0; i < arr.length; i++) {
1185 /*check if the item starts with the same letters as the text field value:*/
1186 pos = arr[i].toUpperCase().indexOf(val.toUpperCase());
1187
1188 if (arr[i].substr(pos, val.length).toUpperCase() == val.toUpperCase()) {
1189 /*create a DIV element for each matching element:*/
1190 b = document.createElement("DIV");
1191 /*make the matching letters bold:*/
1192 b.innerHTML = arr[i].substr(0, pos)
1193 b.innerHTML += "<strong>" + arr[i].substr(pos, val.length) + "</strong>";
1194 b.innerHTML += arr[i].substr(pos + val.length);
1195 /*insert a input field that will hold the current array item's value:*/
1196 b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";
1197 /*execute a function when someone clicks on the item value (DIV element):*/
1198 b.addEventListener("click", function (e) {
1199 /*insert the value for the autocomplete text field:*/
1200 inp.value = this.getElementsByTagName("input")[0].value;
1201 /* generate blur event on updated field */
1202 inp.focus();
1203 inp.blur();
1204
1205 /*close the list of autocompleted values,
1206 (or any other open lists of autocompleted values:*/
1207 closeAllLists();
1208 });
1209 a.appendChild(b);
1210 }
1211 }
1212 });
1213 /*execute a function presses a key on the keyboard:*/
1214 inp.addEventListener("keydown", function (e) {
1215 var x = document.getElementById(this.id + "autocomplete-list");
1216 if (x) x = x.getElementsByTagName("div");
1217 if (e.keyCode == 40) {
1218 /*If the arrow DOWN key is pressed,
1219 increase the currentFocus variable:*/
1220 currentFocus++;
1221 /*and and make the current item more visible:*/
1222 addActive(x);
1223 } else if (e.keyCode == 38) { //up
1224 /*If the arrow UP key is pressed,
1225 decrease the currentFocus variable:*/
1226 currentFocus--;
1227 /*and and make the current item more visible:*/
1228 addActive(x);
1229 } else if (e.keyCode == 13) {
1230 /*If the ENTER key is pressed, prevent the form from being submitted,*/
1231 e.preventDefault();
1232 if (currentFocus > -1) {
1233 /*and simulate a click on the "active" item:*/
1234 if (x) x[currentFocus].click();
1235 }
1236 }
1237 });
1238
1239 function addActive(x) {
1240 /*a function to classify an item as "active":*/
1241 if (!x) return false;
1242 /*start by removing the "active" class on all items:*/
1243 removeActive(x);
1244 if (currentFocus >= x.length) currentFocus = 0;
1245 if (currentFocus < 0) currentFocus = (x.length - 1);
1246 /*add class "autocomplete-active":*/
1247 x[currentFocus].classList.add("autocomplete-active");
1248 }
1249
1250 function removeActive(x) {
1251 /*a function to remove the "active" class from all autocomplete items:*/
1252 for (var i = 0; i < x.length; i++) {
1253 x[i].classList.remove("autocomplete-active");
1254 }
1255 }
1256
1257 function closeAllLists(elmnt) {
1258 /*close all autocomplete lists in the document,
1259 except the one passed as an argument:*/
1260 var x = document.getElementsByClassName("autocomplete-items");
1261 for (var i = 0; i < x.length; i++) {
1262 if (elmnt != x[i] && elmnt != inp) {
1263 x[i].parentNode.removeChild(x[i]);
1264 }
1265 }
1266 }
1267
1268 /*execute a function when someone clicks in the document:*/
1269 document.addEventListener("click", function (e) {
1270 closeAllLists(e.target);
1271 });
1272 }
1273
1274 /*An array containing all the country names in the world:*/
1275
1276 <#-- @ G. Ortwein - Korrektur -->
1277 <#if themeDisplay.isSignedIn()>
1278 var vorschlaege = [<#list listeNamen?sort as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>];
1279 var jsListeNamen = [<#list listeNamen as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>];
1280 var jsListeEMail = [<#list listeEMail as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>];
1281 <#else>
1282 var vorschlaege = [];
1283 var jsListeNamen = [];
1284 var jsListeEMail = [];
1285 </#if>
1286
1287
1288 /*initiate the autocomplete function on the "recordNewName" element, and pass along the countries array as possible autocomplete values:*/
1289
1290 console.log("Autocomplete VORSCHLAEGE:", vorschlaege);
1291 console.log("jsListeNamen:", jsListeNamen);
1292 console.log("jsListeEMail:", jsListeEMail);
1293
1294 //console.log(vorschlaege);
1295 //autocomplete(document.getElementById("recordNewName"), vorschlaege);
1296
1297
1298 </script>
1299
1300
1301 <#-- --------------------------------------------- -->
1302 <#-- Ende Autocomplete Name -->
1303 <#-- --------------------------------------------- -->
1304
1305 <div class="abstract row justify-content-center pt-2">
1306 <div class="col-md-7">
1307 <hr>
1308
1309 <#-- hier beginnt die Ausgabe des Rückmeldefelds für die Anmeldung zur Veranstaltung -->
1310 <div id="rueckmeldung"></div>
1311 <div id="MyFeedbackAnker2"> </div>
1312 <div id="MyFeedbackAnker1"><h3>Meine Rückmeldung</h3></div>
1313
1314 <#-- ergänzt, dass Gäste ihren Namen nennen müssen -->
1315 <#if !themeDisplay.isSignedIn() && gastRegistrierungErlaubt>
1316 <div class="anmeldenameFeld">
1317 <#else>
1318 <div class="anmeldenameFeld" hidden>
1319 </#if>
1320 <form id="partnerGastNameForm">
1321 <div class="row">
1322 <div class="col-md-6">
1323 <label for="partnerGastName">Für</label>
1324 <div class="autocomplete w-100">
1325 <input type="text" autocomplete="off" id="partnerGastName" name="partnerGastName"
1326 value="" class="form-control"
1327 placeholder="bitte den Namen eingeben" onblur="ensureNameFilled()">
1328 </div>
1329 </div>
1330 <div class="col-md-6">
1331 <label for="partnerGastEMail">E-Mail</label>
1332 <div class="autocomplete w-100">
1333 <input type="text" autocomplete="off" id="partnerGastEMail" name="partnerGastEMail"
1334 value="" class="form-control"
1335 placeholder="bitte die E-Mail eingeben" onblur="ensureNameFilled()">
1336 </div>
1337 </div>
1338 </div>
1339 <input type="hidden" id="activeRecordSet" name="activeRecordSet" value="${myRecord}">
1340 <input type="hidden" id="activeRecordCreationKey" name="activeRecordCreationKey"
1341 value="${myRecordCreationKey}"><br>
1342 </form>
1343 </div>
1344
1345 <script>
1346 autocomplete(document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']"), vorschlaege);
1347 </script>
1348
1349
1350 <#-- ---------------- Start Ausgabe der Optionen -->
1351
1352 <div class="rm-option-form">
1353 <p>
1354 <form id="rmOptionsForm">
1355 <#if optionsValue != "" >
1356 <#assign selectedOptions = optionsValue?eval>
1357 </#if>
1358 <#if options.getSiblings()?has_content>
1359 <#list options.getSiblings() as cur_options>
1360 <#if cur_options.getData()?replace("\\W", "", "r") != "">
1361
1362 <label for="${cur_options.getData()?replace("\\W", "", "r")}">${cur_options.getData()}</label>
1363 <br>
1364
1365 <select class="form-control"
1366 name="${cur_options.getData()?replace("\\W", "", "r")}"
1367 id="${cur_options.getData()?replace("\\W", "", "r")}"
1368 onblur="updateAttendanceButtons ('update')"
1369 <#if getterUtil.getBoolean(cur_options.multipleChoicePossible.getData())>
1370 multiple>
1371 <#else>
1372 >
1373 </#if>
1374 <option value="">--bitte eine Auswahl treffen--</option>
1375 <#if cur_options.optionAnswer.getSiblings()?has_content>
1376 <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer>
1377
1378 <#if optionsValue != "" >
1379 <#assign basis = cur_options.getData()?replace("\\W", "", "r") >
1380 <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") >
1381 </#if>
1382 <#-- ${selectedOptions.basis?seq_index_of("${suchstring}")} -->
1383 <#if cur_options_optionAnswer.getData()?replace("\\W", "", "r") != "">
1384 <option value="${cur_options_optionAnswer.getData()?replace("\\W", "", "r")}"
1385 <#if optionsValue != "" && selectedOptions[basis]?? >
1386 ${selectedOptions[basis]?seq_contains(suchstring)?string("selected", "")}
1387 </#if>
1388 >${cur_options_optionAnswer.getData()} </option>
1389 </#if>
1390
1391 </#list>
1392
1393 </#if>
1394 </select><br>
1395 </#if>
1396
1397 </#list>
1398 </#if>
1399
1400
1401 </form>
1402 </p>
1403 </div>
1404
1405
1406 <#-- Start Kommentarfeld -->
1407
1408 <div class="rm-comment-form">
1409
1410 <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 >
1411 <style>
1412
1413 form {
1414 width: 100%;
1415 }
1416
1417 label, textarea {
1418 width: 100%;
1419 font-size: 1em;
1420 }
1421
1422 textarea {
1423 resize: vertical;
1424 width: 100%;
1425 height: 200px;
1426 background: #F1F2F5;
1427 border: solid 1px #EAEBF0;
1428 border-radius: 5px;
1429 padding: 1em;
1430 font-size: 1em;
1431 color: black;
1432 }
1433
1434 </style>
1435
1436 <form id="rmCommentForm">
1437 <table width="100%">
1438 <tr><label>Anmerkungen</label></tr>
1439 <tr>
1440 <td><textarea id="participantComment"
1441 maxlength="${lionsEventDisplayModel.getCommentCharacterAmount()+5}"
1442 class="character-limit"
1443 placeholder="Eigene Anmerkungen... (max. ${lionsEventDisplayModel.getCommentCharacterAmount()} Zeichen)">${optionsComment}</textarea>
1444 </td>
1445 </tr>
1446 <tr>
1447 <td align="right"><label> <span
1448 class="counter">0</span>/${lionsEventDisplayModel.getCommentCharacterAmount()}
1449 </label></td>
1450 </tr>
1451 </table>
1452 </form>
1453
1454 <script>
1455 document.addEventListener('DOMContentLoaded', function () {
1456 document.querySelector('.character-limit').addEventListener('keyup', function (ev) {
1457 let input = document.querySelector('.character-limit');
1458 let limit = ${lionsEventDisplayModel.getCommentCharacterAmount()}; // Max. Anz. Zeichen
1459 let count = input.value.length;
1460 document.querySelector('.counter').innerHTML(count);
1461 if (count > limit) {
1462 input.setAttribute('style', 'background:red;color:white');
1463 } else {
1464 input.setAttribute('style', 'background:#F1F2F5;color:black');
1465 }
1466 });
1467 });
1468 </script>
1469
1470 <#else>
1471 <form id="rmCommentForm" hidden>
1472 <textarea id="participantComment"></textarea>
1473 </form>
1474
1475 </#if>
1476
1477 </div>
1478
1479 <#-- Ende Kommentarfeld -->
1480
1481
1482
1483 <#-- Optionen auslesen -->
1484
1485
1486 <script>
1487 var ${randomNamespace}optionsMap = ${jsonFactoryUtil.looseSerializeDeep( complex_options_map)};
1488 ${randomNamespace}res = JSON.parse(${randomNamespace}optionsMap);
1489 console.log(${randomNamespace}res);
1490
1491 var ${randomNamespace}gewOpt = "";
1492
1493
1494 function handleOptionsForm(tnOptionsForm) {
1495
1496 const data = new FormData(tnOptionsForm);
1497
1498 const formJSON = Object.fromEntries(data.entries());
1499 console.log(formJSON);
1500
1501 <#if options.getSiblings()?has_content>
1502 <#list options.getSiblings() as cur_options>
1503 <#if cur_options.getData()?replace("\\W", "", "r") != "">
1504 formJSON.${cur_options.getData()?replace("\\W", "", "r")} = data.getAll('${cur_options.getData()?replace("\\W", "", "r")}');
1505 </#if>
1506 </#list>
1507 </#if>
1508
1509 ${randomNamespace}gewOpt = JSON.stringify(formJSON, null, 2);
1510
1511 <#-- Handle Name fuer Partner und Gäste -->
1512 if (document.querySelector("div.anmeldenameFeld").hidden == false) {
1513 if (document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value == "") {
1514 alert("Bitte geben Sie den Namen des Partners / Gastes ein!");
1515 document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").focus();
1516 return false;
1517 }
1518 }
1519
1520 return true;
1521 }
1522
1523 </script>
1524
1525
1526 <#-- ------------ Ende Ausgabe der Optionen ----------------------- -->
1527
1528
1529 <#-- Zu- Absage Buttons -->
1530
1531 <#-- noch nichts ausgewählt -->
1532
1533 <#-- add update request Start -->
1534
1535 <script type="text/javascript">
1536
1537 var activeElement;
1538
1539 function sendAttendanceAddUpdateRequest(value, element) {
1540 <#if !anmeldungAbgelaufen>
1541 var ausgebucht = ${ausgebucht?string("true", "false")};
1542 var wirklichAusgebucht = ${wirklichAusgebucht?string("true", "false")};
1543 var vorReserviert = ${vorReserviert?string("true", "false")};
1544 var buchungErlaubt = true;
1545 <#if vorReserviert>
1546 var dateTimeVorReserviert = ${dateTimeVorReserviert?long};
1547 var reservierungsZeit_ms = ${reservierungsZeit_ms};
1548 var aktuelleZeit = Date.now();
1549 var zeitDifferenz = aktuelleZeit - dateTimeVorReserviert;
1550 var gueltigeReservierung = (zeitDifferenz < reservierungsZeit_ms);
1551 console.log("Zeitpunkt Vorreservierung: ", dateTimeVorReserviert);
1552 console.log("aktuelle Zeit: ", aktuelleZeit);
1553 console.log("zeitDifferenz: ", zeitDifferenz);
1554 console.log("Gueltige Reservierung: ", gueltigeReservierung);
1555
1556 if (!gueltigeReservierung || ausgebucht) {
1557 buchungErlaubt = false;
1558 }
1559
1560 </#if>
1561
1562 <#--
1563 console.log("Green Disabled", $('.attendance-submit-button.green').hasClass('disabled'));
1564 -->
1565 var greenDisabled = document.querySelector('.attendance-submit-button.green').classList.contains('disabled');
1566 var yellowDisabled = document.querySelector('.attendance-submit-button.yellow')?.classList.contains('disabled');
1567 var redDisabled = document.querySelector('.attendance-submit-button.red').classList.contains('disabled');
1568
1569 if (!greenDisabled && yellowDisabled && redDisabled) {
1570 buchungErlaubt = true;
1571 }
1572
1573 console.log("Buchung erlaubt", buchungErlaubt);
1574
1575 if (value === "ja" && !buchungErlaubt) {
1576 if (wirklichAusgebucht) {
1577 alert("Diese Veranstaltung ist ausgebucht.");
1578 window.location.reload(false);
1579 } else {
1580 alert("Zu dieser Veranstaltung sind derzeit keine weiteren Anmeldungen möglich, da alle verbliebenen Tickets für laufende Buchungsprozesse vorreserviert sind. Bitte versuchen Sie es später.");
1581 window.location.reload(false);
1582 }
1583
1584 } else {
1585 activeElement = element;
1586
1587 <#-- sicherstellen, dass die Optionen aktuell sind -->
1588 var rmOptionsForm = document.querySelector("div.rm-option-form form")
1589 var valid = handleOptionsForm(rmOptionsForm);
1590
1591 if (!valid) {
1592 // z.B. wenn kein Name angegeben wurde
1593 return false;
1594 }
1595
1596 var optTxt = ${randomNamespace}gewOpt;
1597 <#-- im Fall der Absage keine Optionen speichern -->
1598 if (value === "nein") {
1599 optTxt = "";
1600 }
1601 <#-- im Fall keine Optionen auch keine Optionen speichern -->
1602 if (optTxt === "{}") {
1603 optTxt = "";
1604 }
1605
1606
1607 var nameField = document.querySelector("div.anmeldenameFeld input[id='partnerGastName']");
1608 //console.log("nameField: ", nameField.value);
1609
1610 var partnerGastEMail = document.querySelector("div.anmeldenameFeld input[id='partnerGastEMail']");
1611 //console.log("partnerGastEMail: ", partnerGastEMail.value);
1612
1613 var activeRecordCreationKey = document.querySelector("div.anmeldenameFeld input[id='activeRecordCreationKey']");
1614 //console.log("activeRecordCreationKey: ", activeRecordCreationKey.value);
1615
1616 var participantComment = document.querySelector("div.rm-comment-form textarea[id='participantComment']");
1617 //console.log("participantComment: ", participantComment.value);
1618
1619 var recordIdField = document.querySelector("div.anmeldenameFeld input[id='activeRecordSet']");
1620 //console.log("recordIdField: ", recordIdField.value);
1621
1622
1623 if (parseInt(recordIdField.value) == 0) {
1624 Liferay.Service(
1625 '/ddl.ddlrecord/add-record',
1626 {
1627 groupId: ${groupId},
1628 recordSetId: ${recordSetId},
1629 displayIndex: 0,
1630 fieldsMap: JSON.stringify({
1631 "Veranstaltung": "${articleId}",
1632 "Name": nameField.value,
1633 "eMail": partnerGastEMail.value,
1634 "Teilnahme": value,
1635 "Optionen": optTxt,
1636 "Kommentar": participantComment.value,
1637 "Key": activeRecordCreationKey.value
1638 })
1639 },
1640 function (obj) {
1641 document.querySelectorAll('.attendance-submit-button').forEach(function (el) {
1642 el.classList.add('disabled')
1643 });
1644 activeElement?.classList.remove('disabled')
1645 console.log(obj);
1646
1647 <#-- @ G. Ortwein - dis ist neu -->
1648 <#-- Start Use local Storage -->
1649 <#-- Wenn der User nicht angemeldet ist, notwendige Anmeldedetails lokal speichern -->
1650
1651 <#if !themeDisplay.isSignedIn() >
1652
1653 localTnListItem = 'TNLIST${recordSetId}A${articleId}';
1654 localTnListNew = JSON.stringify({
1655 "tnListe": [{
1656 "tnId": obj.recordId,
1657 "Veranstaltung": "${articleId}",
1658 "Name": nameField.value,
1659 "eMail": partnerGastEMail.value,
1660 "Teilnahme": value,
1661 "Optionen": optTxt,
1662 "Kommentar": participantComment.value,
1663 "Key": activeRecordCreationKey.value
1664 }]
1665 });
1666
1667
1668 bisherigeTn = JSON.parse(localStorage.getItem(localTnListItem));
1669 neueTn = JSON.parse(localTnListNew);
1670
1671 if (bisherigeTn !== null) {
1672 for (i = 0; i < bisherigeTn.tnListe.length; i++) {
1673 neueTn.tnListe[i + 1] = bisherigeTn.tnListe[i];
1674 }
1675 }
1676 localStorage.setItem(localTnListItem, JSON.stringify(neueTn));
1677 </#if>
1678
1679 <#-- Ende Use local Storage -->
1680
1681 window.location.reload(false);
1682 }
1683 );
1684 } else {
1685 Liferay.Service(
1686 '/ddl.ddlrecord/update-record',
1687 {
1688 recordId: recordIdField.value,
1689 displayIndex: 0,
1690 fieldsMap: JSON.stringify({
1691 "Veranstaltung": "${articleId}",
1692 "Name": nameField.value,
1693 "eMail": partnerGastEMail.value,
1694 "Teilnahme": value,
1695 "Optionen": optTxt,
1696 "Kommentar": participantComment.value,
1697 "Essen": ""
1698 }),
1699 mergeFields: true
1700 },
1701 function (obj) {
1702 document.querySelectorAll('.attendance-submit-button').forEach(function (el) {
1703 el.classList.add('disabled')
1704 });
1705 activeElement?.classList.remove('disabled')
1706 console.log(obj);
1707 window.location.reload(false);
1708 }
1709 );
1710 }
1711 }
1712 <#else>
1713 alert("Die Anmledefrist für diese Veranstaltung ist abgelaufen.");
1714 window.location.reload(false);
1715 </#if>
1716
1717 }
1718
1719 </script>
1720
1721
1722 <#-- add update request Ende -->
1723
1724
1725 <#-- ausgabe der zu / absage Buttons -->
1726 <div class="visualisation-and-selection-attendance">
1727 <table>
1728 <tr>
1729 <td>
1730 <#-- ja -->
1731 <#if myRecord == 0 >
1732 <#if !ausgebucht && !anmeldungAbgelaufen>
1733 <div class="attendance-submit-button green"
1734 onclick="sendAttendanceAddUpdateRequest('ja', this)">
1735 <@clay["icon"] symbol="check"/>
1736 <#else>
1737 <div class="attendance-submit-button green disabled">
1738 <@clay["icon"] symbol="check"/>
1739 </div>
1740 </#if>
1741
1742 <#else>
1743 <#if entscheidung == "ja" >
1744 <div class="attendance-submit-button green"
1745 onclick="sendAttendanceAddUpdateRequest('ja', this)">
1746 <@clay["icon"] symbol="check"/>
1747 </div>
1748 <#else>
1749 <#if !ausgebucht && !anmeldungAbgelaufen>
1750 <div class="attendance-submit-button green disabled"
1751 onclick="sendAttendanceAddUpdateRequest('ja', this)">
1752 <@clay["icon"] symbol="check"/>
1753 </div>
1754 <#else>
1755 <div class="attendance-submit-button green disabled">
1756 <@clay["icon"] symbol="check"/>
1757 </div>
1758 </#if>
1759
1760 </#if>
1761 </#if>
1762
1763 </td>
1764 <#if ddlId.possibleRegistrationTypes?? && ddlId.possibleRegistrationTypes.getData()?has_content && ddlId.possibleRegistrationTypes.getData() == "jn" >
1765 <#else>
1766 <td>
1767 <#-- vielleicht -->
1768 <#if myRecord == 0 >
1769 <div class="attendance-submit-button yellow"
1770 onclick="sendAttendanceAddUpdateRequest('vielleicht', this)">
1771 <@clay["icon"] symbol="question-circle"/>
1772 </div>
1773 <#else>
1774 <#if entscheidung == "vielleicht" >
1775 <div class="attendance-submit-button yellow"
1776 onclick="sendAttendanceAddUpdateRequest('vielleicht', this)">
1777 <@clay["icon"] symbol="question-circle"/>
1778 </div>
1779 <#else>
1780 <div class="attendance-submit-button yellow disabled"
1781 onclick="sendAttendanceAddUpdateRequest('vielleicht', this)">
1782 <@clay["icon"] symbol="question-circle"/>
1783 </div>
1784 </#if>
1785 </#if>
1786 </td>
1787 </#if>
1788
1789 <td>
1790 <#-- nein -->
1791 <#if myRecord == 0 >
1792 <div class="attendance-submit-button red"
1793 onclick="sendAttendanceAddUpdateRequest('nein', this)">
1794 <@clay["icon"] symbol="times-small"/>
1795 </div>
1796 <#else>
1797 <#if entscheidung == "nein" >
1798 <div class="attendance-submit-button red"
1799 onclick="sendAttendanceAddUpdateRequest('nein', this)">
1800 <@clay["icon"] symbol="times-small"/>
1801 </div>
1802 <#else>
1803 <div class="attendance-submit-button red disabled"
1804 onclick="sendAttendanceAddUpdateRequest('nein', this)">
1805 <@clay["icon"] symbol="times-small"/>
1806 </div>
1807 </#if>
1808 </#if>
1809 </td>
1810 </table>
1811 </div>
1812
1813 <#-- Ende der Ausgabe der Zu-/Absage Buttons -->
1814
1815 <#-- TESTENDE -->
1816
1817 <#if wirklichAusgebucht>
1818 <div class="portlet-msg-alert">
1819 Diese Veranstaltung ist ausgebucht.
1820 </div>
1821 <#elseif ausgebucht>
1822 <div class="portlet-msg-alert">
1823 Zu dieser Veranstaltung sind derzeit keine weiteren Anmeldungen möglich, da alle
1824 verbliebenen Tickets für
1825 laufende Buchungsprozesse vorreserviert sind. Bitte versuchen Sie es später.
1826 </div>
1827 </#if>
1828
1829 <#if themeDisplay.isSignedIn() && !ausgebucht && !anmeldungAbgelaufen && (gaesteErlaubt || partnerErlaubt || (user.userId == articleAuthorId) ) >
1830 <hr>
1831 <p>
1832 <b>Zu diesem Termin können auch
1833 ${partnerErlaubt?string("Partner ", "")}
1834 ${(partnerErlaubt && gaesteErlaubt)?string("und ", "")}
1835 ${gaesteErlaubt?string("Gäste ", "")}
1836 ${(partnerErlaubt || gaesteErlaubt)?string("und ", "")}
1837 ${(user.userId == articleAuthorId)?string("weitere Teilnehmer", "")}
1838 angemeldet werden.</b>
1839
1840 <#if user.userId == articleAuthorId >
1841 <br>Als Ersteller dieses Termins können Sie zu diesem Termin auch Rückmeldungen weiterer Teilnehmer ergänzen, die diese nicht selbst eingeben.
1842 </#if>
1843 </p>
1844 <p>
1845 <form id="partnerGast">
1846 <button class="btn btn-secondary"
1847 type="button"
1848 onclick="updateEntryInputField ('div.anmeldenameFeld', '', '', '0','${myRecordCreationKey}', 'div.rm-option-form', '', 'div.visualisation-and-selection-attendance', 'all','div.rm-comment-form','')">
1849 ${(user.userId == articleAuthorId)?string("Teilnehmer", "")}${((user.userId == articleAuthorId)&&(partnerErlaubt || gaesteErlaubt))?string(", ", "")}
1850 ${partnerErlaubt?string("Partner ", "")}
1851 ${(partnerErlaubt && gaesteErlaubt)?string("oder ", "")}
1852 ${gaesteErlaubt?string("Gast ", "")}anmelden
1853 </button>
1854 </form>
1855 </p>
1856 </#if>
1857
1858
1859 <#if user.userId == articleAuthorId>
1860
1861 <#-- Rollen finden
1862 <#assign usrRoles = user.getRoles()>
1863
1864 <#list usrRoles as usrRole>
1865
1866 ${usrRole.getName()}<br>
1867
1868 </#list>
1869
1870 <#assign usrGroups = user.getGroups()>
1871
1872 <#list usrGroups as usrGroup>
1873
1874 ${usrGroup.getName()}<br>
1875
1876 </#list>
1877
1878 -->
1879 </#if>
1880
1881 <#if anzTeilnehmer gt 0>
1882
1883 <hr>
1884 <h3>Insgesamt ${anzTeilnehmer} Rückmeldungen</h3>
1885 <#if aktuellJa gt 0>
1886 <@clay["icon"] symbol="check"/> = ${aktuellJa}
1887 <#if anzTickets gt 0>
1888 von ${anzTickets}
1889 </#if>
1890
1891 </#if>
1892 <#if aktuellVielleicht gt 0>
1893 <@clay["icon"] symbol="question-circle"/> = ${aktuellVielleicht}
1894 </#if>
1895 <#if aktuellNein gt 0>
1896 <@clay["icon"] symbol="times-small"/> = ${aktuellNein}
1897 </#if>
1898 <p>
1899 </#if>
1900
1901
1902 <#-- hier benginnt die Liste -->
1903 <#if records?has_content>
1904
1905 <#-- Klären, ob der Betrachter der Seite der Teilnehmer sehen darf -->
1906 <#assign
1907 <#-- teilnehmer bereich nur anzeigen wenn eingeloggt && (admin || author || hat rückmeldung gegeben)-->
1908 <#-- teilnehmerAnzeigen = themeDisplay.isSignedIn() && (themeDisplay.getPermissionChecker().isCompanyAdmin() || themeDisplay.getUserId() == articleAuthorId || validator.isNotNull(lionsEventDisplayModel.getUserRegistrationStatus(themeDisplay.getUserId())))-->
1909 teilnehmerAnzeigen = lionsEventDisplayModel.showRegisteredUsersArea(themeDisplay)
1910 alleTeilnehmerAnzeigen = lionsEventDisplayModel.showAllRegisteredUsers(themeDisplay)
1911 >
1912
1913 <#assign
1914 listDownloadText = "Veranstaltung:;" + .vars['reserved-article-title'].data?url('ISO-8859-1') + "\r\n"?url('ISO-8859-1')
1915 listDownloadText = listDownloadText + "Datum:;" + lionsEventDisplayModel.getStartDateFormatted() + "\r\n"?url('ISO-8859-1')
1916 listDownloadText = listDownloadText + "Beginn:;" + lionsEventDisplayModel.getStartTimeFormatted() + "\r\n\r\n"?url('ISO-8859-1')
1917 />
1918
1919 <#-- @ G. Ortwein das ist neu -->
1920 <#-- Start Use local Storage -->
1921 <#-- Wenn der User nicht angemeldet ist, notwendige Anmeldedetails lokal speichern -->
1922
1923 <#if !teilnehmerAnzeigen && !alleTeilnehmerAnzeigen >
1924 <hr>
1925 <div id="weitereTnVorhanden"></div>
1926
1927 <script>
1928 localTnListItem = 'TNLIST${recordSetId}A${articleId}';
1929 bisherigeTn = JSON.parse(localStorage.getItem(localTnListItem));
1930
1931 if (bisherigeTn !== null) {
1932 ausgabeText = "<h3>Von diesem Gerät aus wurden bereits folgende Teilnehmer angemeldet:</h3><p><table style=\"width:100%\"><tr><td><b>Name</b></td><td><b>Rückmeldung</b></td><#-- <td><b>Ticket Nr.</b></td><td align=center><b>QR</b></td> --> <td align=center><nobr><i class=\"icon-ok\"><i class=\"icon-circle-blank\"><i class=\"icon-remove\"></nobr></td></tr>";
1933 for (i = 0; i < bisherigeTn.tnListe.length; i++) {
1934 ausgabeText = ausgabeText + "<tr><td>" + bisherigeTn.tnListe[i].Name + "</td>";
1935
1936 <#--
1937 ausgabeText = ausgabeText + "<td>" + bisherigeTn.tnListe[i].tnId +"</td>";
1938 ausgabeText = ausgabeText + "<td align=center><div class=\"QR" +bisherigeTn.tnListe[i].tnId+ "\" onclick='showQRcode(" +bisherigeTn.tnListe[i].tnId+",\""+ bisherigeTn.tnListe[i].Name + "\")'><i class=\"fas fa-qrcode\"></i></div></i></td>";
1939 -->
1940
1941 <#-- @ G. Ortwein - das müsste iregendwie schöner gehen...
1942 mir fiel aber ichts besseres ein -->
1943
1944 ausgabeOptText = "<td><small>";
1945
1946 if (bisherigeTn.tnListe[i].Optionen != "") {
1947 rO = JSON.parse(bisherigeTn.tnListe[i].Optionen);
1948
1949 <#if options.getSiblings()?has_content>
1950 <#list options.getSiblings() as cur_options>
1951 <#if cur_options.getData() !="">
1952 <#assign basis = cur_options.getData()?replace("\\W", "", "r") >
1953 ausgabeOptText += "<b>${cur_options.getData()}:</b>";
1954 selectedOptions = JSON.stringify(rO, ["${basis}"], 0);
1955
1956 if (selectedOptions != "{}") {
1957 selectedOptionsObj = JSON.parse(selectedOptions);
1958 var anzSelOpt = 0;
1959 <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer>
1960 <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") >
1961 if (selectedOptionsObj.${basis}.includes("${suchstring}")) {
1962 if (anzSelOpt > 0) {
1963 ausgabeOptText += " |";
1964 }
1965 ausgabeOptText += " ${cur_options_optionAnswer.getData()}";
1966 anzSelOpt += 1;
1967 }
1968
1969
1970 </#list>
1971 }
1972
1973 if (bisherigeTn.tnListe[i].Kommentar != "") {
1974 ausgabeOptText += "<br>";
1975 ausgabeOptText += "<b>Anmerkungen:</b>";
1976 ausgabeOptText += bisherigeTn.tnListe[i].Kommentar;
1977 }
1978
1979 ausgabeOptText += "<br>";
1980 </#if>
1981 </#list>
1982 </#if>
1983
1984
1985 }
1986 ausgabeOptText += "</small></td>";
1987
1988 ausgabeText += ausgabeOptText;
1989
1990 ausgabeText = ausgabeText + "<td align=\"center\" valign=\"center\">";
1991 if (bisherigeTn.tnListe[i].Teilnahme == "ja") {
1992 ausgabeText = ausgabeText + "<div class=\"attendance-visual green\">";
1993 ausgabeText = ausgabeText + "<@clay["icon"] symbol="check"/>";
1994 ausgabeText = ausgabeText + "</div>";
1995 }
1996
1997 if (bisherigeTn.tnListe[i].Teilnahme == "vielleicht") {
1998 ausgabeText = ausgabeText + "<div class=\"attendance-visual yellow\">";
1999 ausgabeText = ausgabeText + "<@clay["icon"] symbol="question-circle"/>";
2000 ausgabeText = ausgabeText + "</div>";
2001 }
2002
2003 if (bisherigeTn.tnListe[i].Teilnahme == "nein") {
2004 ausgabeText = ausgabeText + "<div class=\"attendance-visual red\">";
2005 ausgabeText = ausgabeText + "<@clay["icon"] symbol="times-small"/>";
2006 ausgabeText = ausgabeText + "</div>";
2007 }
2008 ausgabeText = ausgabeText + "</td></tr>";
2009 }
2010 ausgabeText = ausgabeText + "</table></p><p> </p>";
2011
2012 document.getElementById("weitereTnVorhanden").innerHTML = ausgabeText;
2013 }
2014 </script>
2015 </#if>
2016
2017 <#-- Ende Use local Storage -->
2018
2019 <#if teilnehmerAnzeigen || alleTeilnehmerAnzeigen >
2020 <hr>
2021 <table width=100%>
2022 <tr style="border-bottom: 2px solid #ddd;">
2023 <td align="left" width="30%"><b>Name</b></td>
2024 <#assign listDownloadText = listDownloadText + "Name;" >
2025 <td align="left" width="50%"><b>Rückmeldung</b></td>
2026 <#assign listDownloadText = listDownloadText + "Zeitpunkt der Rückmeldung;"?url('ISO-8859-1') >
2027 <#-- Überschriften der Excel Tabelle Dynamisch ergänzen -->
2028 <#if options.getSiblings()?has_content>
2029 <#list options.getSiblings() as cur_options>
2030 <#if cur_options.getData() != "" >
2031 <#assign listDownloadText = listDownloadText + cur_options.getData()?url('ISO-8859-1') + ";" >
2032 </#if>
2033 </#list>
2034 </#if>
2035 <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 >
2036 <#assign listDownloadText = listDownloadText + "Anmerkungen;" >
2037 </#if>
2038 <#-- Ende Überschriften dynamisch ergänzen -->
2039
2040 <td align="center" width="10%">
2041 <b>
2042 <nobr><@clay["icon"] symbol="check"/><@clay["icon"] symbol="question-circle"/>
2043 <@clay["icon"] symbol="times-small"/>
2044 </nobr>
2045 </b>
2046 </td>
2047
2048 <td align="center" width="10%"></td>
2049
2050 </tr>
2051 <#assign listDownloadText = listDownloadText + "Zu-/Absage\r\n"?url('ISO-8859-1') >
2052
2053 <#list records as cur_record>
2054 <#attempt>
2055 <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) >
2056 <#if (themeDisplay.getUserId() == articleAuthorId) || (themeDisplay.getUserId() == cur_record.userId) || alleTeilnehmerAnzeigen >
2057 <#if cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) != "res" >
2058 <tr style="border-bottom: 1px solid #ddd;">
2059 <#-- <td>${cur_record}</td> -->
2060 <#-- <td>${cur_record.recordId}</td> -->
2061 <td valign="center">
2062 <#assign partnerGuestName = "" >
2063 <#assign partnerGastEMail = "" >
2064 <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" && (user.userId == cur_record.userId)>
2065 <#assign partnerGuestRecord = true >
2066 <#assign partnerGuestName = cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) >
2067 <#if cur_record.getDDMFormFieldValues("eMail")??>
2068 <#assign partnerGastEMail = cur_record.getDDMFormFieldValues("eMail")?first.getValue().getString(locale) >
2069 </#if>
2070
2071 ${cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)}
2072 <#assign listDownloadText = listDownloadText + cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)?url('ISO-8859-1')>
2073 <#else>
2074 <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "">
2075 ${cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)}
2076 <#assign listDownloadText = listDownloadText + cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)?url('ISO-8859-1')>
2077 <#else>
2078 ${cur_record.userName}
2079 <#assign listDownloadText = listDownloadText + cur_record.userName?url('ISO-8859-1') >
2080 </#if>
2081 <#assign partnerGuestRecord = false >
2082 </#if>
2083 <#assign listDownloadText = listDownloadText + ";" >
2084 </td>
2085 <td valign="center">
2086 <#--${cur_record.modifiedDate?string["dd.MM.yyyy HH:mm"]}h -->
2087 <#assign listDownloadText = listDownloadText + cur_record.modifiedDate?string["dd.MM.yyyy HH:mm"]?url('ISO-8859-1') + "h" >
2088 <#assign listDownloadText = listDownloadText + ";" >
2089
2090
2091
2092 <#-- Entscheidung auslesen -->
2093
2094 <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) >
2095
2096
2097 <#assign recordCreationKey ="" >
2098 <#assign comment = "">
2099 <#if cur_record.getDDMFormFieldValues("Key")?? >
2100 <#assign recordCreationKey = cur_record.getDDMFormFieldValues("Key")?first.getValue().getString(locale) >
2101 </#if>
2102
2103 <#if cur_record.getDDMFormFieldValues("Kommentar")?? >
2104 <#assign comment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale)?js_string >
2105 </#if>
2106 <script>
2107 var jsComment${cur_record.recordId} = "${comment}";
2108 </script>
2109
2110
2111 <#-- Start Ausgabe der gewählten Optionen -->
2112 <small>
2113 <#if cur_record.getDDMFormFieldValues("Optionen")?? >
2114 <#assign optionsValue = cur_record.getDDMFormFieldValues("Optionen")?first.getValue().getString(locale) >
2115 <#else>
2116 <#assign optionsValue = "" >
2117 </#if>
2118 <#if optionsValue != "" >
2119 <#assign selectedOptions = optionsValue?eval>
2120 </#if>
2121 <#if options.getSiblings()?has_content>
2122 <#list options.getSiblings() as cur_options>
2123 <#if (entscheidung != "nein") && (cur_options.getData() !="") >
2124 <b>${cur_options.getData()}:</b>
2125 <#if cur_options.optionAnswer.getSiblings()?has_content>
2126 <#assign anzCurOpt = 0 >
2127 <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer>
2128 <#if optionsValue != "" >
2129 <#assign basis = cur_options.getData()?replace("\\W", "", "r") >
2130 <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") >
2131 </#if>
2132 <#if optionsValue != "" && selectedOptions[basis]??>
2133 <#if selectedOptions[basis]?seq_contains(suchstring)>
2134 <#if anzCurOpt != 0 >
2135 <#assign listDownloadText = listDownloadText + " | " >
2136 |
2137 </#if>
2138 ${cur_options_optionAnswer.getData()}
2139 <#assign listDownloadText = listDownloadText + cur_options_optionAnswer.getData()?url('ISO-8859-1') >
2140 <#assign anzCurOpt++ >
2141 </#if>
2142 </#if>
2143 </#list>
2144 </#if>
2145 <br>
2146
2147 </#if> <#-- (entscheidung != "nein") && (cur_options.getData() !="") -->
2148 <#assign listDownloadText = listDownloadText + ";" >
2149 </#list>
2150 </#if>
2151 </small>
2152
2153
2154 <#-- Ende Ausgabe der gewählten Optionen -->
2155
2156 <#-- Ausgabe Kommentar -->
2157
2158 <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 && cur_record.getDDMFormFieldValues("Kommentar")?? >
2159 <#assign optionsComment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale) >
2160 <#else>
2161 <#assign optionsComment = "" >
2162 </#if>
2163
2164 <#if optionsComment != "" >
2165 <small>
2166 <b>Anmerkungen:</b>
2167 ${optionsComment}
2168 </small>
2169
2170 </#if>
2171 <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 >
2172 <#assign listDownloadText += "\\\"" >
2173 <#assign optionsCommentSafe = optionsComment?replace("\"","\"\"")?url('ISO-8859-1') >
2174 <#assign listDownloadText += optionsCommentSafe >
2175 <#assign listDownloadText += "\\\"" >
2176 <#assign listDownloadText += ";" >
2177 </#if>
2178
2179
2180 <#-- Ende Ausgabe KOmentar -->
2181
2182 </td>
2183
2184 <td align="center" valign="center">
2185
2186
2187 <#if entscheidung == "ja" >
2188 <div class="attendance-visual green">
2189 <@clay["icon"] symbol="check"/>
2190 </div>
2191 <#assign listDownloadText = listDownloadText + "ja;" >
2192 <#elseif entscheidung == "vielleicht" >
2193 <div class="attendance-visual yellow">
2194 <@clay["icon"] symbol="question-circle"/>
2195 </div>
2196 <#assign listDownloadText = listDownloadText + "vielleicht;" >
2197 <#elseif entscheidung == "nein" >
2198 <div class="attendance-visual red">
2199 <@clay["icon"] symbol="times-small"/>
2200 </div>
2201 <#assign listDownloadText = listDownloadText + "nein;" >
2202 </#if>
2203
2204 <#assign listDownloadText = listDownloadText + ";" >
2205 </td>
2206
2207 <td align="center" valign="center">
2208 <#-- <#if partnerGuestRecord == true> -->
2209 <#if user.userId == cur_record.userId >
2210
2211 <#-- optionsValueString Anführungszeichen ersetzen, da
2212 Freemarker sonst einen nicht kontrollierbaren Output Recoding Fehler macht
2213 Ein Punkt "." ist ok, da der String keine Sonderteichen enthalten kann-->
2214 <#assign optionsValueString = optionsValue?replace("\"",".")?replace("\\s+","","r") >
2215
2216 <div class="attendance-edit-button"
2217 onclick="updateEntryInputField ('div.anmeldenameFeld', '${partnerGuestName}','${partnerGastEMail}', '${cur_record.recordId}','${recordCreationKey}', 'div.rm-option-form',
2218 '${optionsValueString}', 'div.visualisation-and-selection-attendance', '${entscheidung}','',jsComment${cur_record.recordId}
2219 )">
2220 <@clay["icon"] symbol="pencil" cssClass="p-1"/>
2221 </div>
2222
2223 </#if>
2224 </td>
2225 <#assign listDownloadText = listDownloadText + "\r\n"?url('ISO-8859-1') >
2226 </tr>
2227 </#if> <#-- kein Reservierungs Datensatz -->
2228
2229 </#if>
2230
2231 </#if>
2232 <#recover>
2233 </#attempt>
2234 </#list>
2235 </table>
2236
2237 <#-- CSV Download der Teilnhemer -->
2238
2239
2240 <hr><p><b>Hier können Sie die Teilnehmerliste herunterladen:</b></p>
2241 <p>
2242 <input type="button" id="${articleId}_listeDownloadButton" class="btn btn-secondary"
2243 value="Teilnehmerliste laden"/>
2244 </p>
2245 <#if !(alleTeilnehmerAnzeigen || (user.userId == articleAuthorId))>
2246 <p><small>Anmerkung: Auf Grund der DSGVO können Sie nur solche Teilnehmer sehen und
2247 herunterladen,
2248 die Sie selbst eingegeben haben.<br>Weitere Teilnehmer sehen Sie nur, wenn das bei der
2249 Veranstaltung explizit erlaubt ist.</small></p>
2250 <#else>
2251 <p><small>Hinweis zur DSGVO: Der Organisator hat festgelegt, dass Sie die vollstädige
2252 Teilnehmerliste einsehen können.<br>Bitte gehen Sie entsprechend sorgfältig
2253 und
2254 entsprechend der DSGVO mit den bereitgestellten Daten um.</small></p>
2255 </#if>
2256 </#if>
2257 </div>
2258
2259 <script type="text/javascript">
2260 function downloadListe(filename, text) {
2261 var element = document.createElement('a');
2262 //element.setAttribute('href', 'data:application/csv,' + encodeURIComponent(text));
2263 element.setAttribute('href', 'data:text/comma-separated-values,' + text);
2264 element.setAttribute('download', filename);
2265
2266 element.style.display = 'none';
2267 document.body.appendChild(element);
2268
2269 element.click();
2270
2271 document.body.removeChild(element);
2272 }
2273
2274 // Start Teilnehmerliste download.
2275 document.getElementById("${articleId}_listeDownloadButton").addEventListener("click", function () {
2276 var filename = encodeURIComponent("Teilnehmer-Event-${.vars['reserved-article-id'].data}" + ".csv");
2277 downloadListe(filename, "${listDownloadText}");
2278 }, false);
2279 </script>
2280 <#-- ENDE CSV Download der Teilnhemer -->
2281
2282 </#if>
2283
2284 </#if>
2285
2286 <#-- hier endet die Liste -->
2287
2288
2289 <#-- ics Download script -->
2290
2291 <script type="text/javascript">
2292
2293 beautyNavUrl = makeNavUrl("${location.getData()?replace("\"", "'")?replace("\r", " ")?replace("\n", " ")}", "${location.streetAndNumber.getData()}", "${location.zip.getData()}", "${location.city.getData()}", "${location.country.getData()}");
2294
2295 document.getElementById("Veranstaltungsort").innerHTML = beautyNavUrl;
2296
2297 </script>
Lions Cookie Disclaimer
Cookie-Einstellungen
Auf unserer Webseite setzen wir Cookies ein, um Informationen über Ihren Besuch zu speichern.
Cookies, darunter die von Drittanbietern, helfen uns, unsere Website zu verbessern, um Ihren Besuch auf unserer Webseite zum einen so komfortabel wie möglich zu gestalten, und zum anderen Ihnen auf Ihre Interessen zugeschnittene Angebote zu unterbreiten.
Detaillierte Informationen zu unserem Einsatz von Cookies erhalten Sie durch einen Klick auf „Details anzeigen“ oder in unserer Datenschutzerklärung – hier geben wir Ihnen auch Hinweise, wie Sie die Einstellungen gemäß Ihren Vorstellungen verwalten können. Unsere Kontaktdaten finden Sie im Impressum.
Notwendig
Diese Cookies sind für den Betrieb der Seite unbedingt notwendig.
Externe Inhalte
Diese Option ermöglicht es Ihnen, extern eingebundene Inhalte z.B. von Youtube unmittelbar abrufen zu können.