Suche ...
Fehler bei der Verarbeitung der Vorlage.
The following has evaluated to null or missing:
==> vr [in template "20523#20561#332719" at line 10, column 6]
----
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: vr = vr [in template "20523#20561#332719" at line 10, column 1]
----
1<#assign
2aui = PortletJspTagLibs["/META-INF/liferay-aui.tld"]
3liferay_portlet = PortletJspTagLibs["/META-INF/liferay-portlet-ext.tld"]
4liferay_security = PortletJspTagLibs["/META-INF/liferay-security.tld"]
5liferay_theme = PortletJspTagLibs["/META-INF/liferay-theme.tld"]
6liferay_ui = PortletJspTagLibs["/META-INF/liferay-ui.tld"]
7liferay_util = PortletJspTagLibs["/META-INF/liferay-util.tld"]
8portlet = PortletJspTagLibs["/META-INF/liferay-portlet.tld"]
9getterUtil = getterUtil
10vr = vr
11
12/>
13
14<@liferay_theme["defineObjects"]/>
15<@portlet["defineObjects"]/>
16
17<#-- Variablen setzen -->
18<#if vr?has_content>
19 <#assign
20 bis2017 = vr.bis2017
21 utils = vr.utils2017
22 ansicht = utils.ansicht
23 login_url= getterUtil.getString(themeDisplay.getThemeSetting("header-link-login"))
24 suchergebnisDienstleistung = bis2017.suchergebnisDienstleistung
25 suchergebnisEinrichtung = bis2017.suchergebnisEinrichtung
26 suchergebnisMitarbeiter = bis2017.suchergebnisMitarbeiter
27 themeDisplay = themeDisplay
28 renderRequest = renderRequest
29 renderResponse = renderResponse
30 plid = themeDisplay.getPlid()
31 createAccountURL = portletURLFactory.create(renderRequest,"com_liferay_login_web_portlet_LoginPortlet", plid, "RENDER_PHASE")
32
33 mitarbeiterShow = "vr-bis-detail-mitarbeiter-show"
34 einrichtungShow = "vr-bis-detail-einrichtung-show"
35 dienstleistungShow = "vr-bis-detail-dienstleistung-show"
36 />
37
38 ${createAccountURL.setParameter("mvcRenderCommandName", "/login/create_account")}
39 ${createAccountURL.setParameter("p_p_state", "maximized")}
40 ${createAccountURL.setParameter("p_p_mode", "view")}
41
42
43 <#assign vsmGebietID = ''>
44 <#assign eidDescriptionUrl = getterUtil.getString(themeDisplay.getThemeSetting("eid-description-url"))>
45 <#assign current_url_WithHtml = themeDisplay.getPortalURL()>
46 <#assign current_uri_WithHtml = themeDisplay.getURLCurrent()>
47 <#assign currentURL = current_url_WithHtml + current_uri_WithHtml>
48
49<#-- Ansicht für Suchergebnisse "bisview-suchergebnis" -->
50 <#assign searchPortlet = 'p_p_id_19_WAR_vrportlet_'>
51 <#assign searchPortletNumber = '18'>
52
53 <#assign searchBase = 'searchbox'>
54 <#assign searchInputComboBox = 'sucheInputFieldBorder'>
55 <#assign searchForm = 'searchForm'>
56 <#assign searchInput = 'sucheInputField'>
57 <#assign searchResultBox = 'searchBoxResult'>
58 <#assign searchResultDLGroup = 'mainCategoryDL'>
59 <#assign searchResultMBGroup = 'mainCategoryMB'>
60 <#assign searchResultERGroup = 'mainCategoryER'>
61
62 <script>
63 $(document).ready(function () {
64 $('.search-wrapper').append($("#${searchBase}"))
65 $('.searchToRemove').remove()
66 })
67 </script>
68
69
70
71 <div class="searchToRemove" style="display: none">
72 <div id="${searchBase}" class="row">
73 <div class="row">
74 <div class="col-12 col-sm-12 col-md-12 pt-1">
75 <form id="${searchForm}">
76 <label class="sr-only" for="${searchInput}">Suche</label>
77 <div
78 class="input-group"
79 id="${searchInputComboBox}"
80 role="combobox"
81 aria-expanded="false"
82 aria-owns="${searchResultBox}"
83 aria-haspopup="listbox"
84 aria-autocomplete="none"
85 >
86 <div class="input-group-prepend " aria-hidden="true">
87 <div class="input-group-text rounded-0" id="sucheInputFieldLabel"><label for="${searchInput}">Suche</label></div>
88 </div>
89 <input
90 id="${searchInput}"
91 name="searchQuery"
92 type="text"
93 class="form-control rounded-0"
94 autocomplete="off"
95 aria-autocomplete="none"
96 placeholder="Ihr Suchbegriff ..."
97 aria-controls="${searchResultBox}"
98 >
99 </div>
100 </form>
101 <div id="${searchResultBox}"
102 style="display: none;"
103 class="card"
104 role="listbox"
105 aria-label="Suchergebnisse"
106 >
107 <#if vr??>
108 <@searchResultGroup groupName='Dienstleistungen'/>
109 <@searchResultGroup groupName='Einrichtungen'/>
110 <@searchResultGroup groupName='Mitarbeitende'/>
111 </#if>
112 </div>
113 </div>
114 </div>
115 </div>
116 </div>
117
118 <script>
119 const searchPortlet = $('#${searchPortlet}');
120 const searchPortletInput = $('#form-element-query');
121
122 const searchBase = $('#${searchBase}');
123 const searchInputComboBox = $('#${searchInputComboBox}');
124 const searchForm = $('#${searchForm}');
125 const searchInput = $('#${searchInput}');
126 const searchResult = $('#${searchResultBox}');
127 const searchResultDLGroup = $('#${searchResultDLGroup}');
128 const searchResultMBGroup = $('#${searchResultMBGroup}');
129 const searchResultERGroup = $('#${searchResultERGroup}');
130 const resultLinks = '#${searchResultBox} .resultOption';
131 const doneTypingInterval = 500;
132 let typingTimer;
133
134 const arrow_keys_handler = function (e) {
135 switch (e.keyCode) {
136 case 37: //Arrow
137 case 39: //Arrow
138 case 38: //Arrow
139 case 40: //Arrow
140 e.preventDefault();
141 break; // Space
142 default:
143 break; // do not block other keys
144 }
145 };
146 $(document).ready(function() {
147 addListener();
148 $(document).on('keydown',function(event){
149 dropdownListNavigation(event);
150 let nextFocusItemID = getNextFocusElementId()
151 if(event.key === "Tab"){
152 if( searchBase.find($(':focus')).length === 1) {
153 if(searchInput[0].id !== nextFocusItemID){
154 //closeDropdown();
155 }
156 }
157 }
158 if(event.key === "Enter"){
159 if(searchResult.find($(':focus')).length === 1) {
160 event.preventDefault();
161 if(($(':focus').children()[0] !== undefined)){
162 $(':focus').children()[0].click();
163 }
164 }
165 }
166
167 });
168 });
169
170 $(document).on('keypress keyup',function(event){
171 if(clickHomeInSearchBox(event) || clickEndInSearchBox(event)){
172 event.preventDefault();
173 return false;
174 }
175 })
176
177 searchInput.on("keyup paste", function() {
178 $('#form-element-query').val(searchInput.val());
179 if (searchInput.val().length < 1) {
180 closeDropdown();
181 }
182 });
183
184 searchInput.on('keydown', function (event) {
185
186 if (event.key === "Escape") {
187 searchInput.val("");
188 $('[aria-selected="true"]').removeAttr('aria-selected')
189 closeDropdown();
190 }
191 if (clickHomeInSearchBox(event)){
192 event.preventDefault();
193 $(resultLinks)[0].focus()
194 $('[aria-selected="true"]').removeAttr('aria-selected')
195 $(resultLinks)[0].attr('aria-selected','true')
196 return false;
197 }
198 if (clickEndInSearchBox(event)){
199 event.preventDefault();
200 $(resultLinks)[$(resultLinks).length -1].focus()
201 $('[aria-selected="true"]').removeAttr('aria-selected')
202 $(resultLinks)[$(resultLinks).length -1].attr('aria-selected','true')
203 return false;
204 }
205 if (event.key === "Enter"){
206 event.preventDefault();
207 $(resultLinks)[0].focus()
208 $('[aria-selected="true"]').removeAttr('aria-selected')
209 $(resultLinks)[0].attr('aria-selected','true')
210
211 return false;
212 }
213 });
214
215 searchResult.on('keydown',function(event) {
216 if(searchResult.find($(':focus')).length === 1){
217 if (event.key === "Tab") {
218 closeDropdown();
219 }
220 if (event.key === "Escape") {
221 closeDropdown();
222 $('[aria-selected="true"]').removeAttr('aria-selected')
223 searchInput.focus();
224 }
225 if(clickHomeInSearchBox(event)){
226 event.preventDefault();
227
228 $(resultLinks)[0].focus();
229 $('[aria-selected="true"]').removeAttr('aria-selected')
230 $(resultLinks)[0].attr('aria-selected','true')
231 return false;
232 }
233 if(clickEndInSearchBox(event)){
234 event.preventDefault();
235 $('[aria-selected="true"]').removeAttr('aria-selected')
236 $(resultLinks)[$(resultLinks).length -1].focus()
237 $(resultLinks)[$(resultLinks).length -1].attr('aria-selected','true')
238 return false;
239 }
240 }
241 });
242
243 searchInput.on('keyup', function (event) {
244 if(event.key === "Enter"){
245 event.preventDefault();
246 event.key = "ArrowDown"
247 }
248 if (event.key === "ArrowDown" || event.key === "ArrowUp" ) {
249 if (isDropdownHidden() && searchInput.val().length > 1) {
250 ajax(
251 $(".search-form input").val(),
252 function (data) {
253 searchResult.empty();
254 searchResult.append($(data).find("#nothing"));
255 searchResult.append($(data).find("#mainCategoryDL"));
256 searchResult.append($(data).find("#mainCategoryMB"));
257 searchResult.append($(data).find("#mainCategoryER"));
258 //portlet.find('#searchCombobox').attr('aria-expanded', 'true');
259 //portlet.find('#searchResultList').attr('aria-hidden', 'false');
260 },
261 function(){
262 dropdownListNavigation(event);
263 }
264 )
265 }
266 }
267 });
268
269 function getNextFocusElementId(){
270 let nextFocusItem = $(':focus').next();
271 let nextFocusItemID = undefined
272 if(nextFocusItem[0] !== undefined && nextFocusItem[0] !== ""){
273 nextFocusItemID = nextFocusItem[0].id
274 }
275 return nextFocusItemID
276 }
277
278 function dropdownListNavigation(event) {
279 if(searchBase.find($(':focus')).length === 1){
280 if(!isDropdownHidden() && resultListHasContent()){
281 window.addEventListener("keydown", arrow_keys_handler, false);
282 let resultItemCount = $(resultLinks).length;
283 let currentFocus = searchResult.find($(':focus'));
284 let focusId = $(':focus')[0].id;
285 let index = getDropdownResultIndex(focusId);
286 switch(event.key) {
287 case 'ArrowUp':
288 dropdownListArrowUp(currentFocus,resultItemCount, index, focusId)
289 break;
290 case 'ArrowDown':
291 dropdownListArrowDown(currentFocus,resultItemCount, index, focusId)
292 break;
293 }
294 }
295 }else{
296 window.removeEventListener("keydown", arrow_keys_handler, false);
297 }
298 return true;
299 }
300
301 function openDropdown() {
302 searchResult.css('display', 'block');
303 searchResult.attr('aria-expanded', 'true');
304 searchInputComboBox.attr('aria-expanded', 'true');
305 }
306
307 function closeDropdown(){
308 searchResult.css('display', 'none');
309 searchResult.empty();
310 searchResult.attr('aria-expanded', 'false');
311 searchInputComboBox.attr('aria-expanded', 'false');
312 searchInput.attr('aria-activedescendant', '');
313 $('[aria-selected="true"]').removeAttr('aria-selected')
314 }
315
316 function isDropdownHidden(){
317 return searchInputComboBox.attr('aria-hidden') === "true";
318 }
319
320 function getDropdownResultIndex(id) {
321 let returningValue = undefined;
322 $(resultLinks).each(function (index, item) {
323 if (item.id === id) {
324 returningValue = index;
325 return false;
326 }
327 });
328 return returningValue;
329 }
330
331 function dropdownListArrowUp(currentFocus, resultItemCount, index, focusId){
332 $('[aria-selected="true"]').removeAttr('aria-selected')
333 if(currentFocus.length === 0 || index === 0) {
334 let link = '#' + $(resultLinks)[resultItemCount - 1].id;
335 if ($(link).length > 0) {
336 $(link).focus();
337 $(link).attr('aria-selected','true')
338 } else {
339 $(resultLinks)[resultItemCount - 1].focus();
340 $(resultLinks)[resultItemCount - 1].attr('aria-selected','true')
341 }
342 }else{
343 let link = '#' + $(resultLinks)[index-1].id ;
344 if ($(link).length > 0) {
345 $(link).focus();
346 $(link).attr('aria-selected','true')
347 } else {
348 $(resultLinks)[index-1].focus();
349 $(resultLinks)[index-1].attr('aria-selected','true')
350 }
351 }
352 searchInput.attr('aria-activedescendant',focusId);
353 }
354 function dropdownListArrowDown(currentFocus, resultItemCount, index, focusId){
355 $('[aria-selected="true"]').removeAttr('aria-selected')
356 if(currentFocus.length === 0 || $(resultLinks)[index+1] === undefined){
357 let link = '#' + $(resultLinks)[0].id;
358 if ($(link).length > 0) {
359 $(link).focus();
360 $(link).attr('aria-selected','true')
361 } else {
362 $(resultLinks)[0].focus();
363 $(resultLinks)[0].attr('aria-selected','true')
364 }
365 }else{
366 let link = '#' + $(resultLinks)[index+1].id;
367 if ($(link).length > 0) {
368 $(link).focus();
369 $(link).attr('aria-selected','true')
370 } else {
371 $(resultLinks)[index+1].focus();
372 $(resultLinks)[index+1].attr('aria-selected','true')
373 }
374 }
375 searchInput.attr('aria-activedescendant',focusId);
376 }
377 function addListener() {
378 searchInput.on("keydown", function (event) {
379 clearTimeout(typingTimer);
380 });
381 searchInput.on("keyup", function (event) {
382 clearTimeout(typingTimer);
383 typingTimer = setTimeout(()=>{
384 postSearchQuery(event, function(){})
385 }, doneTypingInterval);
386 });
387 }
388
389 function focusInSearchBox() {
390 return searchBase.find($(':focus')).length === 1;
391 }
392
393 function clickHomeInSearchBox(event) {
394 return event.keyCode === 36 && focusInSearchBox() && resultListHasContent();
395 }
396
397 function clickEndInSearchBox(event) {
398 return event.keyCode === 35 && focusInSearchBox() && resultListHasContent();
399 }
400
401 function resultListHasContent() {
402 return $(resultLinks).length > 0
403 }
404
405 function ajax(queryString, successFunction,completeFunction) {
406
407 let authToken = Liferay.authToken;
408 let url3 = "/?p_p_id=${searchPortletNumber}_WAR_vrportlet&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&_${searchPortletNumber}_WAR_vrportlet_action=vr-bis-detail-search-submit&p_auth="+authToken
409 jQuery.ajax({
410 url: url2,
411 data: {query:queryString},
412 type: 'POST',
413 success: successFunction
414 }).done(completeFunction)
415 }
416
417 function postSearchQuery(e, complete) {
418 if (![37, 39, 9, 13, 27,38,40,35,36,13].includes(e.keyCode)) {
419 if (searchInput.val().length > 1) {
420 ajax(
421 searchInput.val(),
422 function (data) {
423 searchResult.empty();
424 searchResult.append($(data).find("#${searchResultDLGroup}"));
425 searchResult.append($(data).find("#${searchResultERGroup}"));
426 searchResult.append($(data).find("#${searchResultMBGroup}"));
427 openDropdown();
428 },
429 complete
430 )
431 }
432 }
433 }
434
435 </script>
436
437
438<#------------------------------Einrichtung----------------------------------->
439
440
441 <#if bis2017.ausgewaehlteEinrichtung??>
442 <#assign einrichtung = bis2017.ausgewaehlteEinrichtung>
443 <div id="facilityDetail" class="facility-detail mb-3">
444 <div class="row"> <!-- Zwei Spalten -->
445 <div id="detailsLeft" class="col-md-8 pl"> <!-- Linke Spalte -->
446 <div id="infoCard" class="card-base card">
447 <div class="card-header">
448 <h2>
449 <span class="sideHeadline" id="seitentitel">
450 ${getFullFacilityName(einrichtung, 'siteTitle')}
451 </span>
452 <#if einrichtung.typ??>
453 <br/><span style="font-size: small;">${einrichtung.typ}</span>
454 </#if>
455 </h2>
456 </div>
457 <div class="card-body">
458 <#if existsAndHasContent(einrichtung.aktuelles!'')>
459 <div class=" mb-2 alert alert-info">
460 <h3 class="">Aktuelles</h3>
461 ${einrichtung.aktuelles}
462 </div>
463 </#if>
464
465 <#if existsAndHasContent(einrichtung.kurzbezeichnung!'')>
466 <h3 class="sr-only">Kurzbezeichnung</h3>
467 ${einrichtung.kurzbezeichnung}
468 </#if>
469
470 <#if existsAndHasContent(einrichtung.beschreibung!'')>
471 <div class="w-100 mb-2">
472 <h3 class="sr-only">Beschreibung</h3>
473 ${einrichtung.beschreibung}
474 </div>
475 </#if>
476
477 <#if existsAndHasContent(einrichtung.anschrift)>
478 <@createCard 'Anschrift', 'facilityAddress'>
479 <ul class="list-unstyled pl-0" style="list-style: none!important; padding-left: 0 !Important">
480 <li class=" mb-2" style="font-weight: 700;">
481 ${getFullFacilityName(einrichtung, 'facility-address-list')}
482 </li>
483 <#if einrichtung.anschrift.strasse?? || einrichtung.anschrift.hausnummer?? >
484 <li>
485 <#if einrichtung.anschrift.strasse??>${einrichtung.anschrift.strasse}</#if>
486 <#if einrichtung.anschrift.hausnummer??>${einrichtung.anschrift.hausnummer}</#if>
487 </li>
488 </#if>
489 <#if einrichtung.anschrift.postleitzahl?? || einrichtung.anschrift.ort??>
490 <li>
491 <#if einrichtung.anschrift.postleitzahl??>${einrichtung.anschrift.postleitzahl}</#if>
492 <#if einrichtung.anschrift.ort??>${einrichtung.anschrift.ort}</#if>
493 </li>
494 </#if>
495 <#if einrichtung.anschrift.postfach??>
496 <li class="mt-2">
497 <p class="m-0">
498 <span class="strong">Postfach: </span><br/>${einrichtung.anschrift.getPostfach()}
499 </p>
500 </li>
501 </#if>
502 <#if einrichtung.anschrift.zusatz??>
503 <li class="mt-2">
504 <p class="m-0">
505 <span class="strong">Adresszusatz: </span><br/>${einrichtung.anschrift.getZusatz()}
506 </p>
507 </li>
508 </#if>
509 </ul>
510 </@createCard>
511 </#if>
512
513 <#if einrichtung.anschrift.verkehrsanbindung?? || einrichtung.anschrift.anfahrtUrl??>
514 <@createCollapse 'Verkehrsanbindung','collapseTransportlinks'>
515 <#if einrichtung.anschrift.verkehrsanbindung??>
516 ${einrichtung.anschrift.verkehrsanbindung}
517 </#if>
518 <#if einrichtung.anschrift.anfahrtUrl??>
519 <#list einrichtung.anschrift.anfahrtUrl as url>
520 <a href="${url.uri}" title="${url.titel}">${url.titel}</a>
521 </#list>
522 </#if>
523 </@createCollapse>
524 </#if>
525
526 <#if existsAndHasContent(einrichtung.barrierefreieErreichbarkeit)>
527 <@createCollapse 'Barrierefreie Erreichbarkeit','collapseBarrierFreeAccessibility'>
528 ${einrichtung.barrierefreieErreichbarkeit}
529 </@createCollapse>
530 </#if>
531
532
533 <@addOpeninghours einrichtung 'Servicezeiten'/>
534
535 <#if existsAndHasContent(einrichtung.dienstleistungList)>
536 <@createCollapse 'Dienstleistungen der Einrichtung','collapseFacilityServiceList'>
537 <ul>
538 <#list einrichtung.dienstleistungList as dienstleistung>
539 <li>
540 <a href="${utils.createRenderUrl(renderResponse, dienstleistungShow, dienstleistung.id)}">${dienstleistung.name}</a>
541 </li>
542 </#list>
543 </ul>
544 </@createCollapse>
545 </#if>
546
547 </div>
548 </div>
549 </div>
550 <div id="detailsRight" class="col-md-4" style="overflow: visible"> <!-- Rechte Spalte -->
551 <div class="sticky-top">
552
553 <#if
554 existsAndHasContent(einrichtung.telefonnummer!'') ||
555 existsAndHasContent(einrichtung.faxnummer!'') ||
556 existsAndHasContent(einrichtung.email!'')
557 >
558 <@createCard 'Kontakt', 'facilityContact'>
559 <@createContact einrichtung/>
560 </@createCard>
561 </#if>
562
563 <#if existsAndHasContent(einrichtung.uebereinrichtung!)>
564 <@createCard 'Diese Einrichtung gehört zu', 'uebereinrichtung'>
565 <a href="${utils.createRenderUrl(renderResponse, einrichtungShow, einrichtung.uebereinrichtung.id)}">${getFullFacilityName(einrichtung.uebereinrichtung, 'uebereinrichtung')}</a>
566 </@createCard>
567 </#if>
568
569 <#if existsAndHasContent(einrichtung.untereinrichtungList!)>
570 <@createCard 'Zu dieser Einrichtung gehören', 'untereinrichtung'>
571 <ul style="padding-left:1.25rem;">
572 <#list einrichtung.untereinrichtungList as child>
573 <li>
574 <a href="${utils.createRenderUrl(renderResponse, einrichtungShow, child.id)}">${child.name}</a>
575 </li>
576 </#list>
577 </ul>
578 </@createCard>
579 </#if>
580
581 <#if existsAndHasContent(einrichtung.mitarbeiterList!)>
582 <@createCard 'Zuständige Kontaktperson', 'ZustaendigeKontaktperson'>
583 <ul class="list-unstyled p-0">
584 <#assign firstLoop = true>
585 <#list einrichtung.mitarbeiterList as mitarbeiter>
586 <li>
587 <#if firstLoop>
588 <#assign firstLoop = false>
589 <#else>
590 <hr class="mb-2" aria-hidden="true">
591 </#if>
592 <p class="sr-only m-0">Beschreibung der zuständigen Kontaktperson ${mitarbeiter.volleAnsprache()}</p>
593 <@createContact mitarbeiter >
594 <dt class="mb-0 sr-only">Voller Name:</dt>
595 <dd class="mb-0 "><h4 class="h5"><a href="${utils.createRenderUrl(renderResponse, mitarbeiterShow, mitarbeiter.id)}">${mitarbeiter.volleAnsprache()}</a></h4></dd>
596 <#if existsAndHasContent(mitarbeiter.position!'')>
597 <dt class="mb-0">Position:</dt>
598 <dd class="mb-0">${mitarbeiter.position}</dd>
599 </#if>
600 </@createContact>
601 </li>
602 </#list>
603 </ul>
604 </@createCard>
605 </#if>
606
607 <#if existsAndSizeGTZero(einrichtung.internetadressen)>
608 <@createCard header='Internetadressen' id='Internetadressen'>
609 <ul class="list-unstyled" style="padding-top:0 !important;padding-bottom:0 !important;">
610 <#list einrichtung.internetadressen as link>
611 <li>
612 <a href="${link.uri}"
613 target="${link.neuesFenster?string('_blank','_self')}"
614 >
615 ${link.titel}
616 </a>
617 </li>
618 </#list>
619 </ul>
620 </@createCard>
621 </#if>
622 </div>
623 </div>
624 </div>
625 </div>
626 </#if>
627
628<#-------------------Dienstleistungen-------------------------------------------------------------------------->
629
630
631 <#if bis2017.ausgewaehlteDienstleistung??>
632 <#assign
633 dienstleistung = bis2017.ausgewaehlteDienstleistung
634 textmodul = dienstleistung.textmodul
635 >
636
637 <div id="serviceDetail" class="service-detail mb-3">
638 <div class="row"> <!-- Zwei Spalten -->
639 <div id="detailsLeft" class="col-md-8 pl"> <!-- Linke Spalte -->
640 <div id="infoCard" class="card-base card">
641 <div class="card-header">
642 <h2>${dienstleistung.name}</h2>
643 <#if dienstleistung.tags??>
644 <ul class="p-0" aria-label="Dienstleistungslabel:" style="list-style: none;display: inline-flex;">
645 <#list dienstleistung.tags as t>
646 <li>
647 <span class="badge badge-secondary my-2">${t.name}</span>
648 </li>
649 </#list>
650 </ul>
651 </#if>
652 </div>
653 <div class="card-body">
654 <#if textmodul.kurztext.inhalt??>
655 <div class="lead">
656 <h3 class="sr-only">Kurzbeschreibung</h3>
657 ${textmodul.kurztext.inhalt}
658 </div>
659 </#if>
660
661 <#if textmodul.volltext.inhalt??>
662 <div>
663 <h3 class="sr-only">Beschreibung</h3>
664 ${textmodul.volltext.inhalt}
665 </div>
666 </#if>
667 <@collapseMacro "Rechtsgrundlagen" textmodul.rechtsgrundlagen!"" ""/>
668 <@collapseMacro "Unterlagen" textmodul.erforderlicheUnterlagen ""/>
669 <@collapseMacro "Fristen" textmodul.fristen ""/>
670 <@collapseMacro "Bearbeitungsdauer" textmodul.bearbeitungsdauer ""/>
671 <@collapseMacro "Weitere Informationen" textmodul.weiterfuehrendeInformationen ""/>
672 <@collapseMacro "Hinweise und Besonderheiten" textmodul.hinweiseBesonderheiten ""/>
673 <@collapseMacro "Voraussetzungen" textmodul.voraussetzungen ""/>
674 <@collapseMacro "Verfahrensablauf" textmodul.verfahrensablauf ""/>
675 <@collapseMacro "Rechtsbehelf" textmodul.rechtsbehelf ""/>
676
677 <#if existsAndHasContent(dienstleistung.kostenmodul.beschreibung!'') ||
678 existsAndHasContent(dienstleistung.kostenmodul.kosten!'')>
679 <@createCollapse 'Kosten','collapseKosten'>
680 <@kostenliste />
681 </@createCollapse>
682 </#if>
683 <#if dienstleistung.zahlungsweisen?? && dienstleistung.zahlungsweisen?has_content>
684 <@createCollapse 'Zahlungsweisen','collapseZahlungsweisen'>
685 <ul class="list-unstyled">
686 <#list dienstleistung.zahlungsweisen as zahlungsweise>
687 <li>${zahlungsweise.name}</li>
688 </#list>
689 </ul>
690 </@createCollapse>
691 </#if>
692 <#if dienstleistung.verwandteDienstleistungen?? && dienstleistung.verwandteDienstleistungen?has_content>
693 <@createCollapse 'Verwandte Dienstleistungen','collapseVerwandteDienstleistungen'>
694 <ul class="pl-4">
695 <#list dienstleistung.verwandteDienstleistungen as dl>
696 <li><a href="${utils.createRenderUrl(renderResponse, dienstleistungShow, dl.id)}">${dl.name}</a></li>
697 </#list>
698 </ul>
699 </@createCollapse>
700 </#if>
701 </div>
702 </div>
703 </div>
704 <div id="detailsRight" class="col-md-4" style="overflow: visible"> <!-- Rechte Spalte -->
705 <div class="sticky-top">
706 <!-- TODO-->
707 <#assign hasTextmodulFormulare = false>
708 <#if textmodul.formulare??>
709 <#list textmodul.formulare.weiterfuehrenderLink as formular>
710 <#assign hasTextmodulFormulare = true>
711 </#list>
712 </#if>
713
714 <#if existsAndSizeGTZero(dienstleistung.extensions) ||
715 existsAndSizeGTZero(dienstleistung.formulare) ||
716 (dienstleistung.kontaktformularUrl?? && dienstleistung.kontaktformularUrl?has_content) ||
717 existsAndSizeGTZero(dienstleistung.textmodul.formulare.weiterfuehrenderLink)>
718 <#assign hasUsableOptions = false>
719 <#assign needsLogin = false>
720 <#assign needsEIDLogin = false>
721 <div id="onlineServices" class="card-base card">
722 <div class="card-header">
723 <h3>Onlinedienstleistung</h3>
724 </div>
725 <div class="card-body">
726 <ul id="onlineServicesListe">
727 <#if existsAndHasContent(dienstleistung.extensions!'')>
728 <!--extension -->
729 <#assign userAuthLevel = utils.getAuthLevel(renderRequest)>
730
731 <#list dienstleistung.extensions as formular>
732 <#if userAuthLevel gte formular.minAuthLevel>
733 <!--hasUsableOptions -->
734 <#assign hasUsableOptions = true>
735 <#else>
736 <#if formular.minAuthLevel lt 2>
737 <!--needsLogin -->
738 <#assign needsLogin = true>
739 <#else>
740 <!--needsEIDLogin -->
741 <#assign needsEIDLogin = true>
742 </#if>
743 </#if>
744 </#list>
745 </#if>
746 <#if existsAndHasContent(dienstleistung.formulare!'')>
747 <!--fs -->
748 <#if dienstleistung.nutzbarAlsGast || (userIsLoggedIn() && !dienstleistung.nutzbarAlsGast)>
749 <!--hasUsableOptions -->
750 <#assign hasUsableOptions = true>
751 <#else>
752 <!--needsLogin -->
753 <#assign needsLogin = true>
754 </#if>
755 </#if>
756 <#if existsAndHasContent(dienstleistung.kontaktformularUrl!'')>
757 <!--kontakt -->
758 <#if dienstleistung.nutzbarAlsGast || (userIsLoggedIn() && !dienstleistung.nutzbarAlsGast)>
759 <!--hasUsableOptions -->
760 <#assign hasUsableOptions = true>
761 <#else>
762 <!--needsLogin -->
763 <#assign needsLogin = true>
764 </#if>
765 </#if>
766 <#if existsAndHasContent(textmodul.formulare!'')>
767 <#list textmodul.formulare.weiterfuehrenderLink as formular>
768 <!--link -->
769 <!--hasUsableOptions -->
770 <#assign hasUsableOptions = true>
771 </#list>
772 </#if>
773 <#if hasUsableOptions>
774 <li class="onlineServicesKategorie" aria-label="<#if !userIsLoggedIn()>Ohne Anmeldung im Portal<#else>Aktuell</#if> nutzbare Dienstleistungen">
775 <h4 class="sr-only">${userIsLoggedIn()?string('Mit aktueller Anmeldung im Portal nutzbar','Ohne Anmeldung im Portal nutzbar')}</h4>
776 <ul class="onlineServicesKategorieListe">
777 <!-- extensions -->
778 <#if existsAndHasContent(dienstleistung.extensions!'')>
779 <#assign userAuthLevel = utils.getAuthLevel(renderRequest) />
780 <#list dienstleistung.extensions as formular>
781 <#if userAuthLevel gte formular.minAuthLevel>
782 <#assign hatGastOptionen = true />
783 <li><a href="${formular.uri}" class="btn btn-primary">${formular.titel}</a></li>
784 </#if>
785 </#list>
786 </#if>
787 <!-- formulare -->
788 <#if dienstleistung.nutzbarAlsGast || (userIsLoggedIn() && !dienstleistung.nutzbarAlsGast)>
789 <#if existsAndHasContent(dienstleistung.formulare!'')>
790 <#list dienstleistung.formulare as formular>
791 <li><a href="${formular.uri}" class="btn btn-primary">${formular.titel}</a></li>
792 </#list>
793 </#if>
794 </#if>
795 <!-- textmodul -->
796 <#if existsAndHasContent(dienstleistung.textmodul.formulare!'')>
797 <#list dienstleistung.textmodul.formulare.weiterfuehrenderLink as formular>
798 <li><a href="${formular.uri}" class="btn btn-primary">${formular.titel}</a></li>
799 </#list>
800 </#if>
801 <!-- kontaktformularUrl -->
802 <#if dienstleistung.nutzbarAlsGast || (userIsLoggedIn() && !dienstleistung.nutzbarAlsGast)>
803 <#if existsAndHasContent(dienstleistung.kontaktformularUrl!'')>
804 <li><a href="${dienstleistung.kontaktformularUrl}" class="btn btn-primary">Zum Kontaktformular</a></li>
805 </#if>
806 </#if>
807 </ul>
808 </li>
809 </#if>
810 <#if needsLogin>
811 <li class="onlineServicesKategorie" aria-label="Mit Anmeldung imPortal nutzbare Dienstleistungen">
812 <#if hasUsableOptions> <hr> </#if>
813 <h4 class="">Mit Anmeldung im Portal nutzbar</h4>
814 <ul class="onlineServicesKategorieListe">
815 <#if existsAndHasContent(dienstleistung.extensions!'')>
816 <#assign userAuthLevel = utils.getAuthLevel(renderRequest) />
817 <#list dienstleistung.extensions as formular>
818 <#if userAuthLevel lt formular.minAuthLevel>
819 <#if formular.minAuthLevel == 1>
820 <li><a ${createLoginURL(formular.uri)} class="btn btn-primary">${formular.titel}</a></li>
821 </#if>
822 </#if>
823 </#list>
824 </#if>
825 <#if !userIsLoggedIn() && !dienstleistung.nutzbarAlsGast>
826 <#if existsAndHasContent(dienstleistung.formulare!'')>
827 <#list dienstleistung.formulare as formular>
828 <li><a ${createLoginURL(formular.uri)} class="btn btn-primary">${formular.titel}</a></li>
829 </#list>
830 </#if>
831 </#if>
832 <#if !userIsLoggedIn() && !dienstleistung.nutzbarAlsGast>
833 <#if existsAndHasContent(dienstleistung.kontaktformularUrl!'')>
834 <li><a ${createLoginURL(dienstleistung.kontaktformularUrl)} class="btn btn-primary">Zum Kontaktformular</a></li>
835 </#if>
836 </#if>
837 </ul>
838 </li>
839 </#if>
840 <#if needsEIDLogin>
841 <#if hasUsableOptions || needsLogin> <hr> </#if>
842 <li class="onlineServicesKategorie" aria-label="Mit eID-Anmeldung im Portal nutzbare Dienstleistungen">
843 <h4 class="">Mit eID im Portal nutzbar</h4>
844 <ul class="onlineServicesKategorieListe">
845 <#if existsAndHasContent(dienstleistung.extensions!'')>
846 <#assign userAuthLevel = utils.getAuthLevel(renderRequest) />
847 <#list dienstleistung.extensions as formular>
848 <#if userAuthLevel lt formular.minAuthLevel>
849 <#if formular.minAuthLevel gt 1>
850 <li><a href="${eidDescriptionUrl}?dlname=${dienstleistung.name}&dlurl=${themeDisplay.getURLCurrent()}" class="btn btn-primary">${formular.titel}</a></li>
851 </#if>
852 </#if>
853 </#list>
854 </#if>
855 </ul>
856 </li>
857 </#if>
858 </ul>
859 </div>
860 </div>
861 </#if>
862 <#if existsAndHasContent(dienstleistung.dokumentList!)>
863 <@createCard 'Downloads','downloads'>
864 <ul class="list-unstyled">
865 <#list dienstleistung.dokumentList as dokument>
866 <li>
867 <#assign url = renderResponse.createResourceURL() />
868 ${url.setResourceID("vr-bis-detail-document-download")}
869 ${url.setParameter("id", "${dokument.id}")}
870 <a class="btn btn-primary"
871 href="${url}"
872 aria-label="Download: ${dokument.name}"
873 title="Download: ${dokument.name}"
874 target="_blank" download>
875 <i class="bi bi-file-earmark"></i>${dokument.name}
876 </a>
877 </li>
878 </#list>
879 </ul>
880 </@createCard>
881 </#if>
882 <#if existsAndSizeGTZero(dienstleistung.einrichtungList)>
883 <@createCard (dienstleistung.einrichtungList?size gt 1)?string('Zuständige Einrichtungen','Zuständige Einrichtung'),'zustaendigeEinrichtungen'>
884 <#list dienstleistung.einrichtungList>
885 <ul class="list-unstyled pl-0">
886 <#items as einrichtung>
887 <li>
888 <dl class="el--contact__list mb-0">
889 <dt class="mb-0 sr-only">Name der Einrichtung</dt>
890 <dd class="mb-0 "><h4 class="h5"><a href="${utils.createRenderUrl(renderResponse, einrichtungShow, einrichtung.id)}">${getFullFacilityName(einrichtung, 'dl-facility-address')}</a></h4></dd>
891 <#if existsAndHasContent(einrichtung.anschrift!'')>
892 <dt class="mb-0 sr-only">Anschrift der Einrichtung</dt>
893 <dd class="mb-0 mb-2">
894 <@createAddress einrichtung/>
895 </dd>
896 </#if>
897 <@createContact einrichtung,false/>
898 </dl>
899 <#sep><@getSeperator/></#sep>
900 </li>
901 </#items>
902 </ul>
903 </#list>
904 </@createCard>
905 </#if>
906 <#if existsAndHasContent(dienstleistung.mitarbeiterList!)>
907 <@createCard (dienstleistung.mitarbeiterList?size gt 1)?string('Zuständige Kontaktperson','Zuständige Kontaktpersonen'),'zustaendigeEinrichtungen'>
908 <#list dienstleistung.mitarbeiterList >
909 <ul class="list-unstyled">
910 <#items as mitarbeiter>
911 <li>
912 <p class="sr-only m-0">Beschreibung der zuständigen Kontaktperson${mitarbeiter.volleAnsprache()}</p>
913 <dl class="el--contact__list">
914 <dt class="mb-0 sr-only">Voller Name:</dt>
915 <dd class="mb-0">
916 <h4 class="h5">
917 <a href="${utils.createRenderUrl(renderResponse, mitarbeiterShow, mitarbeiter.id)}">
918 ${mitarbeiter.volleAnsprache()}
919 </a>
920 </h4>
921 </dd>
922 <#if existsAndHasContent(mitarbeiter.position!'')>
923 <dt class="mb-0">Position:</dt>
924 <dd class="mb-0">${mitarbeiter.position}</dd>
925 </#if>
926 <@createContact mitarbeiter, false/>
927 </dl>
928 <#sep><@getSeperator/></#sep>
929 </li>
930 </#items>
931 </ul>
932 </#list>
933 </@createCard>
934 </#if>
935 <#if
936 existsAndHasContent(textmodul.volltext.weiterfuehrenderLink!'') ||
937 existsAndHasContent(textmodul.kurztext.weiterfuehrenderLink!'') ||
938 existsAndHasContent(textmodul.rechtsgrundlagen.weiterfuehrenderLink!'') ||
939 existsAndHasContent(textmodul.erforderlicheUnterlagen.weiterfuehrenderLink!'') ||
940 existsAndHasContent(textmodul.voraussetzungen.weiterfuehrenderLink!'') ||
941 existsAndHasContent(textmodul.verfahrensablauf.weiterfuehrenderLink!'') ||
942 existsAndHasContent(textmodul.weiterfuehrendeInformationen.weiterfuehrenderLink!'') ||
943 existsAndHasContent(textmodul.hinweiseBesonderheiten.weiterfuehrenderLink!'') ||
944 existsAndHasContent(textmodul.rechtsbehelf.weiterfuehrenderLink!'') ||
945 existsAndHasContent(textmodul.bearbeitungsdauer.weiterfuehrenderLink!'') ||
946 existsAndHasContent(textmodul.fristen.weiterfuehrenderLink!'')>
947 <@createCard 'Weiterführende Links','weiterfuehrendeLinks'>
948 <ul class="">
949 ${linklooper(dienstleistung.textmodul.volltext)}
950 ${linklooper(dienstleistung.textmodul.kurztext)}
951 ${linklooper(dienstleistung.textmodul.rechtsgrundlagen)}
952 ${linklooper(dienstleistung.textmodul.erforderlicheUnterlagen)}
953 ${linklooper(dienstleistung.textmodul.voraussetzungen)}
954 ${linklooper(dienstleistung.textmodul.verfahrensablauf)}
955 ${linklooper(dienstleistung.textmodul.weiterfuehrendeInformationen)}
956 ${linklooper(dienstleistung.textmodul.hinweiseBesonderheiten)}
957 ${linklooper(dienstleistung.textmodul.rechtsbehelf)}
958 ${linklooper(dienstleistung.textmodul.bearbeitungsdauer)}
959 ${linklooper(dienstleistung.textmodul.fristen)}
960 </ul>
961 </@createCard>
962 </#if>
963 </div>
964 </div>
965 </div>
966 </div>
967 </#if>
968
969<#---------------Mitarbeiter--------------------------------------------------------->
970
971 <#if bis2017.ausgewaehlterMitarbeiter??>
972 <#assign
973 mitarbeiter = bis2017.ausgewaehlterMitarbeiter
974 />
975 <div id="employeeDetail" class="employee-detail mb-3">
976 <div class="row">
977 <div id="detailsLeft" class="col-md-8 pl">
978 <div id="infoCard" class="card-base card">
979 <div class="card-header">
980 <h2>${mitarbeiter.getName()}
981 <#if mitarbeiter.position??>
982 <br/><span style="font-size: small;">${mitarbeiter.position}</span>
983 </#if>
984 </h2>
985 </div>
986
987 <div class="card-body">
988 <#if mitarbeiter.beschreibung??>
989 <div class="w-100">
990 <h3 class="sr-only">Beschreibung</h3>
991 ${mitarbeiter.beschreibung}
992 </div>
993 </#if>
994 <#if mitarbeiter.beschreibungIntern??>
995 <div class="w-100">
996 <h3 class="sr-only">Beschreibung Intern</h3>
997 ${mitarbeiter.beschreibungIntern}
998 </div>
999 </#if>
1000 <@addOpeninghours mitarbeiter 'Servicezeiten'/>
1001
1002 <#if existsAndSizeGTZero(mitarbeiter.dienstleistungList)>
1003 <@createCard 'Dienstleistungen','employeeServiceList'>
1004 <#list mitarbeiter.dienstleistungList>
1005 <ul>
1006 <#items as dienstleistung>
1007 <li>
1008 <a href="${utils.createRenderUrl(renderResponse, dienstleistungShow, dienstleistung.id)}">${dienstleistung.name}</a>
1009 </li>
1010 </#items>
1011 </ul>
1012 </#list>
1013 </@createCard>
1014 </#if>
1015 </div>
1016 </div>
1017 </div>
1018 <div id="detailsRight" class="col-md-4" style="overflow: visible">
1019 <div class="sticky-top">
1020 <#if existsAndHasContent(mitarbeiter.telefonnummer!'') || existsAndHasContent(mitarbeiter.mobil!'') || existsAndHasContent(mitarbeiter.faxnummer!'') || existsAndHasContent(mitarbeiter.email!'')>
1021 <@createCard 'Kontakt','employeeContact'>
1022 <@createContact mitarbeiter/>
1023 </@createCard>
1024 </#if>
1025 <#if existsAndHasContent(mitarbeiter.portrait!)>
1026 <@createCard 'Mitarbeitenden Portrait','employeePortrait'>
1027 <img src="${mitarbeiter.portrait}" alt="Mitarbeitenden Portrait"/>
1028 </@createCard>
1029 </#if>
1030 <#if existsAndHasContent(mitarbeiter.einrichtungList!)>
1031 <@createCard (mitarbeiter.einrichtungList?size gt 1)?string('Zuständige Einrichtungen','Zuständige Einrichtung'),'employeeAmt'>
1032 <#list mitarbeiter.einrichtungList>
1033 <ul>
1034 <#items as einrichtung>
1035 <li>
1036 <a href="${utils.createRenderUrl(renderResponse, einrichtungShow, einrichtung.id)}">${getFullFacilityName(einrichtung, 'employee-facility-list')}</a>
1037 <#sep><@getSeperator/></#sep>
1038 </li>
1039 </#items>
1040 </ul>
1041 </#list>
1042 </@createCard>
1043 </#if>
1044 <#if existsAndHasContent(mitarbeiter.einrichtungList!'')>
1045 <#assign einrichtung = mitarbeiter.einrichtungList[0]>
1046 <#if einrichtung.anschrift??>
1047 <@createCard 'Anschrift','employeeAnschrift'>
1048 <@createAddress einrichtung>
1049 <dt class="mb-0 sr-only">Name der Einrichtung:</dt>
1050 <dd class="mb-0 ">${getFullFacilityName(einrichtung,'facility-address-list')}</dd>
1051 <#if mitarbeiter.raum?? && mitarbeiter.raum?has_content>
1052 <dt class="mb-0 Raum:">Name der Einrichtung:</dt>
1053 <dd class="mb-0 ">${mitarbeiter.raum}</dd>
1054 </#if>
1055 </@createAddress>
1056 </@createCard>
1057 </#if>
1058 </#if>
1059 </div>
1060 </div>
1061 </div>
1062 </div>
1063 </#if>
1064</#if>
1065
1066<#function getFullFacilityName einrichtung spanClass>
1067 <#assign
1068 getFullFacilityNameCounter = 1
1069 einrichtungsname = ''
1070 />
1071 <#if einrichtung.breadcrumb??>
1072 <#list einrichtung.breadcrumb as i>
1073 <#if i.showAlways && i.name != einrichtung.name>
1074 <#assign
1075 einrichtungsname = einrichtungsname+' <span class="facility-name-level-'+getFullFacilityNameCounter+' '+spanClass+'">'+i.name+' </span>'
1076 getFullFacilityNameCounter = getFullFacilityNameCounter+1
1077 />
1078 </#if>
1079 </#list>
1080 </#if>
1081 <#if einrichtungsname == ''>
1082 <#assign einrichtungsname = '<span class="facility-name-level-1 '+spanClass+'">'+einrichtung.name+'</span>' />
1083 <#else>
1084 <#assign einrichtungsname = einrichtungsname+'<span class="facility-name-level-'+getFullFacilityNameCounter+' '+spanClass+'">'+einrichtung.name+' </span>' />
1085 </#if>
1086 <#return einrichtungsname />
1087</#function>
1088
1089<#macro kostenliste>
1090 <#if existsAndHasContent(dienstleistung.kostenmodul.beschreibung!) || existsAndHasContent(dienstleistung.kostenmodul.kosten!)>
1091 <#if existsAndHasContent(dienstleistung.kostenmodul.kosten!)>
1092 <#assign showDescription = false />
1093 <#list dienstleistung.kostenmodul.kosten as kosten>
1094 <#if existsAndHasContent(kosten.beschreibung!)>
1095 <#assign showDescription = true />
1096 </#if>
1097 </#list>
1098 <table class="w-100">
1099 <thead>
1100 <tr>
1101 <th <#if showDescription> style="width:40%" <#else> style="width:80%" </#if>
1102 class="pl-0 pr-2 py-2">Name
1103 </th>
1104 <th class="p-2 d-none">Typ</th>
1105 <th <#if showDescription> style="width:15%" <#else> style="width:20%" </#if>
1106 class="p-2">Kosten</th>
1107 <#if showDescription>
1108 <th class="p-2" style="width:45%">Beschreibung</th>
1109 </#if>
1110 </tr>
1111 </thead>
1112 <tbody>
1113 <#list dienstleistung.kostenmodul.kosten as kosten>
1114 <tr>
1115 <td class="pl-0 pr-2 py-2">${kosten.name}</td>
1116 <td class="p-2 d-none">
1117 <#if kosten.typ?? && kosten.typ?length gt 0>
1118 <#assign kostenTypeName = kosten.typ+'' />
1119 ${kostenTypeName?substring(0, 1)?upper_case}${kostenTypeName?substring(1)?lower_case}
1120 <#else>
1121 <span class="sr-only">Keine Angabe</span>
1122 </#if>
1123 </td>
1124 <td class="p-2">
1125 <#if kosten.isKostenfrei()>
1126 kostenfrei
1127 <#elseif kosten.isKostenVariabel()>
1128 zwischen ${utils.formatCurrency(kosten.von)} und ${utils.formatCurrency(kosten.bis)} EUR
1129 <#else>
1130 ${utils.formatCurrency(kosten.von)} EUR
1131 </#if>
1132 </td>
1133 <#if showDescription>
1134 <td class="p-2"> <#if kosten.beschreibung??> ${kosten.beschreibung} </#if></td>
1135 </#if>
1136 </tr>
1137 </#list>
1138 </tbody>
1139 </table>
1140 </#if>
1141 ${dienstleistung.kostenmodul.beschreibung}
1142 </#if>
1143</#macro>
1144
1145<#macro collapseMacro title modul links>
1146 <#if modul.inhalt?? && modul.inhalt?has_content>
1147 <#assign collapseId = title?replace(" ", "")?replace('&','')?replace('§','') />
1148 <@createCollapse title,"collapse${collapseId}">
1149 ${modul.inhalt}
1150 </@createCollapse>
1151 </#if>
1152</#macro>
1153
1154<#function getLabelName dienstleistung pathName default >
1155<#-- <#if dienstleistung.labels?? && dienstleistung.labels?has_content>
1156 ${dienstleistung.labels?size}
1157 <#if dienstleistung.labels.getOrDefault(pathName, default)?? && dienstleistung.labels.getOrDefault(pathName, default)?has_content>
1158 <#return dienstleistung.labels.getOrDefault(pathName, default) />
1159 </#if>
1160 <#else>-->
1161 <#return default>
1162<#-- </#if>-->
1163</#function>
1164
1165<#function linklooper linkList>
1166 <#assign
1167 value = ""
1168 class = ""
1169 target = ""
1170 />
1171 <#if linkList??>
1172 <#list linkList.weiterfuehrenderLink as link>
1173 <#assign
1174 value = value + "<li><a href='${link.uri}' title='${link.titel}' class='${class}' target='${link.neuesFenster?string('_blank','_self')}'>${link.titel}</a></li>"/>
1175 </#list>
1176 </#if>
1177 <#return value>
1178</#function>
1179
1180<#function createLoginURL destination>
1181 <#assign
1182 login_url1_WithHtml = 'href="'+ login_url +'?p_p_id=com_liferay_login_web_portlet_LoginPortlet&p_p_lifecycle=0&_com_liferay_login_web_portlet_LoginPortlet_redirect='
1183 login_url2_WithHtml = '" rel="nofollow" data-redirect="true"'
1184 login_url_WithHtml = login_url1_WithHtml + destination + login_url2_WithHtml
1185 />
1186 <#return login_url_WithHtml />
1187</#function>
1188
1189
1190<#macro portletSearch>
1191 <script>
1192 $(document).ready( function() {
1193 const trigger = $('.search-detail');
1194
1195 $('html').click(function() {
1196 console.log("hide")
1197 });
1198
1199 $(trigger).click(function(event){
1200 console.log("EGAL!")
1201 event.stopPropagation();
1202 });
1203 });
1204 </script>
1205
1206 <script>
1207 $(document).ready(function () {
1208 $(".search-placeholder").append(jQuery(".search-area").parent().parent());
1209 $(".search-placeholder").append(jQuery("#wait"));
1210 $(".search-placeholder").append(jQuery("#resp").parent());
1211 });
1212
1213 $('#co').submit(function (evt) {
1214 evt.preventDefault();
1215 });
1216 </script>
1217 <div id="search-dropdown" <#if !bis2017.ausgewaehlteDienstleistung?? || !bis2017.ausgewaehlteEinrichtung?? || !bis2017.ausgewaehlterMitarbeiter??> style="display: none !important" </#if>>
1218 <div id="resp">
1219 <#if vr??>
1220 <script>
1221 $(".search-placeholder").addClass("search-with-results");
1222 $("#form-element-query").keyup(function () {
1223
1224 if (!this.value) {
1225 $(".search-placeholder.search").removeClass("search-with-results");
1226 }
1227
1228 });
1229 </script>
1230 <div class="row mt-3">
1231 <div class="col-12">
1232 <div class="search-detail">
1233 <#if bis2017.ausgewaehlteDienstleistung?? && bis2017.ausgewaehlteEinrichtung?? && bis2017.ausgewaehlterMitarbeiter?? && (!dienstleistung) && (!mitarbeiter) && (!einrichtung)>
1234 <p>Es gab keine Treffer zu Ihrer Suchanfrage.</p>
1235 <#else>
1236 <div class="row">
1237
1238 <#if suchergebnisDienstleistung??>
1239 <div class="col-12 col-sm-12 col-md-6 col-lg-4 col-xl-4">
1240 <h2>Dienstleistungen (${suchergebnisDienstleistung?size}</h2>
1241 <ol>
1242 <#list suchergebnisDienstleistung as i>
1243 <li class="mb-2">
1244 <a href="${utils.getDienstleistungUrl(i.id)}" class="el--search__form__assist__kat__list__item">${i.name}</a>
1245 </li>
1246 </#list>
1247 </ol>
1248 </div>
1249 </#if>
1250
1251 <#if suchergebnisEinrichtung??>
1252 <div class="col-12 col-sm-12 col-md-6 col-lg-4 col-xl-4">
1253 <h2>Einrichtungen (${suchergebnisEinrichtung?size})</h2>
1254 <ol>
1255 <#list suchergebnisEinrichtung as i>
1256 <li class="mb-2">
1257 <a href="${utils.getEinrichtungUrl(i.id)}" class="el--search__form__assist__kat__list__item">${i.name}</a>
1258 </li>
1259 </#list>
1260 </ol>
1261 </div>
1262 </#if>
1263
1264 <#if suchergebnisMitarbeiter??>
1265 <div class="col-12 col-sm-12 col-md-6 col-lg-4 col-xl-4">
1266 <h2>Ansprechpartner (${suchergebnisMitarbeiter?size})</h2>
1267 <ol>
1268 <#list suchergebnisMitarbeiter as i>
1269 <li class="mb-2">
1270 <a href="${utils.getMitarbeiterUrl(i.id)}" class="el--search__form__assist__kat__list__item">${i.volleAnsprache()}</a>
1271 </li>
1272 </#list>
1273 </ol>
1274 </div>
1275 </#if>
1276 </div>
1277 </#if>
1278 </div>
1279 </div>
1280 </div>
1281 </#if>
1282 </div>
1283 </div>
1284 <div class="search-styling">
1285 <div class="card p-4">
1286 <div class="search-placeholder search">
1287 <h1>Suche</h1>
1288 </div>
1289 </div>
1290 </div>
1291</#macro>
1292
1293<#function createPersoIcon class>
1294 <#return '<i aria-label="Icon-Elektronischer Personalausweis" class="'+class+'"><img aria-hidden="true" style="background: white;border-radius: 0.2rem;width: auto;height: 16px;display: inline;vertical-align: baseline;" class="persoIcon '+class+'" src ="/o/bot-theme/images/perso.svg" alt=""/></i>' />
1295</#function>
1296
1297<#macro externContentLoader headline content contentUrl privacyTitle privacyUrl showButtonText hideButtonText>
1298 <div class="externContentLoader" aria-hidden="true">
1299 <div class="row">
1300 <div class="col-12 contentCol">
1301 <div class="extern-hide">
1302 ${headline}
1303 ${content}
1304 </div>
1305 <div class="extern-show d-none" data-content="${contentUrl}"></div>
1306 </div>
1307 <div class="col-6 mt-2">
1308 <button class="btn btn-primary load-extern">
1309 ${showButtonText}
1310 </button>
1311 <button class="btn btn-primary remove-extern d-none">
1312 ${hideButtonText}
1313 </button>
1314 </div>
1315 <div class="col-6 mt-3 privacyUrl">
1316 <a href="${privacyUrl}">
1317 ${privacyTitle}
1318 </a>
1319 </div>
1320 </div>
1321 </div>
1322
1323 <script>
1324 $(document).ready(function(){
1325
1326 function loadExtern(element,url){
1327 $(element).append('<iframe style="height: 100%" src=' + url +' width="100%"></iframe>');
1328 }
1329
1330 function removeExtern(element){
1331 $(element).remove();
1332 }
1333
1334 function showContent(contentElement,buttonElement){
1335 contentElement.removeClass("d-none");
1336 buttonElement.removeClass("d-none");
1337 contentElement.addClass("d-block");
1338 buttonElement.addClass("d-block");
1339 }
1340 function hideContent(contentElement,buttonElement){
1341 contentElement.removeClass("d-block");
1342 buttonElement.removeClass("d-block");
1343 contentElement.addClass("d-none");
1344 buttonElement.addClass("d-none");
1345 }
1346 function findClosest(element,toFindElement){
1347 return $(element).find(toFindElement);
1348 }
1349
1350 function getParent(element){
1351 return $(element).closest(".externContentLoader");
1352 }
1353
1354 $(".load-extern").on("click",function(){
1355 let parent = getParent(this);
1356 let externShow = findClosest(parent,".extern-show");
1357 let externHide = findClosest(parent,".extern-hide");
1358 let externShowBtn = $(this);
1359 let externHideBtn = findClosest(parent,".remove-extern");
1360
1361
1362 showContent(externShow,externHideBtn);
1363 hideContent(externHide,externShowBtn);
1364 loadExtern(externShow,$(externShow).attr("data-content"))
1365 })
1366
1367 $(".remove-extern").on("click",function(){
1368 let parent = getParent(this);
1369 let externShow = findClosest(parent,".extern-show");
1370 let externHide = findClosest(parent,".extern-hide");
1371 let externShowBtn = findClosest(parent,".load-extern");
1372 let externHideBtn = $(this);
1373
1374 hideContent(externShow,externHideBtn);
1375 showContent(externHide,externShowBtn);
1376 removeExtern(externShow.children());
1377 })
1378 })
1379 </script>
1380</#macro>
1381
1382<#macro searchResultGroup groupName>
1383 <#assign searchResult = ''>
1384 <#assign baseID = ''>
1385 <#assign idPrefix = ''>
1386
1387 <#if groupName == 'Dienstleistungen'>
1388 <#assign searchResult = suchergebnisDienstleistung>
1389 <#assign baseID = 'mainCategoryDL'>
1390 <#assign idPrefix = 'dl'>
1391 </#if>
1392 <#if groupName == 'Einrichtungen'>
1393 <#assign searchResult = suchergebnisEinrichtung>
1394 <#assign baseID = 'mainCategoryER'>
1395 <#assign idPrefix = 'er'>
1396 </#if>
1397 <#if groupName == 'Mitarbeitende'>
1398 <#assign searchResult = suchergebnisMitarbeiter>
1399 <#assign baseID = 'mainCategoryMB'>
1400 <#assign idPrefix = 'mb'>
1401 </#if>
1402
1403 <ul role="group" aria-describedby="${idPrefix}0" id="${baseID}">
1404 <li role="presentation" id="${idPrefix}0">${groupName} (<#if searchResult?has_content>${searchResult?size}<#else>0</#if>)</li>
1405 <#assign hits = searchResult?size />
1406 <#if searchResult?has_content>
1407 <#if searchResult?size gt 0>
1408 <#list searchResult as item>
1409 <#assign showSynonyme = false>
1410 <#if groupName == 'Dienstleistungen'>
1411 <#assign url = utils.getDienstleistungUrl(item.id)>
1412 </#if>
1413 <#if groupName == 'Einrichtungen'>
1414 <#assign url = utils.getEinrichtungUrl(item.id)>
1415 </#if>
1416 <#if groupName == 'Mitarbeitende'>
1417 <#assign url = utils.getMitarbeiterUrl(item.id)>
1418 </#if>
1419 <li tabindex="0" role="option" class="result-cell resultOption" id="${idPrefix}${item.id}">
1420 <a id="${idPrefix}Item${item.id}" href="${url}" class="searchListResultItem">${item.name}</a>
1421 </li>
1422 </#list>
1423 <#else>
1424 <li tabindex="0" role="option" class="result-cell resultOption" id="${idPrefix}1">
1425 <span class="ml-0">Es gab keine Treffer in dieser Kategorie.</span>
1426 </li>
1427 </#if>
1428 <#else>
1429 <li tabindex="0" role="option" class="result-cell resultOption" id="${idPrefix}1">
1430 <span class="ml-0">Es gab keine Treffer in dieser Kategorie.</span>
1431 </li>
1432 </#if>
1433 </ul>
1434</#macro>
1435
1436
1437<#function existsAndSizeGTZero element>
1438 <#return element?? && element?size gt 0 />
1439</#function>
1440
1441<#function existsAndHasContent element>
1442 <#return element?? && element?has_content />
1443</#function>
1444
1445<#macro addOpeninghours base_variable label>
1446 <#local
1447 id = 'openinghours'
1448 headline = label
1449 body = ''
1450 serviceZeitenEmpty = true
1451 />
1452 <#if base_variable.servicezeitenStrukturiert?? && base_variable.servicezeitenStrukturiert.tage??>
1453 <#list base_variable.servicezeitenStrukturiert.tage?values as value>
1454 <#list value.paare?values as paare>
1455 <#if paare?? && paare?has_content && paare != '-'>
1456 <#local serviceZeitenEmpty = false />
1457 <#break>
1458 </#if>
1459 </#list>
1460 <#if serviceZeitenEmpty == false>
1461 <#break>
1462 </#if>
1463 </#list>
1464 </#if>
1465 <#if serviceZeitenEmpty == false>
1466 <#local body = body + '<table id="serviceTimeTable" class="w-100 mb-4"><thead class=""><tr>'/>
1467 <#local body = body + '<th style="width: calc(20%)" class="p-2">Wochentag</th>'/>
1468 <#local body = body + '<th style="width: calc(80% / 2)" class="p-2">Zeitraum 1</th>'/>
1469 <#local body = body + '<th style="width: calc(80% / 2)" class="p-2">Zeitraum 2</th>'/>
1470 <#local body = body + '</tr></thead><tbody>'/>
1471
1472 <#local tagKeys = base_variable.servicezeitenStrukturiert.tage?keys>
1473 <#local tagNames = base_variable.servicezeitenStrukturiert.tage?values>
1474
1475 <#list tagKeys as tagName>
1476 <#local index = tagKeys?seq_index_of(tagName)>
1477 <#local tagZeiten = tagNames[index]>
1478 <#local emptyTag = true />
1479 <#list tagZeiten.paare?values as tagZeitenPaar>
1480 <#if tagZeitenPaar?? && tagZeitenPaar?has_content && tagZeitenPaar != '-' >
1481 <#local emptyTag = false />
1482 <#break>
1483 </#if>
1484 </#list>
1485 <#if emptyTag>
1486 <#else>
1487 <#if tagName??>
1488 <#local
1489 tagNameFormated = tagName[0]?upper_case
1490 tagNameFormated = tagNameFormated + tagName[1]?lower_case
1491 />
1492 <#local body = body + '<tr><td class="p-2">${tagNameFormated}</td>'/>
1493 <#local ersterEintraginSpalte = true />
1494 <#local keys = tagZeiten.paare?keys>
1495 <#local values = tagZeiten.paare?values>
1496
1497 <#list keys as key>
1498 <#local index = keys?seq_index_of(key)>
1499 <#local value = values[index]>
1500 <#if key == "VORMITTAGS">
1501 <#if value.getVon()?? && value.getVon()?has_content && value.getBis()?? && value.getBis()?has_content>
1502 <#local body = body + '<td class="p-2">${value.getVon()} bis ${value.getBis()} Uhr</td>'/>
1503 <#else>
1504 <#local body = body + '<td class="p-2"></td>'/>
1505 </#if>
1506 </#if>
1507 <#if key == "NACHMITTAGS">
1508 <#if value.getVon()?? && value.getVon()?has_content && value.getBis()?? && value.getBis()?has_content>
1509 <#local body = body + '<td class="p-2">${value.getVon()} bis ${value.getBis()} Uhr</td> '/>
1510 <#else>
1511 <#local body = body + '<td class="p-2"></td>'/>
1512 </#if>
1513 </#if>
1514 </#list>
1515 <#local body = body + '</tr>'/>
1516 </#if>
1517 </#if>
1518 </#list>
1519 <#local body = body + '</tbody>'/>
1520 <#local body = body + '</table>'/>
1521 </#if>
1522 <#if base_variable.servicezeitenFreitext?has_content>
1523 <#local body = body + '<p class="servicezeitenFreitext">${base_variable.servicezeitenFreitext}</p>'/>
1524 </#if>
1525 <#if body != ''>
1526 <@createCollapse 'Servicezeiten', 'collapseFacilityOpeningHours'>
1527 ${body}
1528 </@createCollapse>
1529 </#if>
1530</#macro>
1531
1532<#macro createCollapse header id>
1533 <div class="card-base card">
1534 <div class="card-header">
1535 <a class="collapsed card-link" data-toggle="collapse" href="#${id}">
1536 <h3><i class="bi bi-chevron-right"></i>${header}</h3>
1537 </a>
1538 </div>
1539 <div id="${id}" class="collapse">
1540 <div class="card-body">
1541 <#nested/>
1542 </div>
1543 </div>
1544 </div>
1545</#macro>
1546
1547<#macro createCard header id>
1548 <div id="${id}" class="base-card card">
1549 <div class="card-header">
1550 <h3>${header}</h3>
1551 </div>
1552 <div class="card-body">
1553 <#nested/>
1554 </div>
1555 </div>
1556</#macro>
1557
1558<#macro createContact baseVariable withDLWrapper=true>
1559 <#if withDLWrapper>
1560 <dl class="el--contact__list list-unstyled pl-0 mb-0">
1561 </#if>
1562 <#nested/>
1563 <#if existsAndHasContent(baseVariable.telefonnummer!'')>
1564 <dt class="mb-0">Telefon:</dt>
1565 <dd class="mb-0"><a href="${createPhoneHref(baseVariable)}">${baseVariable.telefonnummer}</a></dd>
1566 </#if>
1567 <#if existsAndHasContent(baseVariable.mobil!'')>
1568 <dt class="mb-0">Mobil:</dt>
1569 <dd class="mb-0"><a href="${createPhoneHref(baseVariable)}">${baseVariable.mobil}</a></dd>
1570 </#if>
1571 <#if existsAndHasContent(baseVariable.faxnummer!'')>
1572 <dt class="mb-0">Fax:</dt>
1573 <dd class="mb-0"><a href="${createFaxHref(baseVariable)}">${baseVariable.faxnummer}</a></dd>
1574 </#if>
1575 <#if existsAndHasContent(baseVariable.email!'')>
1576 <dt class="mb-0">E-Mail:</dt>
1577 <dd class="mb-0"><a href="${createMailHref(baseVariable)}">${baseVariable.email}</a></dd>
1578 </#if>
1579 <#if withDLWrapper>
1580 </dl >
1581 </#if>
1582</#macro>
1583
1584<#macro createAddress baseVariable withDLWrapper=true>
1585 <#if withDLWrapper>
1586 <dl class="el--contact__list mb-0">
1587 </#if>
1588 <#nested/>
1589 <#if existsAndHasContent(baseVariable.anschrift.strasse!'') && existsAndHasContent(baseVariable.anschrift.hausnummer!'') >
1590 <dt class="mb-0 sr-only">Strasse und Hausnummer</dt>
1591 <dd class="mb-0 ">${baseVariable.anschrift.strasse} ${baseVariable.anschrift.hausnummer}</dd>
1592 </#if>
1593
1594 <#if existsAndHasContent(baseVariable.anschrift.postleitzahl!'') && existsAndHasContent(baseVariable.anschrift.ort!'')>
1595 <dt class="mb-0 sr-only">PLZ und Ort</dt>
1596 <dd class="mb-0 ">${baseVariable.anschrift.postleitzahl} ${baseVariable.anschrift.ort}</dd>
1597 </#if>
1598
1599 <#if existsAndHasContent(baseVariable.anschrift.postfach!'') >
1600 <dt class="mb-0">Postfach:</dt>
1601 <dd class="mb-0 "><span aria-label="Postfach PLZ und Ort:">${baseVariable.anschrift.postfachPostleitzahl} ${baseVariable.anschrift.postfachOrt}</span></dd>
1602 </#if>
1603
1604 <#if existsAndHasContent(baseVariable.anschrift.zusatz!'') >
1605 <dt class="mb-0">Adresszusatz:</dt>
1606 <dd class="mb-0 ">${baseVariable.anschrift.zusatz} </dd>
1607 </#if>
1608
1609 <#if withDLWrapper>
1610 </dl>
1611 </#if>
1612</#macro>
1613
1614<#macro getSeperator>
1615 ${getSeperatorFunc()}
1616</#macro>
1617
1618<#function getSeperatorFunc>
1619 <#return '<hr class="mb-2" aria-hidden="true">'/>
1620</#function>
1621
1622<#function createPhoneHref baseObject >
1623 <#return createNumberHref(baseObject.telefonnummer,'tel') />
1624</#function>
1625
1626<#function createFaxHref baseObject >
1627 <#return createNumberHref(baseObject.faxnummer,'fax') />
1628</#function>
1629
1630<#function createMailHref baseObject >
1631 <#return 'mailto:'+baseObject.email />
1632</#function>
1633
1634<#function createMobilHref baseObject >
1635 <#return createNumberHref(baseObject.mobil,'tel' ) />
1636</#function>
1637
1638<#function createNumberHref baseObject prefix>
1639 <#local
1640 phonenumber = baseObject?replace('-','')?replace(' ','')?replace('+49','')
1641 />
1642 <#if phonenumber?index_of('0') == 0>
1643 <#local
1644 index = phonenumber?index_of('0')
1645 index = index + 1
1646 combinatedPhonenumber = prefix + ":+49" + phonenumber?substring(index)
1647 />
1648 <#else>
1649 <#local
1650 combinatedPhonenumber = prefix + ":+49" + phonenumber
1651 />
1652 </#if>
1653 <#return combinatedPhonenumber />
1654</#function>
1655
1656<#function userIsLoggedIn>
1657 <#return utils.angemeldet?? && utils.angemeldet>
1658</#function>