Weihnachtsfeier - 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 el.onclick = function() {sendAttendanceAddUpdateRequest('res', this)};
464 el.innerHTML ='<@clay["icon"] symbol="trash"/>';
465 });
466 }
467
468 if (decision !== "nein") {
469 document.querySelectorAll(".attendance-submit-button.red").forEach(function (el) {
470 el.onclick = function() {sendAttendanceAddUpdateRequest('nein', this)};
471 el.innerHTML ='<@clay["icon"] symbol="times-small"/>';
472 });
473 }
474
475
476 if (decision === "all") {
477 document.querySelectorAll(".attendance-submit-button.green").forEach(function (el) {
478 el.classList.remove('disabled');
479 });
480 document.querySelectorAll(".attendance-submit-button.yellow").forEach(function (el) {
481 el.classList.remove('disabled');
482 });
483 document.querySelectorAll(".attendance-submit-button.red").forEach(function (el) {
484 el.classList.remove('disabled');
485 });
486 }
487 }
488
489 function ensureNameFilled() {
490 document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value = document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value.trim().replaceAll(/(\s\s\s*)/g, ' ');
491 if (document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value == "") {
492 document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").focus();
493 } else {
494 var guestName = document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value;
495 console.log(guestName);
496 var indexOfGuestName = jsListeNamen.indexOf(guestName);
497 console.log(indexOfGuestName);
498 var guestEMail = "";
499 if (indexOfGuestName >= 0) {
500 guestEMail = jsListeEMail[indexOfGuestName];
501 }
502 console.log(guestEMail);
503
504 var guestEMailField = document.querySelector("div.anmeldenameFeld form input[name='partnerGastEMail']");
505 if (guestEMailField.value == "") {
506 guestEMailField.value = guestEMail;
507 }
508
509 }
510
511 updateAttendanceButtons('update');
512 }
513
514
515 function icsDownload${namespace}() {
516 var filename = encodeURIComponent("Kalender-${themeDisplay.getLayout().getGroup().getName(locale)?replace(" ", "_")?js_string}" + ".ics");
517 var icaldata = '${icsString?js_string}';
518 downloadIcsFile(filename, icaldata);
519 }
520
521 function downloadIcsFile(filename, text) {
522 var element = document.createElement('a');
523 element.setAttribute('href', 'data:text/calendar;charset=utf-8,' + encodeURIComponent(text));
524 element.setAttribute('download', filename);
525
526 element.style.display = 'none';
527 document.body.appendChild(element);
528
529 element.click();
530
531 document.body.removeChild(element);
532 }
533</script>
534
535
536<#-- --------------------------------- -->
537
538
539<#macro renderImage
540image
541>
542 <#if image.getData()?has_content>
543
544 <@addFrescoImageUrl image.getData() />
545
546 <#assign
547 imageCssClass = "img-fluid crop-center position-absolute h-100 w-100"
548 fileVersion = lionsImageService.getFileVersionFromWebContentString(image.data)!""
549 />
550
551 <div class="image-wrapper aspect-ratio aspect-ratio-3-to-2 w-100">
552 <#if fileVersion?? && fileVersion?has_content>
553 <@adaptive_media_image["img"]
554 fileVersion=fileVersion
555 class=imageCssClass
556 alt=image.alt.getData()
557 data\-image\-id=getNextId() />
558 <#else>
559 <img class="${imageCssClass}"
560 src="${image.getData()}" alt="${image.alt.getData()}"
561 data-image-id="${getNextId()}">
562 </#if>
563 </div>
564 <@renderImageCaption image/>
565 </#if>
566</#macro>
567
568<#macro renderSlider
569images
570showArrows=true
571>
572 <div class="swiper-navigation-wrapper">
573 <div class="swiper-button-next"></div>
574 <div class="swiper-button-prev"></div>
575 </div>
576
577 <div class="swiper swiper-container swiper-container-${namespace} h-100">
578 <div class="swiper-wrapper">
579 <#list images as cur_image>
580
581 <@addFrescoImageUrl cur_image.getData() />
582
583 <#assign
584 imageCssClass = "position-absolute img-fluid w-100 h-100 crop-center"
585 imageAlt = cur_image.alt?has_content?then(cur_image.alt.getData(), '')
586 fileVersion = lionsImageService.getFileVersionFromWebContentString(cur_image.data)!""
587 />
588
589 <div class="swiper-slide ${cur_image?is_first?then('active', '')}">
590 <div class="aspect-ratio aspect-ratio-3-to-2">
591 <#if fileVersion?? && fileVersion?has_content>
592 <@adaptive_media_image["img"]
593 fileVersion=fileVersion
594 class=imageCssClass
595 alt=imageAlt
596 data\-image\-id=getNextId() />
597 <#else>
598 <img class="${imageCssClass}"
599 src="${cur_image.getData()}"
600 alt="${imageAlt}"
601 data-image-id="${getNextId()}">
602 </#if>
603 </div>
604 <@renderImageCaption cur_image />
605 </div>
606 </#list>
607 </div>
608 <#-- Add Pagination -->
609 <div class="swiper-pagination"></div>
610 <#-- Add Arrows -->
611 </div>
612
613 <script type="module">
614 import Swiper from '/o/lions-js-module-loader/third-party/swiper.min.js';
615
616 function initSwiper${namespace}(selector, showArrows) {
617 let config =
618 {
619 slidesPerView: 'auto',
620 centeredSlides: true,
621 loop: true,
622 spaceBetween: 30,
623 speed: 1200,
624 pagination: {
625 el: '.swiper-pagination',
626 clickable: true,
627 },
628 };
629
630 if (showArrows) {
631 config.navigation = {
632 nextEl: '.swiper-button-next',
633 prevEl: '.swiper-button-prev',
634 };
635 }
636
637 new Swiper(selector, config);
638 }
639
640 initSwiper${namespace}('.swiper-container-${namespace}', ${showArrows?c});
641 </script>
642</#macro>
643
644<#macro renderImageCaption
645image
646>
647 <#assign
648 imageCaption = (image.caption?? && image.caption.getData()?has_content)?then(image.caption.getData(), "")
649 imageSource = (image.source?? && image.source.getData()?has_content)?then(image.source.getData(), "")
650 />
651
652 <#if imageCaption?has_content || imageSource?has_content>
653 <div class="image-caption">
654 <#if imageCaption?has_content || imageSource?has_content>
655 ${imageCaption}
656 </#if>
657 <#if imageCaption?has_content || imageSource?has_content>
658 <span class="px-1">|</span>
659 </#if>
660 <#if imageSource?has_content>
661 ${imageSource}
662 </#if>
663 </div>
664 </#if>
665</#macro>
666
667<#function getNextId >
668 <#assign imgCntr = imgCntr + 1>
669 <#return imgCntr>
670</#function>
671
672<#macro addFrescoImageUrl url >
673 <#assign imageUrlArray = imageUrlArray + [url] />
674</#macro>
675
676<#function randomNumber salt>
677 <#local str= .now?long />
678 <#assign str = (str * salt)/3 />
679 <#return str[(str?string?length-5)..]/>
680</#function>
681
682<#-- Hier beginnt die Ausgabe des Veranstaltungshinweises -->
683
684<div class="container lions-event event-${articleId} lions-report lions-report-${articleId} mt-4">
685 <div class="headline row justify-content-center pb-2">
686 <div class="col-md-7">
687 <div class="row align-items-center">
688 <div class="col">
689 <h1>${.vars['reserved-article-title'].data}</h1>
690 </div>
691 <div class="col-auto">
692 <button onclick="javascript:icsDownload${namespace}();"
693 class="btn btn-primary btn-sm" type="button">
694 <i class="far fa-calendar-alt"></i> <i class="ml-1 fas fa-cloud-download-alt"></i>
695 </button>
696 </div>
697 </div>
698 </div>
699 </div>
700
701 <#-- Zunächst erfolgt die Ausgabe der Termingrunddaten wie Datum, Ort und Zeit in einer Tabelle -->
702
703 <div class="content row justify-content-center">
704 <div class="col-md-7">
705 <div class="row" style="font-weight: bold">
706 <div class="col">
707 <div class="row">
708 <div class="col">
709 Datum: ${lionsEventDisplayModel.getStartDateFormatted()}
710 </div>
711 </div>
712
713 <#if lionsEventDisplayModel.isDisplayStartTime() >
714 <div class="row">
715 <div class="col">
716 Beginn: ${lionsEventDisplayModel.getStartTimeFormatted()}
717 </div>
718 </div>
719 </#if>
720
721 <#if lionsEventDisplayModel.isDisplayEndTime() && lionsEventDisplayModel.isDisplayEndDate() >
722 <div class="row">
723 <div class="col">
724 Ende: ${lionsEventDisplayModel.getEndDateTimeFormatted()}
725 </div>
726 </div>
727 <#elseif lionsEventDisplayModel.isDisplayEndTime()>
728 <div class="row">
729 <div class="col">
730 Ende: ${lionsEventDisplayModel.getEndTimeFormatted()}
731 </div>
732 </div>
733 </#if>
734
735 <#if lionsEventDisplayModel.isDisplayDoorsOpenTime() >
736 <div class="row">
737 <div class="col">
738 Einlass: ${lionsEventDisplayModel.getDoorsOpenTimeFormatted()}
739 </div>
740 </div>
741 </#if>
742
743 <#if lionsEventDisplayModel.isDisplayRegistrationUntilDate() >
744 <div class="row">
745 <div class="col">
746 Anmeldeschluß:
747 <nobr>${lionsEventDisplayModel.getRegistrationAllowedUntilDateTimeFormatted()}</nobr>
748 </div>
749 </div>
750 </#if>
751
752 <#if lionsEventDisplayModel.isRegistrationDateReached() >
753 <div class="row">
754 <div class="col">
755 Anmeldung abgelaufen
756 </div>
757 </div>
758 </#if>
759 </div>
760 <div class="col-auto text-right">
761 <div id="Veranstaltungsort">
762 ${lionsEventDisplayModel.getLocationName()}<br>
763 ${lionsEventDisplayModel.getStreetAndNumber()}<br>
764 ${lionsEventDisplayModel.getZipCode()} ${lionsEventDisplayModel.getCity()}<br>
765 </div>
766 <#if validator.isNotNull(lionsEventDisplayModel.getOnlineUri()) >
767 <div id="OnlineUri" class="pt-2">
768 <a href="${lionsEventDisplayModel.getOnlineUri()}">Online teilnehmen...</a>
769 </div>
770 </#if>
771 </div>
772 </div>
773
774 <#-- Piktogramme und Text für zulässige Optionen anzeigen -->
775 <#if lionsEventDisplayModel.isPartner() >
776 <div class="row">
777 <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;">
778 <@clay["icon"] symbol="user"/>
779 </div>
780 <div class="col">mit Partnern</div>
781 </div>
782 </#if>
783 <#if lionsEventDisplayModel.isGuests() >
784 <div class="row">
785 <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;">
786 <@clay["icon"] symbol="users"/>
787 </div>
788 <div class="col">mit Gästen</div>
789 </div>
790 </#if>
791
792 <#if lionsEventDisplayModel.isFood() >
793 <div class="row">
794 <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;">
795 <i class="fas fa-utensils"></i>
796 </div>
797 <div class="col">mit mit Essen</div>
798 </div>
799 </#if>
800
801 <#if anzTickets gt 0>
802 <div class="row">
803 <div class="pl-4 ml-n1 pr-0 col-auto text-center" style="width: 50px;">
804 <b>#</b><@clay["icon"] symbol="user"/>
805 </div>
806 <div class="col">Maximal ${anzTickets} Teilnehmer</div>
807 </div>
808 </#if>
809 </div>
810 </div>
811
812 <#-- Inhalte des Termins und Einladungstext ausgeben -->
813 <#-- Hier begnnt die Ausgabe der Berichts - Kompatiblen Inhalte von Prodyne _Relaunch_Bericht übernommen -->
814
815 <#if validator.isNotNull(lionsEventDisplayModel.getTeaserText(false)) >
816 <div class="abstract row justify-content-center pt-2">
817 <div class="col-md-7">
818 ${lionsEventDisplayModel.getTeaserText(false)}
819 </div>
820 </div>
821 </#if>
822
823 <!-- Images -->
824 <#if images.getSiblings()?size gt 0 >
825 <@liferay_util["html-top"]>
826 <meta name="image" property="og:image" content="${images.getSiblings()[0].getData()}">
827 </@>
828
829 <#if images.getSiblings()?size gt 1 >
830 <div class="row justify-content-center pt-3">
831
832 <div class="col-md-9 slider-col">
833 <@renderSlider
834 images=images.getSiblings()
835 />
836 </div>
837 </div>
838 <#elseif images.getSiblings()[0].getData()?has_content >
839 <div class="row justify-content-center pt-3">
840 <div class="col-md-9">
841 <@renderImage
842 image=images.getSiblings()[0]
843 />
844 </div>
845 </div>
846 </#if>
847 </#if>
848
849
850 <div class="content row justify-content-center">
851 <div class="col-md-7">
852 <p>${lionsEventDisplayModel.getContent()}</p>
853 </div>
854 </div>
855
856 <link rel="stylesheet" type="text/css" href="${themeDisplay.getPathThemeCss()}/fresco.css"/>
857
858 <script type="module">
859 import Fresco from '/o/lions-js-module-loader/third-party/fresco.js';
860
861 function getThumbnailUrl(url) {
862 let pattern = new RegExp("(\\?|\\&)(imageThumbnail=).*?(&|$)");
863
864 if (url && url.search(pattern) >= 0) {
865 url = url.replace(pattern, "$1$3");
866 }
867 return url + ((url.indexOf('?') > -1) ? '&imageThumbnail=1' : '?imageThumbnail=1');
868 }
869
870 function createImageElement(url) {
871 let imageElement = {};
872 imageElement.url = url;
873 imageElement.options = {};
874 imageElement.options.thumbnail = getThumbnailUrl(url);
875 return imageElement;
876 }
877
878
879 let imageUrls = [<#list imageUrlArray as imageElement>'${imageElement}', </#list>]
880 let frescoImages = [];
881 imageUrls.forEach(url => frescoImages.push(createImageElement(url)));
882
883 // lightbox start
884 document.querySelectorAll('.lions-report-${articleId} img').forEach(function (img) {
885 img.addEventListener('click', () => {
886 Fresco.show(frescoImages, $(this).data('image-id'));
887 });
888 });
889 document.querySelector('.lions-report-${articleId}').classList.add('lightbox');
890 // lightbox end
891 </script>
892
893 <#-- Hier Endet die Ausgabe der Berichts - Kompatiblen Inhalte von Prodyne _Relaunch_Bericht übernommen -->
894
895 <div class="abstract row justify-content-center pt-2">
896 <div class="col-md-7">
897 <p>
898 <#if validator.isNotNull(organizer.getData())>
899
900 <b><i>
901
902 Veranstalter: ${organizer.getData()} ${organizer.orgStreetAndNumber.getData()} ${organizer.orgZip.getData()} ${organizer.orgCity.getData()}</i></b>
903
904 </#if>
905 </p>
906 <p><i>Online gestellt von: ${.vars['reserved-article-author-name'].data}<br>
907
908 <#assign DatumModified_Data = .vars['reserved-article-modified-date'].data>
909
910 <#if validator.isNotNull(DatumModified_Data)>
911 <#assign DatumModified_DateObj = dateUtil.parseDate("EE, dd MMM yyyy HH:mm:ss Z", DatumModified_Data, locale)>
912 Letzte
913 Änderung: ${dateUtil.getDate(DatumModified_DateObj, "EE, d. MMM yyyy HH:mm", locale, themeDisplay.getTimeZone())}
914 </i></p>
915 </#if>
916 </div>
917 </div>
918
919
920 <#if recordSetId != 0 >
921
922
923
924 <#-- Record Set auswählen -->
925
926
927 <#-- start add reservation record -->
928
929 <#-- sofern die Teilnehmerzahl begrenzt ist, Buchung vorreservieren -->
930 <#if begrenzteTeilnemerzahl >
931
932 <#assign dateTimeVorReserviert = .now?datetime?long >
933
934 <#assign reservationFormValues = {"Veranstaltung":"${articleId}","Name":"","Teilnahme": "res","Optionen":""} >
935
936 <#--<#assign newDDLRecord = ddlRecordLocalService.addRecord(user.userId, groupId, recordSetId, 0, reservationFormValues, serviceContext) >-->
937
938 <#assign vorReserviert = true >
939
940 <script>
941 Liferay.Service(
942 '/ddl.ddlrecord/add-record',
943 {
944 groupId: ${groupId},
945 recordSetId: ${recordSetId},
946 displayIndex: 0,
947 fieldsMap: JSON.stringify({
948 "Veranstaltung": "${articleId}",
949 "Name": '',
950 "eMail": '',
951 "Teilnahme": 'res',
952 "Optionen": '',
953 })
954 },
955 function (obj) {
956
957 }
958 );
959 </script>
960 </#if>
961
962 <#-- end add reservation record -->
963
964
965
966 <#assign records = ddlRecordLocalService.getRecords(recordSetId)>
967
968 <#-- Rückmeldungen ermitteln -->
969 <#assign anzTeilnehmer = 0>
970 <#assign aktuellJa = 0>
971 <#assign aktuellVielleicht = 0>
972 <#assign aktuellNein = 0>
973 <#assign aktuellRes = 0 >
974 <#list records?sort_by("modifiedDate") as cur_record>
975 <#attempt>
976 <#-- ${cur_record}<br> -->
977 <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) >
978 <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) >
979 <#if entscheidung == "ja" >
980 <#assign aktuellJa += 1 >
981 <#elseif entscheidung == "vielleicht" >
982 <#assign aktuellVielleicht = aktuellVielleicht +1 >
983 <#elseif entscheidung == "nein" >
984 <#assign aktuellNein += 1 >
985 <#elseif entscheidung == "res" >
986 <#assign reservationCreateDate_DateObj = cur_record.getCreateDate() >
987 <#--
988 CreateDate: ${reservationCreateDate_DateObj?iso_utc}<br>
989 -->
990 <#assign nowDateTime_DateObj = .now>
991 <#--
992 NowDate: ${nowDateTime_DateObj?iso_utc}<br>
993 -->
994 <#assign dateDifference = nowDateTime_DateObj?long - (reservationCreateDate_DateObj?long ) />
995 <#--
996 Difference: ${dateDifference}<br>
997 Reservierungszeit: ${reservierungsZeit_ms}<br>
998 -->
999 <#if dateDifference gte (reservierungsZeit_ms + reservierungsZeitPuffer_ms)>
1000 <#-- Abgelaufen: ${cur_record.recordId}<br> -->
1001 <#--<#assign deletedDDLRecord = ddlRecordLocalService.deleteRecord(cur_record.recordId) >-->
1002 <script>
1003 Liferay.Service(
1004 '/ddl.ddlrecord/delete-record',
1005 {
1006 recordId: ${cur_record.recordId}
1007 },
1008 function (obj) {
1009
1010 }
1011 );
1012 </script>
1013
1014
1015 <#elseif (themeDisplay.isSignedIn() && cur_record.userId == user.userId) &&(cur_record.recordId != newDDLRecord.getRecordId()) >
1016 <#-- eigene abgelaufene Reservierungen bereinigen -->
1017 <#--<#assign deletedDDLRecord = ddlRecordLocalService.deleteRecord(cur_record.recordId) >-->
1018 <script>
1019 Liferay.Service(
1020 '/ddl.ddlrecord/delete-record',
1021 {
1022 recordId: ${cur_record.recordId}
1023 },
1024 function (obj) {
1025
1026 }
1027 );
1028 </script>
1029 <#else>
1030 <#assign aktuellRes += 1 >
1031 <#-- aktuellRes: ${aktuellRes}<br> -->
1032 </#if>
1033 </#if>
1034 </#if>
1035 <#recover>
1036 </#attempt>
1037 </#list>
1038 <#-- aus irgendeinem Grund werden bei Aufruf aus dem Asset Herausgeber immer zwei Reservierungen angelegt -->
1039
1040 <#-- Aktuelle Vorreservierungen: ${aktuellRes}<br> -->
1041
1042 <#assign anzTeilnehmer = aktuellJa + aktuellVielleicht + aktuellNein>
1043
1044 <#assign ausgebucht = false >
1045 <#if (anzTickets != 0) && (anzTickets <= (aktuellJa+aktuellRes-1))>
1046 <#assign ausgebucht = true >
1047 </#if>
1048 <#assign wirklichAusgebucht = false >
1049 <#if (anzTickets != 0) && (anzTickets <= aktuellJa)>
1050 <#assign wirklichAusgebucht = true >
1051 </#if>
1052 <#-- Ende Rückmeldungen Ermitteln -->
1053
1054 <#-- Eigene Rückmeldung prüfen -->
1055
1056 <#-- noch ist kein eigener Record gefunden, d.h. ID auf 0 setzen -->
1057
1058
1059
1060 <#assign myRecord = 0 >
1061 <#assign essenValue = 0 >
1062 <#-- weitere Teilnhemer -->
1063 <#assign partnerErlaubt = false >
1064 <#assign gaesteErlaubt = false >
1065
1066 <#if ddlId?? && ddlId.partner?? && getterUtil.getBoolean(ddlId.partner.getData())>
1067
1068 <#if ddlId.getData() == "" >
1069 <#else>
1070 <#assign partnerErlaubt = true >
1071 </#if>
1072
1073 </#if>
1074
1075 <#if ddlId?? && ddlId.guests?? && getterUtil.getBoolean(ddlId.guests.getData())>
1076
1077 <#if ddlId.getData() == "" >
1078 <#else>
1079 <#assign gaesteErlaubt = true >
1080 </#if>
1081
1082 </#if>
1083
1084
1085
1086 <#-- prüfen, ob es eine Rückmeldung des angemeldeten Users gibt -->
1087 <#-- Records neu einlesen, da sie modifiziert wurden !!! -->
1088 <#assign records = ddlRecordLocalService.getRecords(recordSetId)>
1089
1090 <#if records?has_content>
1091
1092 <#list records as cur_record>
1093
1094
1095 <#attempt>
1096 <#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) >
1097
1098
1099
1100 <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" >
1101 <#else>
1102 <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale)>
1103 <#-- ${entscheidung}<p> -->
1104 <#assign myRecord = cur_record.recordId >
1105 <#-- ${myRecord} -->
1106
1107
1108 <#assign optionsValue = "" >
1109
1110
1111 <#if cur_record.getDDMFormFieldValues("Optionen")?? >
1112 <#assign optionsValue = cur_record.getDDMFormFieldValues("Optionen")?first.getValue().getString(locale) >
1113 <#-- Optionen ${optionsValue}<br> -->
1114
1115 </#if>
1116
1117 <#assign optionsComment = "" >
1118 <#if cur_record.getDDMFormFieldValues("Kommentar")?? >
1119 <#assign optionsComment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale) >
1120 </#if>
1121
1122
1123
1124 </#if>
1125 </#if>
1126 <#recover>
1127 </#attempt>
1128 </#list>
1129 </#if>
1130
1131
1132
1133
1134 <#-- --------------------------------------------- -->
1135 <#-- Start Autocomplete Name -->
1136 <#-- --------------------------------------------- -->
1137
1138 <#assign listeNamen = []>
1139 <#assign listeEMail = []>
1140
1141 <#list records?reverse as cur_record>
1142 <#attempt>
1143 <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) >
1144
1145 <#else>
1146 <#-- nur Namen zeigen, die man selbst schon einmal eingegeben hat -->
1147 <#if user.userId == cur_record.userId >
1148
1149 <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" && (user.userId == cur_record.userId)>
1150
1151 <#if listeNamen?seq_contains(cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale))>
1152 <#else>
1153 <#assign listeNamen = listeNamen + [cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)]>
1154 <#if cur_record.getDDMFormFieldValues("eMail")?? >
1155 <#assign listeEMail += [cur_record.getDDMFormFieldValues("eMail")?first.getValue().getString(locale)]>
1156 <#else>
1157 <#assign listeEMail += [""]>
1158 </#if>
1159 </#if>
1160
1161
1162
1163 </#if>
1164
1165 </#if>
1166
1167 </#if>
1168 <#recover>
1169 </#attempt>
1170 </#list>
1171
1172
1173 <script>
1174 function autocomplete(inp, arr) {
1175 /*the autocomplete function takes two arguments,
1176 the text field element and an array of possible autocompleted values:*/
1177 var currentFocus;
1178 /*execute a function when someone writes in the text field:*/
1179 inp.addEventListener("input", function (e) {
1180 var a, b, i, val = this.value;
1181 /*close any already open lists of autocompleted values*/
1182 closeAllLists();
1183 if (!val) {
1184 return false;
1185 }
1186 currentFocus = -1;
1187 /*create a DIV element that will contain the items (values):*/
1188 a = document.createElement("DIV");
1189 a.setAttribute("id", this.id + "autocomplete-list");
1190 a.setAttribute("class", "autocomplete-items");
1191 /*append the DIV element as a child of the autocomplete container:*/
1192 this.parentNode.appendChild(a);
1193 /*for each item in the array...*/
1194 for (i = 0; i < arr.length; i++) {
1195 /*check if the item starts with the same letters as the text field value:*/
1196 pos = arr[i].toUpperCase().indexOf(val.toUpperCase());
1197
1198 if (arr[i].substr(pos, val.length).toUpperCase() == val.toUpperCase()) {
1199 /*create a DIV element for each matching element:*/
1200 b = document.createElement("DIV");
1201 /*make the matching letters bold:*/
1202 b.innerHTML = arr[i].substr(0, pos)
1203 b.innerHTML += "<strong>" + arr[i].substr(pos, val.length) + "</strong>";
1204 b.innerHTML += arr[i].substr(pos + val.length);
1205 /*insert a input field that will hold the current array item's value:*/
1206 b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";
1207 /*execute a function when someone clicks on the item value (DIV element):*/
1208 b.addEventListener("click", function (e) {
1209 /*insert the value for the autocomplete text field:*/
1210 inp.value = this.getElementsByTagName("input")[0].value;
1211 /* generate blur event on updated field */
1212 inp.focus();
1213 inp.blur();
1214
1215 /*close the list of autocompleted values,
1216 (or any other open lists of autocompleted values:*/
1217 closeAllLists();
1218 });
1219 a.appendChild(b);
1220 }
1221 }
1222 });
1223 /*execute a function presses a key on the keyboard:*/
1224 inp.addEventListener("keydown", function (e) {
1225 var x = document.getElementById(this.id + "autocomplete-list");
1226 if (x) x = x.getElementsByTagName("div");
1227 if (e.keyCode == 40) {
1228 /*If the arrow DOWN key is pressed,
1229 increase the currentFocus variable:*/
1230 currentFocus++;
1231 /*and and make the current item more visible:*/
1232 addActive(x);
1233 } else if (e.keyCode == 38) { //up
1234 /*If the arrow UP key is pressed,
1235 decrease the currentFocus variable:*/
1236 currentFocus--;
1237 /*and and make the current item more visible:*/
1238 addActive(x);
1239 } else if (e.keyCode == 13) {
1240 /*If the ENTER key is pressed, prevent the form from being submitted,*/
1241 e.preventDefault();
1242 if (currentFocus > -1) {
1243 /*and simulate a click on the "active" item:*/
1244 if (x) x[currentFocus].click();
1245 }
1246 }
1247 });
1248
1249 function addActive(x) {
1250 /*a function to classify an item as "active":*/
1251 if (!x) return false;
1252 /*start by removing the "active" class on all items:*/
1253 removeActive(x);
1254 if (currentFocus >= x.length) currentFocus = 0;
1255 if (currentFocus < 0) currentFocus = (x.length - 1);
1256 /*add class "autocomplete-active":*/
1257 x[currentFocus].classList.add("autocomplete-active");
1258 }
1259
1260 function removeActive(x) {
1261 /*a function to remove the "active" class from all autocomplete items:*/
1262 for (var i = 0; i < x.length; i++) {
1263 x[i].classList.remove("autocomplete-active");
1264 }
1265 }
1266
1267 function closeAllLists(elmnt) {
1268 /*close all autocomplete lists in the document,
1269 except the one passed as an argument:*/
1270 var x = document.getElementsByClassName("autocomplete-items");
1271 for (var i = 0; i < x.length; i++) {
1272 if (elmnt != x[i] && elmnt != inp) {
1273 x[i].parentNode.removeChild(x[i]);
1274 }
1275 }
1276 }
1277
1278 /*execute a function when someone clicks in the document:*/
1279 document.addEventListener("click", function (e) {
1280 closeAllLists(e.target);
1281 });
1282 }
1283
1284 /*An array containing all the country names in the world:*/
1285
1286 <#-- @ G. Ortwein - Korrektur -->
1287 <#if themeDisplay.isSignedIn()>
1288 var vorschlaege = [<#list listeNamen?sort as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>];
1289 var jsListeNamen = [<#list listeNamen as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>];
1290 var jsListeEMail = [<#list listeEMail as datensatz >"${datensatz?replace("\"","")?replace("'","")}", </#list>];
1291 <#else>
1292 var vorschlaege = [];
1293 var jsListeNamen = [];
1294 var jsListeEMail = [];
1295 </#if>
1296
1297
1298 /*initiate the autocomplete function on the "recordNewName" element, and pass along the countries array as possible autocomplete values:*/
1299
1300 console.log("Autocomplete VORSCHLAEGE:", vorschlaege);
1301 console.log("jsListeNamen:", jsListeNamen);
1302 console.log("jsListeEMail:", jsListeEMail);
1303
1304 //console.log(vorschlaege);
1305 //autocomplete(document.getElementById("recordNewName"), vorschlaege);
1306
1307
1308 </script>
1309
1310
1311 <#-- --------------------------------------------- -->
1312 <#-- Ende Autocomplete Name -->
1313 <#-- --------------------------------------------- -->
1314
1315 <div class="abstract row justify-content-center pt-2">
1316 <div class="col-md-7">
1317 <hr>
1318
1319 <#-- hier beginnt die Ausgabe des Rückmeldefelds für die Anmeldung zur Veranstaltung -->
1320 <div id="rueckmeldung"></div>
1321 <div id="MyFeedbackAnker2"> </div>
1322 <div id="MyFeedbackAnker1"><h3>Meine Rückmeldung</h3></div>
1323
1324 <#-- ergänzt, dass Gäste ihren Namen nennen müssen -->
1325 <#if !themeDisplay.isSignedIn() && gastRegistrierungErlaubt>
1326 <div class="anmeldenameFeld">
1327 <#else>
1328 <div class="anmeldenameFeld" hidden>
1329 </#if>
1330 <form id="partnerGastNameForm">
1331 <div class="row">
1332 <div class="col-md-6">
1333 <label for="partnerGastName">Für</label>
1334 <div class="autocomplete w-100">
1335 <input type="text" autocomplete="off" id="partnerGastName" name="partnerGastName"
1336 value="" class="form-control"
1337 placeholder="bitte den Namen eingeben" onblur="ensureNameFilled()">
1338 </div>
1339 </div>
1340 <div class="col-md-6">
1341 <label for="partnerGastEMail">E-Mail</label>
1342 <div class="autocomplete w-100">
1343 <input type="text" autocomplete="off" id="partnerGastEMail" name="partnerGastEMail"
1344 value="" class="form-control"
1345 placeholder="bitte die E-Mail eingeben" onblur="ensureNameFilled()">
1346 </div>
1347 </div>
1348 </div>
1349 <input type="hidden" id="activeRecordSet" name="activeRecordSet" value="${myRecord}">
1350 <input type="hidden" id="activeRecordCreationKey" name="activeRecordCreationKey"
1351 value="${myRecordCreationKey}"><br>
1352 </form>
1353 </div>
1354
1355 <script>
1356 autocomplete(document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']"), vorschlaege);
1357 </script>
1358
1359
1360 <#-- ---------------- Start Ausgabe der Optionen -->
1361
1362 <div class="rm-option-form">
1363 <p>
1364 <form id="rmOptionsForm">
1365 <#if optionsValue != "" >
1366 <#assign selectedOptions = optionsValue?eval>
1367 </#if>
1368 <#if options.getSiblings()?has_content>
1369 <#list options.getSiblings() as cur_options>
1370 <#if cur_options.getData()?replace("\\W", "", "r") != "">
1371
1372 <label for="${cur_options.getData()?replace("\\W", "", "r")}">${cur_options.getData()}</label>
1373 <br>
1374
1375 <select class="form-control"
1376 name="${cur_options.getData()?replace("\\W", "", "r")}"
1377 id="${cur_options.getData()?replace("\\W", "", "r")}"
1378 onblur="updateAttendanceButtons ('update')"
1379 <#if getterUtil.getBoolean(cur_options.multipleChoicePossible.getData())>
1380 multiple>
1381 <#else>
1382 >
1383 </#if>
1384 <option value="">--bitte eine Auswahl treffen--</option>
1385 <#if cur_options.optionAnswer.getSiblings()?has_content>
1386 <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer>
1387
1388 <#if optionsValue != "" >
1389 <#assign basis = cur_options.getData()?replace("\\W", "", "r") >
1390 <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") >
1391 </#if>
1392 <#-- ${selectedOptions.basis?seq_index_of("${suchstring}")} -->
1393 <#if cur_options_optionAnswer.getData()?replace("\\W", "", "r") != "">
1394 <option value="${cur_options_optionAnswer.getData()?replace("\\W", "", "r")}"
1395 <#if optionsValue != "" && selectedOptions[basis]?? >
1396 ${selectedOptions[basis]?seq_contains(suchstring)?string("selected", "")}
1397 </#if>
1398 >${cur_options_optionAnswer.getData()} </option>
1399 </#if>
1400
1401 </#list>
1402
1403 </#if>
1404 </select><br>
1405 </#if>
1406
1407 </#list>
1408 </#if>
1409
1410
1411 </form>
1412 </p>
1413 </div>
1414
1415
1416 <#-- Start Kommentarfeld -->
1417
1418 <div class="rm-comment-form">
1419
1420 <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 >
1421 <style>
1422
1423 form {
1424 width: 100%;
1425 }
1426
1427 label, textarea {
1428 width: 100%;
1429 font-size: 1em;
1430 }
1431
1432 textarea {
1433 resize: vertical;
1434 width: 100%;
1435 height: 200px;
1436 background: #F1F2F5;
1437 border: solid 1px #EAEBF0;
1438 border-radius: 5px;
1439 padding: 1em;
1440 font-size: 1em;
1441 color: black;
1442 }
1443
1444 </style>
1445
1446 <form id="rmCommentForm">
1447 <table width="100%">
1448 <tr><label>Anmerkungen</label></tr>
1449 <tr>
1450 <td><textarea id="participantComment"
1451 maxlength="${lionsEventDisplayModel.getCommentCharacterAmount()+5}"
1452 class="character-limit"
1453 placeholder="Eigene Anmerkungen... (max. ${lionsEventDisplayModel.getCommentCharacterAmount()} Zeichen)">${optionsComment}</textarea>
1454 </td>
1455 </tr>
1456 <tr>
1457 <td align="right"><label> <span
1458 class="counter">0</span>/${lionsEventDisplayModel.getCommentCharacterAmount()}
1459 </label></td>
1460 </tr>
1461 </table>
1462 </form>
1463
1464 <script>
1465 document.addEventListener('DOMContentLoaded', function () {
1466 document.querySelector('.character-limit').addEventListener('keyup', function (ev) {
1467 let input = document.querySelector('.character-limit');
1468 let limit = ${lionsEventDisplayModel.getCommentCharacterAmount()}; // Max. Anz. Zeichen
1469 let count = input.value.length;
1470 document.querySelector('.counter').innerHTML(count);
1471 if (count > limit) {
1472 input.setAttribute('style', 'background:red;color:white');
1473 } else {
1474 input.setAttribute('style', 'background:#F1F2F5;color:black');
1475 }
1476 });
1477 });
1478 </script>
1479
1480 <#else>
1481 <form id="rmCommentForm" hidden>
1482 <textarea id="participantComment"></textarea>
1483 </form>
1484
1485 </#if>
1486
1487 </div>
1488
1489 <#-- Ende Kommentarfeld -->
1490
1491
1492
1493 <#-- Optionen auslesen -->
1494
1495
1496 <script>
1497 var ${randomNamespace}optionsMap = ${jsonFactoryUtil.looseSerializeDeep( complex_options_map)};
1498 ${randomNamespace}res = JSON.parse(${randomNamespace}optionsMap);
1499 console.log(${randomNamespace}res);
1500
1501 var ${randomNamespace}gewOpt = "";
1502
1503
1504 function handleOptionsForm(tnOptionsForm) {
1505
1506 const data = new FormData(tnOptionsForm);
1507
1508 const formJSON = Object.fromEntries(data.entries());
1509 console.log(formJSON);
1510
1511 <#if options.getSiblings()?has_content>
1512 <#list options.getSiblings() as cur_options>
1513 <#if cur_options.getData()?replace("\\W", "", "r") != "">
1514 formJSON.${cur_options.getData()?replace("\\W", "", "r")} = data.getAll('${cur_options.getData()?replace("\\W", "", "r")}');
1515 </#if>
1516 </#list>
1517 </#if>
1518
1519 ${randomNamespace}gewOpt = JSON.stringify(formJSON, null, 2);
1520
1521 <#-- Handle Name fuer Partner und Gäste -->
1522 if (document.querySelector("div.anmeldenameFeld").hidden == false) {
1523 if (document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").value == "") {
1524 alert("Bitte geben Sie den Namen des Partners / Gastes ein!");
1525 document.querySelector("div.anmeldenameFeld form input[name='partnerGastName']").focus();
1526 return false;
1527 }
1528 }
1529
1530 return true;
1531 }
1532
1533 </script>
1534
1535
1536 <#-- ------------ Ende Ausgabe der Optionen ----------------------- -->
1537
1538
1539 <#-- Zu- Absage Buttons -->
1540
1541 <#-- noch nichts ausgewählt -->
1542
1543 <#-- add update request Start -->
1544
1545 <script type="text/javascript">
1546
1547 var activeElement;
1548
1549 function sendAttendanceAddUpdateRequest(value, element) {
1550 <#if !anmeldungAbgelaufen>
1551 var ausgebucht = ${ausgebucht?string("true", "false")};
1552 var wirklichAusgebucht = ${wirklichAusgebucht?string("true", "false")};
1553 var vorReserviert = ${vorReserviert?string("true", "false")};
1554 var buchungErlaubt = true;
1555 <#if vorReserviert>
1556 var dateTimeVorReserviert = ${dateTimeVorReserviert?long};
1557 var reservierungsZeit_ms = ${reservierungsZeit_ms};
1558 var aktuelleZeit = Date.now();
1559 var zeitDifferenz = aktuelleZeit - dateTimeVorReserviert;
1560 var gueltigeReservierung = (zeitDifferenz < reservierungsZeit_ms);
1561 console.log("Zeitpunkt Vorreservierung: ", dateTimeVorReserviert);
1562 console.log("aktuelle Zeit: ", aktuelleZeit);
1563 console.log("zeitDifferenz: ", zeitDifferenz);
1564 console.log("Gueltige Reservierung: ", gueltigeReservierung);
1565
1566 if (!gueltigeReservierung || ausgebucht) {
1567 buchungErlaubt = false;
1568 }
1569
1570 </#if>
1571
1572 <#--
1573 console.log("Green Disabled", $('.attendance-submit-button.green').hasClass('disabled'));
1574 -->
1575 var greenDisabled = document.querySelector('.attendance-submit-button.green').classList.contains('disabled');
1576 var yellowDisabled = document.querySelector('.attendance-submit-button.yellow')?.classList.contains('disabled');
1577 var redDisabled = document.querySelector('.attendance-submit-button.red').classList.contains('disabled');
1578
1579 if (!greenDisabled && yellowDisabled && redDisabled) {
1580 buchungErlaubt = true;
1581 }
1582
1583 console.log("Buchung erlaubt", buchungErlaubt);
1584
1585 if (value === "ja" && !buchungErlaubt) {
1586 if (wirklichAusgebucht) {
1587 alert("Diese Veranstaltung ist ausgebucht.");
1588 window.location.reload(false);
1589 } else {
1590 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.");
1591 window.location.reload(false);
1592 }
1593
1594 } else {
1595 activeElement = element;
1596
1597 <#-- sicherstellen, dass die Optionen aktuell sind -->
1598 var rmOptionsForm = document.querySelector("div.rm-option-form form")
1599 var valid = handleOptionsForm(rmOptionsForm);
1600
1601 if (!valid) {
1602 // z.B. wenn kein Name angegeben wurde
1603 return false;
1604 }
1605
1606 var optTxt = ${randomNamespace}gewOpt;
1607 <#-- im Fall der Absage keine Optionen speichern -->
1608 if (value === "nein") {
1609 optTxt = "";
1610 }
1611 <#-- im Fall keine Optionen auch keine Optionen speichern -->
1612 if (optTxt === "{}") {
1613 optTxt = "";
1614 }
1615
1616
1617 var nameField = document.querySelector("div.anmeldenameFeld input[id='partnerGastName']");
1618 //console.log("nameField: ", nameField.value);
1619
1620 var partnerGastEMail = document.querySelector("div.anmeldenameFeld input[id='partnerGastEMail']");
1621 //console.log("partnerGastEMail: ", partnerGastEMail.value);
1622
1623 var activeRecordCreationKey = document.querySelector("div.anmeldenameFeld input[id='activeRecordCreationKey']");
1624 //console.log("activeRecordCreationKey: ", activeRecordCreationKey.value);
1625
1626 var participantComment = document.querySelector("div.rm-comment-form textarea[id='participantComment']");
1627 //console.log("participantComment: ", participantComment.value);
1628
1629 var recordIdField = document.querySelector("div.anmeldenameFeld input[id='activeRecordSet']");
1630 //console.log("recordIdField: ", recordIdField.value);
1631
1632
1633 if (parseInt(recordIdField.value) == 0) {
1634 Liferay.Service(
1635 '/ddl.ddlrecord/add-record',
1636 {
1637 groupId: ${groupId},
1638 recordSetId: ${recordSetId},
1639 displayIndex: 0,
1640 fieldsMap: JSON.stringify({
1641 "Veranstaltung": "${articleId}",
1642 "Name": nameField.value,
1643 "eMail": partnerGastEMail.value,
1644 "Teilnahme": value,
1645 "Optionen": optTxt,
1646 "Kommentar": participantComment.value,
1647 "Key": activeRecordCreationKey.value
1648 })
1649 },
1650 function (obj) {
1651 document.querySelectorAll('.attendance-submit-button').forEach(function (el) {
1652 el.classList.add('disabled')
1653 });
1654 activeElement?.classList.remove('disabled')
1655 console.log(obj);
1656
1657 <#-- @ G. Ortwein - dis ist neu -->
1658 <#-- Start Use local Storage -->
1659 <#-- Wenn der User nicht angemeldet ist, notwendige Anmeldedetails lokal speichern -->
1660
1661 <#if !themeDisplay.isSignedIn() >
1662
1663 localTnListItem = 'TNLIST${recordSetId}A${articleId}';
1664 localTnListNew = JSON.stringify({
1665 "tnListe": [{
1666 "tnId": obj.recordId,
1667 "Veranstaltung": "${articleId}",
1668 "Name": nameField.value,
1669 "eMail": partnerGastEMail.value,
1670 "Teilnahme": value,
1671 "Optionen": optTxt,
1672 "Kommentar": participantComment.value,
1673 "Key": activeRecordCreationKey.value
1674 }]
1675 });
1676
1677
1678 bisherigeTn = JSON.parse(localStorage.getItem(localTnListItem));
1679 neueTn = JSON.parse(localTnListNew);
1680
1681 if (bisherigeTn !== null) {
1682 for (i = 0; i < bisherigeTn.tnListe.length; i++) {
1683 neueTn.tnListe[i + 1] = bisherigeTn.tnListe[i];
1684 }
1685 }
1686 localStorage.setItem(localTnListItem, JSON.stringify(neueTn));
1687 </#if>
1688
1689 <#-- Ende Use local Storage -->
1690
1691 window.location.reload(false);
1692 }
1693 );
1694 } else {
1695 Liferay.Service(
1696 '/ddl.ddlrecord/update-record',
1697 {
1698 recordId: recordIdField.value,
1699 displayIndex: 0,
1700 fieldsMap: JSON.stringify({
1701 "Veranstaltung": "${articleId}",
1702 "Name": nameField.value,
1703 "eMail": partnerGastEMail.value,
1704 "Teilnahme": value,
1705 "Optionen": optTxt,
1706 "Kommentar": participantComment.value,
1707 "Essen": ""
1708 }),
1709 mergeFields: true
1710 },
1711 function (obj) {
1712 document.querySelectorAll('.attendance-submit-button').forEach(function (el) {
1713 el.classList.add('disabled')
1714 });
1715 activeElement?.classList.remove('disabled')
1716 console.log(obj);
1717 window.location.reload(false);
1718 }
1719 );
1720 }
1721 }
1722 <#else>
1723 alert("Die Anmledefrist für diese Veranstaltung ist abgelaufen.");
1724 window.location.reload(false);
1725 </#if>
1726
1727 }
1728
1729 </script>
1730
1731
1732 <#-- add update request Ende -->
1733
1734
1735 <#-- ausgabe der zu / absage Buttons -->
1736 <div class="visualisation-and-selection-attendance">
1737 <table>
1738 <tr>
1739 <td>
1740 <#-- ja -->
1741 <#if myRecord == 0 >
1742 <#if !ausgebucht && !anmeldungAbgelaufen>
1743 <div class="attendance-submit-button green"
1744 onclick="sendAttendanceAddUpdateRequest('ja', this)">
1745 <@clay["icon"] symbol="check"/>
1746 <#else>
1747 <div class="attendance-submit-button green disabled">
1748 <@clay["icon"] symbol="check"/>
1749 </div>
1750 </#if>
1751
1752 <#else>
1753 <#if entscheidung == "ja" >
1754 <div class="attendance-submit-button green"
1755 onclick="sendAttendanceAddUpdateRequest('ja', this)">
1756 <@clay["icon"] symbol="check"/>
1757 </div>
1758 <#else>
1759 <#if !ausgebucht && !anmeldungAbgelaufen>
1760 <div class="attendance-submit-button green disabled"
1761 onclick="sendAttendanceAddUpdateRequest('ja', this)">
1762 <@clay["icon"] symbol="check"/>
1763 </div>
1764 <#else>
1765 <div class="attendance-submit-button green disabled">
1766 <@clay["icon"] symbol="check"/>
1767 </div>
1768 </#if>
1769
1770 </#if>
1771 </#if>
1772
1773 </td>
1774 <#if ddlId.possibleRegistrationTypes?? && ddlId.possibleRegistrationTypes.getData()?has_content && ddlId.possibleRegistrationTypes.getData() == "jn" >
1775 <#else>
1776 <td>
1777 <#-- vielleicht -->
1778 <#if myRecord == 0 >
1779 <div class="attendance-submit-button yellow"
1780 onclick="sendAttendanceAddUpdateRequest('vielleicht', this)">
1781 <@clay["icon"] symbol="question-circle"/>
1782 </div>
1783 <#else>
1784 <#if entscheidung == "vielleicht" >
1785 <div class="attendance-submit-button yellow"
1786 onclick="sendAttendanceAddUpdateRequest('vielleicht', this)">
1787 <@clay["icon"] symbol="question-circle"/>
1788 </div>
1789 <#else>
1790 <div class="attendance-submit-button yellow disabled"
1791 onclick="sendAttendanceAddUpdateRequest('vielleicht', this)">
1792 <@clay["icon"] symbol="question-circle"/>
1793 </div>
1794 </#if>
1795 </#if>
1796 </td>
1797 </#if>
1798
1799 <td>
1800 <#-- nein -->
1801 <#if myRecord == 0 >
1802 <div class="attendance-submit-button red"
1803 onclick="sendAttendanceAddUpdateRequest('nein', this)">
1804 <@clay["icon"] symbol="times-small"/>
1805 </div>
1806 <#else>
1807 <#if entscheidung == "nein" >
1808 <div class="attendance-submit-button red"
1809 onclick="sendAttendanceAddUpdateRequest('res', this)">
1810 <@clay["icon"] symbol="trash"/>
1811 </div>
1812 <#else>
1813 <div class="attendance-submit-button red disabled"
1814 onclick="sendAttendanceAddUpdateRequest('nein', this)">
1815 <@clay["icon"] symbol="times-small"/>
1816 </div>
1817 </#if>
1818 </#if>
1819 </td>
1820 </table>
1821 </div>
1822
1823 <#-- Ende der Ausgabe der Zu-/Absage Buttons -->
1824
1825 <#-- TESTENDE -->
1826
1827 <#if wirklichAusgebucht>
1828 <div class="portlet-msg-alert">
1829 Diese Veranstaltung ist ausgebucht.
1830 </div>
1831 <#elseif ausgebucht>
1832 <div class="portlet-msg-alert">
1833 Zu dieser Veranstaltung sind derzeit keine weiteren Anmeldungen möglich, da alle
1834 verbliebenen Tickets für
1835 laufende Buchungsprozesse vorreserviert sind. Bitte versuchen Sie es später.
1836 </div>
1837 </#if>
1838
1839 <#if themeDisplay.isSignedIn() && !ausgebucht && !anmeldungAbgelaufen && (gaesteErlaubt || partnerErlaubt || (user.userId == articleAuthorId) ) >
1840 <hr>
1841 <p>
1842 <b>Zu diesem Termin können auch
1843 ${partnerErlaubt?string("Partner ", "")}
1844 ${(partnerErlaubt && gaesteErlaubt)?string("und ", "")}
1845 ${gaesteErlaubt?string("Gäste ", "")}
1846 ${(partnerErlaubt || gaesteErlaubt)?string("und ", "")}
1847 ${(user.userId == articleAuthorId)?string("weitere Teilnehmer", "")}
1848 angemeldet werden.</b>
1849
1850 <#if user.userId == articleAuthorId >
1851 <br>Als Ersteller dieses Termins können Sie zu diesem Termin auch Rückmeldungen weiterer Teilnehmer ergänzen, die diese nicht selbst eingeben.
1852 </#if>
1853 </p>
1854 <p>
1855 <form id="partnerGast">
1856 <button class="btn btn-secondary"
1857 type="button"
1858 onclick="updateEntryInputField ('div.anmeldenameFeld', '', '', '0','${myRecordCreationKey}', 'div.rm-option-form', '', 'div.visualisation-and-selection-attendance', 'all','div.rm-comment-form','')">
1859 ${(user.userId == articleAuthorId)?string("Teilnehmer", "")}${((user.userId == articleAuthorId)&&(partnerErlaubt || gaesteErlaubt))?string(", ", "")}
1860 ${partnerErlaubt?string("Partner ", "")}
1861 ${(partnerErlaubt && gaesteErlaubt)?string("oder ", "")}
1862 ${gaesteErlaubt?string("Gast ", "")}anmelden
1863 </button>
1864 </form>
1865 </p>
1866 </#if>
1867
1868
1869 <#if user.userId == articleAuthorId>
1870
1871 <#-- Rollen finden
1872 <#assign usrRoles = user.getRoles()>
1873
1874 <#list usrRoles as usrRole>
1875
1876 ${usrRole.getName()}<br>
1877
1878 </#list>
1879
1880 <#assign usrGroups = user.getGroups()>
1881
1882 <#list usrGroups as usrGroup>
1883
1884 ${usrGroup.getName()}<br>
1885
1886 </#list>
1887
1888 -->
1889 </#if>
1890
1891 <#if anzTeilnehmer gt 0>
1892
1893 <hr>
1894 <h3>Insgesamt ${anzTeilnehmer} Rückmeldungen</h3>
1895 <#if aktuellJa gt 0>
1896 <@clay["icon"] symbol="check"/> = ${aktuellJa}
1897 <#if anzTickets gt 0>
1898 von ${anzTickets}
1899 </#if>
1900
1901 </#if>
1902 <#if aktuellVielleicht gt 0>
1903 <@clay["icon"] symbol="question-circle"/> = ${aktuellVielleicht}
1904 </#if>
1905 <#if aktuellNein gt 0>
1906 <@clay["icon"] symbol="times-small"/> = ${aktuellNein}
1907 </#if>
1908 <p>
1909 </#if>
1910
1911
1912 <#-- hier benginnt die Liste -->
1913 <#if records?has_content>
1914
1915 <#-- Klären, ob der Betrachter der Seite der Teilnehmer sehen darf -->
1916 <#assign
1917 <#-- teilnehmer bereich nur anzeigen wenn eingeloggt && (admin || author || hat rückmeldung gegeben)-->
1918 <#-- teilnehmerAnzeigen = themeDisplay.isSignedIn() && (themeDisplay.getPermissionChecker().isCompanyAdmin() || themeDisplay.getUserId() == articleAuthorId || validator.isNotNull(lionsEventDisplayModel.getUserRegistrationStatus(themeDisplay.getUserId())))-->
1919 teilnehmerAnzeigen = lionsEventDisplayModel.showRegisteredUsersArea(themeDisplay)
1920 alleTeilnehmerAnzeigen = lionsEventDisplayModel.showAllRegisteredUsers(themeDisplay)
1921 >
1922
1923 <#assign
1924 listDownloadText = "Veranstaltung:;" + .vars['reserved-article-title'].data?url('ISO-8859-1') + "\r\n"?url('ISO-8859-1')
1925 listDownloadText = listDownloadText + "Datum:;" + lionsEventDisplayModel.getStartDateFormatted() + "\r\n"?url('ISO-8859-1')
1926 listDownloadText = listDownloadText + "Beginn:;" + lionsEventDisplayModel.getStartTimeFormatted() + "\r\n\r\n"?url('ISO-8859-1')
1927 />
1928
1929 <#-- @ G. Ortwein das ist neu -->
1930 <#-- Start Use local Storage -->
1931 <#-- Wenn der User nicht angemeldet ist, notwendige Anmeldedetails lokal speichern -->
1932
1933 <#if !teilnehmerAnzeigen && !alleTeilnehmerAnzeigen >
1934 <hr>
1935 <div id="weitereTnVorhanden"></div>
1936
1937 <script>
1938 localTnListItem = 'TNLIST${recordSetId}A${articleId}';
1939 bisherigeTn = JSON.parse(localStorage.getItem(localTnListItem));
1940
1941 if (bisherigeTn !== null) {
1942 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>";
1943 for (i = 0; i < bisherigeTn.tnListe.length; i++) {
1944 ausgabeText = ausgabeText + "<tr><td>" + bisherigeTn.tnListe[i].Name + "</td>";
1945
1946 <#--
1947 ausgabeText = ausgabeText + "<td>" + bisherigeTn.tnListe[i].tnId +"</td>";
1948 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>";
1949 -->
1950
1951 <#-- @ G. Ortwein - das müsste iregendwie schöner gehen...
1952 mir fiel aber ichts besseres ein -->
1953
1954 ausgabeOptText = "<td><small>";
1955
1956 if (bisherigeTn.tnListe[i].Optionen != "") {
1957 rO = JSON.parse(bisherigeTn.tnListe[i].Optionen);
1958
1959 <#if options.getSiblings()?has_content>
1960 <#list options.getSiblings() as cur_options>
1961 <#if cur_options.getData() !="">
1962 <#assign basis = cur_options.getData()?replace("\\W", "", "r") >
1963 ausgabeOptText += "<b>${cur_options.getData()}:</b>";
1964 selectedOptions = JSON.stringify(rO, ["${basis}"], 0);
1965
1966 if (selectedOptions != "{}") {
1967 selectedOptionsObj = JSON.parse(selectedOptions);
1968 var anzSelOpt = 0;
1969 <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer>
1970 <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") >
1971 if (selectedOptionsObj.${basis}.includes("${suchstring}")) {
1972 if (anzSelOpt > 0) {
1973 ausgabeOptText += " |";
1974 }
1975 ausgabeOptText += " ${cur_options_optionAnswer.getData()}";
1976 anzSelOpt += 1;
1977 }
1978
1979
1980 </#list>
1981 }
1982
1983 if (bisherigeTn.tnListe[i].Kommentar != "") {
1984 ausgabeOptText += "<br>";
1985 ausgabeOptText += "<b>Anmerkungen:</b>";
1986 ausgabeOptText += bisherigeTn.tnListe[i].Kommentar;
1987 }
1988
1989 ausgabeOptText += "<br>";
1990 </#if>
1991 </#list>
1992 </#if>
1993
1994
1995 }
1996 ausgabeOptText += "</small></td>";
1997
1998 ausgabeText += ausgabeOptText;
1999
2000 ausgabeText = ausgabeText + "<td align=\"center\" valign=\"center\">";
2001 if (bisherigeTn.tnListe[i].Teilnahme == "ja") {
2002 ausgabeText = ausgabeText + "<div class=\"attendance-visual green\">";
2003 ausgabeText = ausgabeText + "<@clay["icon"] symbol="check"/>";
2004 ausgabeText = ausgabeText + "</div>";
2005 }
2006
2007 if (bisherigeTn.tnListe[i].Teilnahme == "vielleicht") {
2008 ausgabeText = ausgabeText + "<div class=\"attendance-visual yellow\">";
2009 ausgabeText = ausgabeText + "<@clay["icon"] symbol="question-circle"/>";
2010 ausgabeText = ausgabeText + "</div>";
2011 }
2012
2013 if (bisherigeTn.tnListe[i].Teilnahme == "nein") {
2014 ausgabeText = ausgabeText + "<div class=\"attendance-visual red\">";
2015 ausgabeText = ausgabeText + "<@clay["icon"] symbol="times-small"/>";
2016 ausgabeText = ausgabeText + "</div>";
2017 }
2018 ausgabeText = ausgabeText + "</td></tr>";
2019 }
2020 ausgabeText = ausgabeText + "</table></p><p> </p>";
2021
2022 document.getElementById("weitereTnVorhanden").innerHTML = ausgabeText;
2023 }
2024 </script>
2025 </#if>
2026
2027 <#-- Ende Use local Storage -->
2028
2029 <#if teilnehmerAnzeigen || alleTeilnehmerAnzeigen >
2030 <hr>
2031 <table width=100%>
2032 <tr style="border-bottom: 2px solid #ddd;">
2033 <td align="left" width="30%"><b>Name</b></td>
2034 <#assign listDownloadText = listDownloadText + "Name;" >
2035 <td align="left" width="50%"><b>Rückmeldung</b></td>
2036 <#assign listDownloadText = listDownloadText + "Zeitpunkt der Rückmeldung;"?url('ISO-8859-1') >
2037 <#-- Überschriften der Excel Tabelle Dynamisch ergänzen -->
2038 <#if options.getSiblings()?has_content>
2039 <#list options.getSiblings() as cur_options>
2040 <#if cur_options.getData() != "" >
2041 <#assign listDownloadText = listDownloadText + cur_options.getData()?url('ISO-8859-1') + ";" >
2042 </#if>
2043 </#list>
2044 </#if>
2045 <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 >
2046 <#assign listDownloadText = listDownloadText + "Anmerkungen;" >
2047 </#if>
2048 <#-- Ende Überschriften dynamisch ergänzen -->
2049
2050 <td align="center" width="10%">
2051 <b>
2052 <nobr><@clay["icon"] symbol="check"/><@clay["icon"] symbol="question-circle"/>
2053 <@clay["icon"] symbol="times-small"/>
2054 </nobr>
2055 </b>
2056 </td>
2057
2058 <td align="center" width="10%"></td>
2059
2060 </tr>
2061 <#assign listDownloadText = listDownloadText + "Zu-/Absage\r\n"?url('ISO-8859-1') >
2062
2063 <#list records as cur_record>
2064 <#attempt>
2065 <#if (cur_record.getDDMFormFieldValues("Veranstaltung")?? && cur_record.getDDMFormFieldValues("Veranstaltung")?first.getValue().getString(locale) == articleId) >
2066 <#if (themeDisplay.getUserId() == articleAuthorId) || (themeDisplay.getUserId() == cur_record.userId) || alleTeilnehmerAnzeigen >
2067 <#if cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) != "res" >
2068 <tr style="border-bottom: 1px solid #ddd;">
2069 <#-- <td>${cur_record}</td> -->
2070 <#-- <td>${cur_record.recordId}</td> -->
2071 <td valign="center">
2072 <#assign partnerGuestName = "" >
2073 <#assign partnerGastEMail = "" >
2074 <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "" && (user.userId == cur_record.userId)>
2075 <#assign partnerGuestRecord = true >
2076 <#assign partnerGuestName = cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) >
2077 <#if cur_record.getDDMFormFieldValues("eMail")??>
2078 <#assign partnerGastEMail = cur_record.getDDMFormFieldValues("eMail")?first.getValue().getString(locale) >
2079 </#if>
2080
2081 ${cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)}
2082 <#assign listDownloadText = listDownloadText + cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)?url('ISO-8859-1')>
2083 <#else>
2084 <#if cur_record.getDDMFormFieldValues("Name")?? && cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale) != "">
2085 ${cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)}
2086 <#assign listDownloadText = listDownloadText + cur_record.getDDMFormFieldValues("Name")?first.getValue().getString(locale)?url('ISO-8859-1')>
2087 <#else>
2088 ${cur_record.userName}
2089 <#assign listDownloadText = listDownloadText + cur_record.userName?url('ISO-8859-1') >
2090 </#if>
2091 <#assign partnerGuestRecord = false >
2092 </#if>
2093 <#assign listDownloadText = listDownloadText + ";" >
2094 </td>
2095 <td valign="center">
2096 <#--${cur_record.modifiedDate?string["dd.MM.yyyy HH:mm"]}h -->
2097 <#assign listDownloadText = listDownloadText + cur_record.modifiedDate?string["dd.MM.yyyy HH:mm"]?url('ISO-8859-1') + "h" >
2098 <#assign listDownloadText = listDownloadText + ";" >
2099
2100
2101
2102 <#-- Entscheidung auslesen -->
2103
2104 <#assign entscheidung = cur_record.getDDMFormFieldValues("Teilnahme")?first.getValue().getString(locale) >
2105
2106
2107 <#assign recordCreationKey ="" >
2108 <#assign comment = "">
2109 <#if cur_record.getDDMFormFieldValues("Key")?? >
2110 <#assign recordCreationKey = cur_record.getDDMFormFieldValues("Key")?first.getValue().getString(locale) >
2111 </#if>
2112
2113 <#if cur_record.getDDMFormFieldValues("Kommentar")?? >
2114 <#assign comment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale)?js_string >
2115 </#if>
2116 <script>
2117 var jsComment${cur_record.recordId} = "${comment}";
2118 </script>
2119
2120
2121 <#-- Start Ausgabe der gewählten Optionen -->
2122 <small>
2123 <#if cur_record.getDDMFormFieldValues("Optionen")?? >
2124 <#assign optionsValue = cur_record.getDDMFormFieldValues("Optionen")?first.getValue().getString(locale) >
2125 <#else>
2126 <#assign optionsValue = "" >
2127 </#if>
2128 <#if optionsValue != "" >
2129 <#assign selectedOptions = optionsValue?eval>
2130 </#if>
2131 <#if options.getSiblings()?has_content>
2132 <#list options.getSiblings() as cur_options>
2133 <#if (entscheidung != "nein") && (cur_options.getData() !="") >
2134 <b>${cur_options.getData()}:</b>
2135 <#if cur_options.optionAnswer.getSiblings()?has_content>
2136 <#assign anzCurOpt = 0 >
2137 <#list cur_options.optionAnswer.getSiblings() as cur_options_optionAnswer>
2138 <#if optionsValue != "" >
2139 <#assign basis = cur_options.getData()?replace("\\W", "", "r") >
2140 <#assign suchstring = cur_options_optionAnswer.getData()?replace("\\W", "", "r") >
2141 </#if>
2142 <#if optionsValue != "" && selectedOptions[basis]??>
2143 <#if selectedOptions[basis]?seq_contains(suchstring)>
2144 <#if anzCurOpt != 0 >
2145 <#assign listDownloadText = listDownloadText + " | " >
2146 |
2147 </#if>
2148 ${cur_options_optionAnswer.getData()}
2149 <#assign listDownloadText = listDownloadText + cur_options_optionAnswer.getData()?url('ISO-8859-1') >
2150 <#assign anzCurOpt++ >
2151 </#if>
2152 </#if>
2153 </#list>
2154 </#if>
2155 <br>
2156
2157 </#if> <#-- (entscheidung != "nein") && (cur_options.getData() !="") -->
2158 <#assign listDownloadText = listDownloadText + ";" >
2159 </#list>
2160 </#if>
2161 </small>
2162
2163
2164 <#-- Ende Ausgabe der gewählten Optionen -->
2165
2166 <#-- Ausgabe Kommentar -->
2167
2168 <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 && cur_record.getDDMFormFieldValues("Kommentar")?? >
2169 <#assign optionsComment = cur_record.getDDMFormFieldValues("Kommentar")?first.getValue().getString(locale) >
2170 <#else>
2171 <#assign optionsComment = "" >
2172 </#if>
2173
2174 <#if optionsComment != "" >
2175 <small>
2176 <b>Anmerkungen:</b>
2177 ${optionsComment}
2178 </small>
2179
2180 </#if>
2181 <#if lionsEventDisplayModel.getCommentCharacterAmount() gt 0 >
2182 <#assign listDownloadText += "\\\"" >
2183 <#assign optionsCommentSafe = optionsComment?replace("\"","\"\"")?url('ISO-8859-1') >
2184 <#assign listDownloadText += optionsCommentSafe >
2185 <#assign listDownloadText += "\\\"" >
2186 <#assign listDownloadText += ";" >
2187 </#if>
2188
2189
2190 <#-- Ende Ausgabe KOmentar -->
2191
2192 </td>
2193
2194 <td align="center" valign="center">
2195
2196
2197 <#if entscheidung == "ja" >
2198 <div class="attendance-visual green">
2199 <@clay["icon"] symbol="check"/>
2200 </div>
2201 <#assign listDownloadText = listDownloadText + "ja;" >
2202 <#elseif entscheidung == "vielleicht" >
2203 <div class="attendance-visual yellow">
2204 <@clay["icon"] symbol="question-circle"/>
2205 </div>
2206 <#assign listDownloadText = listDownloadText + "vielleicht;" >
2207 <#elseif entscheidung == "nein" >
2208 <div class="attendance-visual red">
2209 <@clay["icon"] symbol="times-small"/>
2210 </div>
2211 <#assign listDownloadText = listDownloadText + "nein;" >
2212 </#if>
2213
2214 <#assign listDownloadText = listDownloadText + ";" >
2215 </td>
2216
2217 <td align="center" valign="center">
2218 <#-- <#if partnerGuestRecord == true> -->
2219 <#if user.userId == cur_record.userId >
2220
2221 <#-- optionsValueString Anführungszeichen ersetzen, da
2222 Freemarker sonst einen nicht kontrollierbaren Output Recoding Fehler macht
2223 Ein Punkt "." ist ok, da der String keine Sonderteichen enthalten kann-->
2224 <#assign optionsValueString = optionsValue?replace("\"",".")?replace("\\s+","","r") >
2225
2226 <div class="attendance-edit-button"
2227 onclick="updateEntryInputField ('div.anmeldenameFeld', '${partnerGuestName}','${partnerGastEMail}', '${cur_record.recordId}','${recordCreationKey}', 'div.rm-option-form',
2228 '${optionsValueString}', 'div.visualisation-and-selection-attendance', '${entscheidung}','',jsComment${cur_record.recordId}
2229 )">
2230 <@clay["icon"] symbol="pencil" cssClass="p-1"/>
2231 </div>
2232
2233 </#if>
2234 </td>
2235 <#assign listDownloadText = listDownloadText + "\r\n"?url('ISO-8859-1') >
2236 </tr>
2237 </#if> <#-- kein Reservierungs Datensatz -->
2238
2239 </#if>
2240
2241 </#if>
2242 <#recover>
2243 </#attempt>
2244 </#list>
2245 </table>
2246
2247 <#-- CSV Download der Teilnhemer -->
2248
2249
2250 <hr><p><b>Hier können Sie die Teilnehmerliste herunterladen:</b></p>
2251 <p>
2252 <input type="button" id="${articleId}_listeDownloadButton" class="btn btn-secondary"
2253 value="Teilnehmerliste laden"/>
2254 </p>
2255 <#if !(alleTeilnehmerAnzeigen || (user.userId == articleAuthorId))>
2256 <p><small>Anmerkung: Auf Grund der DSGVO können Sie nur solche Teilnehmer sehen und
2257 herunterladen,
2258 die Sie selbst eingegeben haben.<br>Weitere Teilnehmer sehen Sie nur, wenn das bei der
2259 Veranstaltung explizit erlaubt ist.</small></p>
2260 <#else>
2261 <p><small>Hinweis zur DSGVO: Der Organisator hat festgelegt, dass Sie die vollstädige
2262 Teilnehmerliste einsehen können.<br>Bitte gehen Sie entsprechend sorgfältig
2263 und
2264 entsprechend der DSGVO mit den bereitgestellten Daten um.</small></p>
2265 </#if>
2266 </#if>
2267 </div>
2268
2269 <script type="text/javascript">
2270 function downloadListe(filename, text) {
2271 var element = document.createElement('a');
2272 //element.setAttribute('href', 'data:application/csv,' + encodeURIComponent(text));
2273 element.setAttribute('href', 'data:text/comma-separated-values,' + text);
2274 element.setAttribute('download', filename);
2275
2276 element.style.display = 'none';
2277 document.body.appendChild(element);
2278
2279 element.click();
2280
2281 document.body.removeChild(element);
2282 }
2283
2284 // Start Teilnehmerliste download.
2285 document.getElementById("${articleId}_listeDownloadButton").addEventListener("click", function () {
2286 var filename = encodeURIComponent("Teilnehmer-Event-${.vars['reserved-article-id'].data}" + ".csv");
2287 downloadListe(filename, "${listDownloadText}");
2288 }, false);
2289 </script>
2290 <#-- ENDE CSV Download der Teilnhemer -->
2291
2292 </#if>
2293
2294 </#if>
2295
2296 <#-- hier endet die Liste -->
2297
2298
2299 <#-- ics Download script -->
2300
2301 <script type="text/javascript">
2302
2303 beautyNavUrl = makeNavUrl("${location.getData()?replace("\"", "'")?replace("\r", " ")?replace("\n", " ")}", "${location.streetAndNumber.getData()}", "${location.zip.getData()}", "${location.city.getData()}", "${location.country.getData()}");
2304
2305 document.getElementById("Veranstaltungsort").innerHTML = beautyNavUrl;
2306
2307 </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.