BIS: Suche und Detail
Suche ...
Fehler bei der Verarbeitung der Vorlage.
The string doesn't match the expected date/time/date-time format. The string to parse was: "2025-09-30T16:15:26". The expected format was: "yyyy-MM-dd'T'HH:mm:ss.SSS".
The nested reason given follows:
Unparseable date: "2025-09-30T16:15:26"
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${value?datetime("yyyy-MM-dd'T'HH:mm:... [in template "33496#33531#379164" in macro "formatDateTime" at line 560, column 3]
- Reached through: @formatDateTime mitarbeiter.letzteAen... [in template "33496#33531#379164" at line 550, column 47]
----
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"]
9/>
10
11<@liferay_theme["defineObjects"]/>
12<@portlet["defineObjects"]/>
13
14<#assign
15 plid = themeDisplay.getPlid()
16 createAccountURL = portletURLFactory.create(renderRequest,"com_liferay_login_web_portlet_LoginPortlet", plid,"RENDER_PHASE")
17 mitarbeiterShow = "vr-bis-detail-mitarbeiter-show"
18 einrichtungShow = "vr-bis-detail-einrichtung-show"
19 dienstleistungShow = "vr-bis-detail-dienstleistung-show"
20/>
21
22<#assign
23 serviceWithLoginIcon = '<svg style="vertical-align: text-bottom;" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="15" height="15" fill="currentColor" class="bi bi-lock" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8 0a4 4 0 0 1 4 4v2.05a2.5 2.5 0 0 1 2 2.45v5a2.5 2.5 0 0 1-2.5 2.5h-7A2.5 2.5 0 0 1 2 13.5v-5a2.5 2.5 0 0 1 2-2.45V4a4 4 0 0 1 4-4M4.5 7A1.5 1.5 0 0 0 3 8.5v5A1.5 1.5 0 0 0 4.5 15h7a1.5 1.5 0 0 0 1.5-1.5v-5A1.5 1.5 0 0 0 11.5 7zM8 1a3 3 0 0 0-3 3v2h6V4a3 3 0 0 0-3-3"/></svg>'
24 serviceWithLoginText = 'Diese Dienstleistung erfordert eine Anmeldung über die BundID.'
25 serviceWithEIDText = 'Diese Dienstleistung erfordert eine Anmeldung mit dem Elektronischen Personalausweis über die BundID.'
26 serviceWithCostIcon = '<svg style="vertical-align: text-bottom;" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="15" height="15" fill="currentColor" class="bi bi-credit-card" viewBox="0 0 16 16"><path d="M0 4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2zm2-1a1 1 0 0 0-1 1v1h14V4a1 1 0 0 0-1-1zm13 4H1v5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1z"/><path d="M2 10a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1z"/></svg>'
27 serviceWithCostText = 'Diese Dienstleistung kann Kostenpflichtig sein.'
28/>
29
30${createAccountURL.setParameter("mvcRenderCommandName", "/login/create_account")}
31${createAccountURL.setParameter("p_p_state", "maximized")}
32${createAccountURL.setParameter("p_p_mode", "view")}
33
34
35
36<@addSearch '19'/>
37<#-- Einrichtung -->
38<#if vr?has_content>
39 <#assign
40 bis2017 = vr.bis2017
41 utils = vr.utils2017
42 ansicht = utils.ansicht
43 suchergebnisDienstleistung = vr.bis2017.suchergebnisDienstleistung
44 suchergebnisEinrichtung = vr.bis2017.suchergebnisEinrichtung
45 suchergebnisMitarbeiter = vr.bis2017.suchergebnisMitarbeiter
46 />
47 <#if bis2017.ausgewaehlteEinrichtung??>
48 <#assign
49 einrichtung = bis2017.ausgewaehlteEinrichtung
50 />
51 <div class="row">
52 <div class="col-12">
53
54 <h1>
55 <i class="icon-home"></i> ${getFullFacilityName3(einrichtung,'facility-name-header-list')}
56 <#if einrichtung.kurzbezeichnung?has_content>
57 ${einrichtung.kurzbezeichnung}
58 </#if>
59 </h1>
60 <ul class="breadcrumb pt-0">
61 <#list einrichtung.breadcrumb as i>
62 <li>
63 <a href="${utils.createRenderUrl(renderResponse,
64 einrichtungShow, i.id)}">${i.name}</a>
65 </li>
66 </#list>
67 </ul>
68
69 <#if einrichtung.typ?has_content>
70 <div>${einrichtung.typ}</div>
71 </#if>
72 <#if einrichtung.aktuelles?has_content>
73 <div>${einrichtung.aktuelles}</div>
74 </#if>
75 <#if einrichtung.beschreibung?has_content>
76 <div>${einrichtung.beschreibung}</div>
77 </#if>
78 </div>
79 </div>
80
81 <div class="row">
82 <div class="col-md-8">
83 <#if einrichtung.anschrift?has_content>
84 <div class="anschrit mb-4">
85 <h2 class="mt-3">Anschrift</h2>
86 <p>
87 <strong>${einrichtung.anschrift.name}</strong> <br/>
88 ${einrichtung.anschrift.strasse} ${einrichtung.anschrift.hausnummer} <br/>
89 ${einrichtung.anschrift.postleitzahl} ${einrichtung.anschrift.ort}
90 </p>
91 </div>
92 </#if>
93 <h2 class="mt-3">Kontakt</h2>
94 <p>
95 <#if einrichtung.telefonnummer?has_content>
96 Tel.: ${einrichtung.telefonnummer} <br/>
97 </#if>
98 <#if einrichtung.faxnummer?has_content>
99 Fax.: ${einrichtung.faxnummer} <br/>
100 </#if>
101 <#if einrichtung.email?has_content>
102 E-Mail: <a href="mailto:${einrichtung.email}">${einrichtung.email}</a> <br/>
103 </#if>
104 </p>
105 <#if einrichtung.internetadressen?has_content>
106 <ul class="list-unstyled">
107 <#list einrichtung.internetadressen as link>
108 <#if link.neuesFenster>
109 <li><a href="${link.uri}" title="${link.beschreibung}" target="_blank">${link.titel}</a></li>
110 <#else>
111 <li><a href="${link.uri}" title="${link.beschreibung}">${link.titel}</a></li>
112 </#if>
113 </#list>
114 </ul>
115 </#if>
116
117 <#if einrichtung.anschrift?has_content>
118 <#if einrichtung.anschrift.geokodierung?has_content && einrichtung.anschrift.geokodierung.latitude?has_content && einrichtung.anschrift.geokodierung.longitude?has_content>
119 <h2 class="mt-3">Standort</h2>
120 <p>
121 <a class="btn btn-secondary"
122 href="https://www.openstreetmap.org/?mlat=${einrichtung.anschrift.geokodierung.latitude}&mlon=${einrichtung.anschrift.geokodierung.longitude}&zoom=15"
123 target="_blank">
124 <i class="icon icon-map-marker"></i> Karte anzeigen
125 </a>
126 </p>
127 </#if>
128
129 <#if einrichtung.anschrift.verkehrsanbindung?has_content>
130 <h2 class="mt-3">Verkehrsanbindung</h2>
131 <div>${einrichtung.anschrift.verkehrsanbindung}</div>
132 </#if>
133
134 <#if einrichtung.anschrift.anfahrtUrl?has_content>
135 <ul class="list-unstyled">
136 <#list einrichtung.anschrift.anfahrtUrl as url>
137 <li><a href="${url.uri}" title="${url.beschreibung}">${url.titel}</a></li>
138 </#list>
139 </ul>
140 </#if>
141 </#if>
142
143 <@addOpeninghours einrichtung,getLabelName(einrichtung,'adt.label.einrichtung.oeffnungszeiten','Servicezeiten')/>
144 <#if einrichtung.dienstleistungList?has_content>
145 <h2 class="mt-3">Dienstleistungen der Einrichtung</h2>
146 <ul class="list-unstyled">
147 <#list einrichtung.dienstleistungList as dienstleistung>
148 <li>
149 <a href="${utils.createRenderUrl(renderResponse,
150 dienstleistungShow, dienstleistung.id)}">${dienstleistung.name}</a>
151 </li>
152
153 </#list>
154 </ul>
155 </#if>
156
157 <#if einrichtung.alleDienstleistungList?has_content>
158 <h2 class="mt-3">Alle Zuständigkeiten</h2>
159 <ul class="list-unstyled">
160 <#list einrichtung.alleDienstleistungList as dienstleistung>
161 <li>
162 <a href="${utils.createRenderUrl(renderResponse,
163 dienstleistungShow, dienstleistung.id)}">${dienstleistung.name}</a>
164 </li>
165 </#list>
166 </ul>
167 </#if>
168
169 <#if einrichtung.uebereinrichtung?has_content>
170 <h2 class="mt-3">Diese Einrichtung gehört zu</h2>
171 <p><a href="${utils.createRenderUrl(renderResponse,
172 einrichtungShow, einrichtung.uebereinrichtung.id)}">${einrichtung.uebereinrichtung.name}</a></p>
173 </#if>
174
175 <#if einrichtung.untereinrichtungList?has_content>
176 <h2 class="mt-3">Zu dieser Einrichtung gehören</h2>
177 <ul class="list-unstyled">
178 <#list einrichtung.untereinrichtungList as child>
179 <li>
180 <a href="${utils.createRenderUrl(renderResponse,
181 einrichtungShow, child.id)}">${child.name}</a>
182 </li>
183 </#list>
184 </ul>
185 </#if>
186
187 </div>
188 <div class="col-md-4">
189 <#if einrichtung.mitarbeiterList?has_content>
190 <div class="card border-secondary">
191 <div class="card-header">
192 <h2>Kontaktpersonen</h2>
193 </div>
194 <div class="card-body text-secondary">
195 <ul class="list-unstyled">
196 <#list einrichtung.mitarbeiterList as mitarbeiter>
197 <li class="mb-2">
198 <a href="${utils.createRenderUrl(renderResponse,
199 mitarbeiterShow, mitarbeiter.id)}">
200 ${mitarbeiter.volleAnsprache()}
201 </a><br/>
202 <#if mitarbeiter.position?has_content>
203 <span>${mitarbeiter.position}</span><br/>
204 </#if>
205 <#if mitarbeiter.telefonnummer?has_content>
206 Tel.: ${mitarbeiter.telefonnummer} <br/>
207 </#if>
208 <#if mitarbeiter.faxnummer?has_content>
209 Fax.: ${mitarbeiter.faxnummer} <br/>
210 </#if>
211 <#if mitarbeiter.mobil?has_content>
212 Mobil.: ${mitarbeiter.mobil} <br/>
213 </#if>
214 <#if mitarbeiter.email?has_content>
215 E-Mail: <a href="mailto:${mitarbeiter.email}">${mitarbeiter.email}</a> <br/>
216 </#if>
217 </li>
218 </#list>
219 </ul>
220 </div>
221 </div>
222 </#if>
223 <p class="small">Letzte Änderung: <@formatDateTime einrichtung.letzteAenderung /> Uhr</p>
224 </div>
225 </#if>
226
227 <#-- Dienstleistung -->
228
229 <#if bis2017.ausgewaehlteDienstleistung??>
230 <#assign
231 dienstleistung = bis2017.ausgewaehlteDienstleistung
232 textmodul = dienstleistung.textmodul
233 />
234 <#assign online = dienstleistung.formulare?has_content || dienstleistung.kontaktformularUrl?has_content || textmodul.formulare.weiterfuehrenderLink?has_content>
235
236 <div class="service-detail">
237
238 <div class="row">
239 <div class="col-12 mb-3">
240 <h1><i class="icon-tag"></i> ${dienstleistung.name}</h1>
241 </div>
242 </div>
243
244 <div class="row">
245
246 <div class="col-md-8">
247 <#if textmodul.kurztext.inhalt?has_content>
248 <div class="lead">
249 <@renderTextmodul textmodul.kurztext, "" />
250 </div>
251 </#if>
252 <@renderTextmodul textmodul.volltext, "" />
253
254 <@renderTextmodul textmodul.rechtsgrundlagen, "Rechtsgrundlage" />
255
256 <@renderTextmodul textmodul.voraussetzungen, "Vorraussetzungen" />
257
258 <@renderTextmodul textmodul.erforderlicheUnterlagen, "Unterlagen" />
259
260 <@renderTextmodul textmodul.fristen, "Fristen" />
261
262 <#if dienstleistung.kostenmodul.beschreibung?has_content || dienstleistung.kostenmodul.kosten?has_content>
263 <div class="kostenmodul">
264 <h2 class="mt-3">Kosten</h2>
265 <#if dienstleistung.kostenmodul.kosten?has_content>
266 <ul class="list-unstyled">
267 <#list dienstleistung.kostenmodul.kosten as kosten>
268 <li>
269 ${kosten.name}
270 <#if !kosten.von?has_content && !kosten.bis?has_content>
271 <td>(kostenfrei)</td>
272 <#elseif kosten.von?has_content && kosten.bis?has_content>
273 <td>(zwischen ${utils.formatCurrency(kosten.von)}
274 und ${utils.formatCurrency(kosten.bis)} EUR)
275 </td>
276 <#else>
277 <td>(${utils.formatCurrency(kosten.von)} EUR)</td>
278 </#if>
279 <#if kosten.beschreibung?has_content>
280 <td> ${kosten.beschreibung}</td>
281 </#if>
282 </li>
283 </#list>
284 </ul>
285 </#if>
286
287 <div>${dienstleistung.kostenmodul.beschreibung}</div>
288 <@hyperlinks dienstleistung.kostenmodul.weiterfuehrenderLink />
289 </div>
290 </#if>
291
292 <#if dienstleistung.zahlungsweisen?has_content>
293 <h2 class="mt-3">Zahlungsweisen</h2>
294 <ul class="list-unstyled">
295 <#list dienstleistung.zahlungsweisen as zahlungsweise>
296 <li>${zahlungsweise.name}</li>
297 </#list>
298 </ul>
299 </#if>
300 <@renderTextmodul textmodul.bearbeitungsdauer "Bearbeitungsdauer" />
301
302 <@renderTextmodul textmodul.hinweiseBesonderheiten "Hinweise und Besonderheiten" />
303
304 <@renderTextmodul textmodul.weiterfuehrendeInformationen "Weitere Informationen" />
305
306 <@renderTextmodul textmodul.verfahrensablauf "Verfahrensablauf" />
307
308 <@renderTextmodul textmodul.rechtsbehelf "Rechtsbefehl" />
309
310 <@renderTextmodul textmodul.zusatzAnWenWenden "An wen wenden" />
311
312 <@renderTextmodul textmodul.zusatzUrheber "Urheber" />
313
314 <@addOnlineServicesLeft dienstleistung, renderRequest, 'btn btn-primary btn-large mb-2 text-left'/>
315 </div>
316 <div class="col-md-4">
317 <@addOnlineServicesRight dienstleistung, renderRequest, 'btn btn-primary btn-large w-100 mb-2 text-left'/>
318
319 <#if dienstleistung.verwandteDienstleistungen?has_content>
320 <div class="card border-secondary">
321 <div class="card-header">
322 <h2>Verwandte Dienstleistungen</h2>
323 </div>
324 <div class="card-body text-secondary">
325 <ul class="list-unstyled">
326 <#list dienstleistung.verwandteDienstleistungen as dl>
327 <li><a href="${utils.createRenderUrl(renderResponse,
328 dienstleistungShow, dl.id)}">${dl.name}</a></li>
329 </#list>
330 </ul>
331 </div>
332 </div>
333 </#if>
334
335 <#if dienstleistung.dokumentList?has_content>
336 <div class="card border-secondary">
337 <div class="card-header">
338 <h2>Downloads</h2>
339 </div>
340 <div class="card-body text-secondary">
341 <ul class="list-unstyled">
342 <#list dienstleistung.dokumentList as dokument>
343 <li>
344 <#assign url = renderResponse.createResourceURL()>
345 ${url.setResourceID("vr-bis-detail-document-download")}
346 ${url.setParameter("id", "${dokument.id}")}
347
348 <a href="${url}" title="Download ${dokument.name}" target="_blank" download>
349 ${dokument.name}</a>
350
351 </li>
352 </#list>
353 </ul>
354 </div>
355 </div>
356 </#if>
357
358 <#if dienstleistung.einrichtungList?has_content>
359 <div class="card border-secondary">
360 <div class="card-header">
361 <#if dienstleistung.einrichtungList?size gt 1>
362 <h2>Zuständige Einrichtungen</h2>
363 <#else>
364 <h2>Zuständige Einrichtung</h2>
365 </#if>
366 </div>
367 <#assign i = 0>
368 <div class="card-body text-secondary">
369 <p class="card-text">
370 <#list dienstleistung.einrichtungList as einrichtung>
371 <#if i lt 1>
372 <b><a href="${utils.createRenderUrl(renderResponse,
373 einrichtungShow, einrichtung.id)}">${getFullFacilityName3(einrichtung,'facility-name-list')}</a></b>
374 <br/>
375 <#if einrichtung.anschrift?has_content>
376 ${einrichtung.anschrift.name}<br/>
377 ${einrichtung.anschrift.strasse} ${einrichtung.anschrift.hausnummer}<br/>
378 ${einrichtung.anschrift.postleitzahl} ${einrichtung.anschrift.ort}<br/>
379 </#if>
380 E-Mail: <a href="mailto:${einrichtung.email}">${einrichtung.email}</a> <br/>
381
382 <#else>
383 <br/><a href="${utils.createRenderUrl(renderResponse,
384 einrichtungShow, einrichtung.id)}">${getFullFacilityName3(einrichtung,'facility-name-list')}</a>
385 </#if>
386 <#assign i = i + 1>
387 </#list>
388 </p>
389 </div>
390 </div>
391 </#if>
392
393 <#if dienstleistung.mitarbeiterList?has_content>
394 <div class="card border-secondary">
395 <div class="card-header">
396 <h2>Zuständige Kontaktpersonen</h2>
397 </div>
398 <div class="card-body text-secondary">
399 <#list dienstleistung.mitarbeiterList as mitarbeiter>
400 <div class="mb-2">
401 <a href="${utils.createRenderUrl(renderResponse,
402 mitarbeiterShow, mitarbeiter.id)}">
403 ${mitarbeiter.volleAnsprache()}
404 </a><br/>
405 <#if mitarbeiter.position?has_content>
406 <span>${mitarbeiter.position}</span><br/>
407 </#if>
408 <#if mitarbeiter.telefonnummer?has_content>
409 Tel.: ${mitarbeiter.telefonnummer} <br/>
410 </#if>
411 <#if mitarbeiter.faxnummer?has_content>
412 Fax.: ${mitarbeiter.faxnummer} <br/>
413 </#if>
414 <#if mitarbeiter.mobil?has_content>
415 Mobil.: ${mitarbeiter.mobil} <br/>
416 </#if>
417 <#if mitarbeiter.email?has_content>
418 E-Mail: <a href="mailto:${mitarbeiter.email}">${mitarbeiter.email}</a> <br/>
419 </#if>
420 </div>
421 </#list>
422 </div>
423 </div>
424 </#if>
425 <#if
426 existsAndHasContent(textmodul.volltext.weiterfuehrenderLink!'') ||
427 existsAndHasContent(textmodul.kurztext.weiterfuehrenderLink!'') ||
428 existsAndHasContent(textmodul.rechtsgrundlagen.weiterfuehrenderLink!'') ||
429 existsAndHasContent(textmodul.erforderlicheUnterlagen.weiterfuehrenderLink!'') ||
430 existsAndHasContent(textmodul.voraussetzungen.weiterfuehrenderLink!'') ||
431 existsAndHasContent(textmodul.verfahrensablauf.weiterfuehrenderLink!'') ||
432 existsAndHasContent(textmodul.weiterfuehrendeInformationen.weiterfuehrenderLink!'') ||
433 existsAndHasContent(textmodul.hinweiseBesonderheiten.weiterfuehrenderLink!'') ||
434 existsAndHasContent(textmodul.rechtsbehelf.weiterfuehrenderLink!'') ||
435 existsAndHasContent(textmodul.bearbeitungsdauer.weiterfuehrenderLink!'') ||
436 existsAndHasContent(textmodul.fristen.weiterfuehrenderLink!'')>
437 <div class="card border-secondary" id="weiterfuehrendeLinks">
438 <div class="card-header">
439 <h2>Weiterführende Informationen</h2>
440 </div>
441 <div class="card-body text-secondary">
442 <ul class="list-unstyled pl-0">
443 ${linklooper(textmodul.volltext)}
444 ${linklooper(textmodul.kurztext)}
445 ${linklooper(textmodul.rechtsgrundlagen)}
446 ${linklooper(textmodul.erforderlicheUnterlagen)}
447 ${linklooper(textmodul.voraussetzungen)}
448 ${linklooper(textmodul.verfahrensablauf)}
449 ${linklooper(textmodul.weiterfuehrendeInformationen)}
450 ${linklooper(textmodul.hinweiseBesonderheiten)}
451 ${linklooper(textmodul.rechtsbehelf)}
452 ${linklooper(textmodul.bearbeitungsdauer)}
453 ${linklooper(textmodul.fristen)}
454 </ul>
455 </div>
456 </div>
457 </#if>
458
459 <p class="small float-right">Letzte Änderung: <@formatDateTime dienstleistung.letzteAenderung /> Uhr</p>
460 </div>
461 </div>
462 </div>
463 </#if>
464
465 <#-- Mitarbeiter -->
466 <#if bis2017.ausgewaehlterMitarbeiter??>
467 <#assign
468 mitarbeiter = bis2017.ausgewaehlterMitarbeiter
469 />
470
471 <div class="row employee-detail">
472 <div class="col-12">
473 <h2><i class="icon-user"></i> ${mitarbeiter.volleAnsprache()}</h2>
474 </div>
475 <div class="col-md-4 order-md-2 order-sm-1">
476 <#if mitarbeiter.bildAnzeigenExtern>
477 <#if mitarbeiter.portrait?has_content>
478 <img class="img-thumbnail" src="${mitarbeiter.portrait}" alt="Portrait des Mitarbeiters"/>
479 </#if>
480 </#if>
481 </div>
482 <div class="col-md-8 order-md-1 order-sm-2">
483 <#if mitarbeiter.position?has_content>
484 <p>${mitarbeiter.position}</p>
485 </#if>
486 <#if mitarbeiter.beschreibung?has_content>
487 <div>${mitarbeiter.beschreibung}</div>
488 </#if>
489
490 <#if mitarbeiter.beschreibungIntern?has_content>
491 <div>${mitarbeiter.beschreibungIntern}</div>
492 </#if>
493
494 <#if mitarbeiter.amtFachbereich?has_content>
495 <h2 class="mt-3">Amt/Fachbereich</h2>
496 <div>
497 <a href="${utils.createRenderUrl(renderResponse,
498 einrichtungShow, mitarbeiter.amtFachbereich.id)}">${mitarbeiter.amtFachbereich.name}</a>
499 </div>
500 </#if>
501 <#if mitarbeiter.einrichtungList?has_content>
502 <h2 class="mt-3">Adresse</h2>
503 <#list mitarbeiter.einrichtungList as einrichtung>
504 <#if einrichtung?is_first>
505 <p>
506 <#if einrichtung.anschrift?has_content>
507 <strong>
508 <a href="${utils.createRenderUrl(renderResponse,einrichtungShow, einrichtung.id)}">
509 ${einrichtung.name}
510 </a>
511 </strong> <br/>
512 ${einrichtung.anschrift.strasse} ${einrichtung.anschrift.hausnummer} <br/>
513 ${einrichtung.anschrift.postleitzahl} ${einrichtung.anschrift.ort} <br/>
514 <#else>
515 <strong><a href="${utils.createRenderUrl(renderResponse,
516 einrichtungShow, einrichtung.id)}">${getFullFacilityName3(einrichtung,'facility-name-list')}</a></strong> <br/>
517 </#if>
518 <#if mitarbeiter.raum?has_content>
519 Raumnummer: ${mitarbeiter.raum}
520 </#if>
521 </p>
522 </#if>
523 </#list>
524 </#if>
525 <p>
526 <#if mitarbeiter.telefonnummer?has_content>
527 Tel: ${mitarbeiter.telefonnummer} <br/>
528 </#if>
529 <#if mitarbeiter.faxnummer?has_content>
530 Fax: ${mitarbeiter.faxnummer} <br/>
531 </#if>
532 <#if mitarbeiter.mobil?has_content>
533 Mobil: ${mitarbeiter.mobil} <br/>
534 </#if>
535 <#if mitarbeiter.email?has_content>
536 E-Mail: ${mitarbeiter.email} <br/>
537 </#if>
538 </p>
539
540 <@addOpeninghours mitarbeiter,getLabelName(mitarbeiter,'adt.label.mitarbeiter.oeffnungszeiten','Servicezeiten')/>
541 <#if mitarbeiter.dienstleistungList?has_content>
542 <h2>Dienstleistungen</h2>
543 <ul class="list-unstyled">
544 <#list mitarbeiter.dienstleistungList as dienstleistung>
545 <li><a href="${utils.createRenderUrl(renderResponse,
546 dienstleistungShow, dienstleistung.id)}">${dienstleistung.name}</a></li>
547 </#list>
548 </ul>
549 </#if>
550 <p class="small">Letzte Änderung: <@formatDateTime mitarbeiter.letzteAenderung /> Uhr</p>
551 </div>
552 </div>
553 </#if>
554</#if>
555
556
557<#-- Macros -->
558
559<#macro formatDateTime value>
560 ${value?datetime("yyyy-MM-dd'T'HH:mm:ss.SSS")?string("dd.MM.yyyy HH:mm")}
561</#macro>
562
563<#macro renderTextmodul modul name="">
564 <#if modul.inhalt?has_content>
565 <#if name?has_content>
566 <h2 class="mt-3">${name}</h2>
567 </#if>
568 <div>${modul.inhalt}</div>
569 <@hyperlinks modul.weiterfuehrenderLink />
570 </#if>
571</#macro>
572
573<#macro hyperlinks list>
574 <#if list?has_content>
575 <h4>Weiterführende Informationen</h4>
576 <ul class="list-unstyled">
577 <#list list as link>
578 <li>
579 <#if link.neuesFenster>
580 <a href="${link.uri}" title="${link.beschreibung}" target="_blank"><i class="icon-share-alt"></i> ${link.titel}</a>
581 <#else>
582 <a href="${link.uri}" title="${link.beschreibung}"><i class="icon-share-alt"></i> ${link.titel}</a>
583 </#if>
584 </li>
585 </#list>
586 </ul>
587 </#if>
588</#macro>
589
590
591<#macro addOpeninghours base_variable label>
592 <#local
593 id = 'openinghours'
594 headline = label
595 body = ''
596 serviceZeitenEmpty = true
597 />
598 <#if base_variable.servicezeitenStrukturiert?? && base_variable.servicezeitenStrukturiert.tage??>
599 <#list base_variable.servicezeitenStrukturiert.tage?values as value>
600 <#list value.paare?values as paare>
601 <#if paare?? && paare?has_content && paare != '-'>
602 <#local serviceZeitenEmpty = false />
603 <#break>
604 </#if>
605 </#list>
606 <#if serviceZeitenEmpty == false>
607 <#break>
608 </#if>
609 </#list>
610 </#if>
611 <#if serviceZeitenEmpty == false>
612 <#local body = body + '<h2>${headline}</h2><table id="serviceTimeTable" class=""><thead class=""><tr>'/>
613 <#local body = body + '<th style="width: calc(20%)" class="">Tag</th>'/>
614 <#local body = body + '<th style="width: calc(80% / 2)" class="">Zeitraum 1</th>'/>
615 <#local body = body + '<th style="width: calc(80% / 2)" class="">Zeitraum 2</th>'/>
616 <#local body = body + '</tr></thead><tbody>'/>
617
618 <#local tagKeys = base_variable.servicezeitenStrukturiert.tage?keys>
619 <#local tagNames = base_variable.servicezeitenStrukturiert.tage?values>
620
621 <#list tagKeys as tagName>
622 <#local index = tagKeys?seq_index_of(tagName)>
623 <#local tagZeiten = tagNames[index]>
624 <#local emptyTag = true />
625 <#list tagZeiten.paare?values as tagZeitenPaar>
626 <#if tagZeitenPaar?? && tagZeitenPaar?has_content && tagZeitenPaar != '-' >
627 <#local emptyTag = false />
628 <#break>
629 </#if>
630 </#list>
631 <#if emptyTag>
632 <#else>
633 <#if tagName??>
634 <#local
635 tagNameFormated = tagName?substring(0, 1)?upper_case
636 tagNameFormated = tagNameFormated + tagName?substring(1)?lower_case
637 />
638 <#local body = body + '<tr><td>${tagNameFormated}</td>'/>
639 <#local ersterEintraginSpalte = true />
640 <#local keys = tagZeiten.paare?keys>
641 <#local values = tagZeiten.paare?values>
642
643 <#list keys as key>
644 <#local index = keys?seq_index_of(key)>
645 <#local value = values[index]>
646 <#if key == "VORMITTAGS">
647 <#if value.getVon()?? && value.getVon()?has_content && value.getBis()?? && value.getBis()?has_content>
648 <#local body = body + '<td class="">${value.getVon()} bis ${value.getBis()} Uhr</td>'/>
649 <#else>
650 <#local body = body + '<td class=""></td>'/>
651 </#if>
652 </#if>
653 <#if key == "NACHMITTAGS">
654 <#if value.getVon()?? && value.getVon()?has_content && value.getBis()?? && value.getBis()?has_content>
655 <#local body = body + '<td class="">${value.getVon()} bis ${value.getBis()} Uhr</td> '/>
656 <#else>
657 <#local body = body + '<td class=""></td>'/>
658 </#if>
659 </#if>
660 </#list>
661 <#local body = body + '</tr>'/>
662 </#if>
663 </#if>
664 </#list>
665 <#local body = body + '</tbody>'/>
666 <#local body = body + '</table>'/>
667 </#if>
668 <#if base_variable.servicezeitenFreitext?has_content>
669 <#local body = body + '<p class="servicezeitenFreitext">${base_variable.servicezeitenFreitext}</p>'/>
670 </#if>
671 ${body}
672</#macro>
673
674<#function getLabelName(base_variable,pathName,default)>
675 <#if base_variable.labels?? && base_variable.labels.getOrDefault??>
676 <#if base_variable.labels.getOrDefault(pathName, default) != "">
677 <#return base_variable.labels.getOrDefault(pathName, default)/>
678 </#if>
679 <#else>
680 <#return default />
681 </#if>
682</#function>
683
684
685
686<#macro addSearch portletNumber>
687 <#local searchShowHeadline = getterUtil.getBoolean(themeDisplay.getThemeSetting("Search-Show-Headline"))/>
688 <div id="listBoxSearch" class="detail-search">
689 <div class="row">
690 <div class="vr-details-left search-area searchbar searchLeft col-12 col-lg-12 col-xl-12" id="suchseite">
691
692 <div class="searchbar-inner js-suggestion-anchor">
693 <div class="combobox-wrapper" id="searchBox">
694 <h1 id="searchInputHeader" class="<#if !searchShowHeadline>sr-only</#if>"><label id="searchBoxLabel" for="searchInput" class="">Suche</label></h1>
695 <form id="searchform" method="post">
696 <div
697 role="combobox"
698 aria-expanded="false"
699 aria-owns="searchResultList"
700 aria-haspopup="listbox"
701 id="searchCombobox"
702 >
703 <input
704 name="query"
705 type="text"
706 aria-controls="searchResultList"
707 id="searchInput"
708 placeholder="Suche"
709 aria-autocomplete="list"
710 autocomplete="off"
711 class="w-100"
712 aria-busy="false"
713 >
714 <div id="searchInProgress" class="" style="display: none">
715 <div class="lds-spinner" style=""><div></div><div></div><div></div></div>
716 </div>
717 </div>
718 </form>
719 <div id="searchResultContent">
720 <div
721 class="row mx-0"
722 role="listbox"
723 id="searchResultList"
724 aria-label="Suchergebnisse"
725 aria-hidden="true"
726 tabindex="-1"
727 >
728 <#if vr??>
729 <#assign
730 bis2017 = vr.bis2017
731 utils = vr.utils2017
732 suchergebnisDienstleistung = bis2017.suchergebnisDienstleistung
733 suchergebnisEinrichtung = bis2017.suchergebnisEinrichtung
734 suchergebnisMitarbeiter = bis2017.suchergebnisMitarbeiter
735 />
736 <#if !suchergebnisDienstleistung?? && !suchergebnisEinrichtung?? && !suchergebnisMitarbeiter?? && (!dienstleistung) && (!mitarbeiter) && (!einrichtung)>
737 <ul role="group" class="resultList" aria-labelledby="non" id="nothing">
738 <li tabindex="0" role="option" class="resultOption" >
739 <span id="non">Es gab keine Treffer.</span>
740 </li>
741 </ul>
742 <#else>
743 <@searchResult13 type='dl' suchergebnisse=suchergebnisDienstleistung/>
744 <@searchResult13 type='mb' suchergebnisse=suchergebnisMitarbeiter />
745 <@searchResult13 type='er' suchergebnisse=suchergebnisEinrichtung />
746 </#if>
747 </#if>
748 </div>
749 </div>
750 </div>
751 </div>
752 </div>
753 </div>
754
755 <script>
756
757
758 const portlet = $('#p_p_id_${portletNumber}_WAR_vrportlet_');
759 const searchSection = $('#p_p_id_${portletNumber}_WAR_vrportlet_');
760 const search_input = $("#form-element-query");
761 const combobox2 = $('#searchCombobox');
762 const searchSection2 = $('#searchBox');
763 const dropdownList = $("#searchResultList");
764 const searchInput = $("#searchInput");
765 const searchButton = $("#searchInputButton");
766 const resultLinks = '#searchResultList .resultOption';
767
768 const arrow_keys_handler = function (e) {
769 switch (e.keyCode) {
770 case 37:
771 case 39:
772 case 38:
773 case 40:
774 case 13:
775 e.preventDefault();
776 break;
777 default:
778 break;
779 }
780 };
781
782 $(document).ready(function(){
783 addListener();
784 const combobox = searchSection.find('.portlet-body');
785 const portletBodyOldSearchRow = combobox.find(".row:first")
786 portletBodyOldSearchRow.attr('aria-hidden', "true");
787 portletBodyOldSearchRow.hide();
788 searchInput.val(search_input.val());
789
790 searchInput.on("keyup paste", function() {
791 addFromFakeInputToInput();
792 });
793
794 $(document).on('keypress keyup',function(event){
795 if(clickHomeInSearchBox(event) || clickEndInSearchBox(event)){
796 event.preventDefault();
797 return false;
798 }
799 })
800 //key interaction input & button
801 searchInput.on('keydown', function (event) {
802 if (event.key === "Escape") {
803 searchInput.val("");
804 closeDropdown();
805 }
806 if(clickHomeInSearchBox(event)){
807 event.preventDefault();
808 $(resultLinks)[0].focus()
809 return false;
810 }
811 if(clickEndInSearchBox(event)){
812 event.preventDefault();
813 $(resultLinks)[$(resultLinks).length -1].focus()
814 return false;
815 }
816 if (event.key === "Enter"){
817 event.preventDefault();
818 if (!isDropdownHidden()){
819 console.log('enter2')
820 $(resultLinks)[0].focus()
821 }
822 return false;
823 }
824 });
825 searchInput.on('keyup', function (event) {
826 if (event.key === "ArrowDown" || event.key === "ArrowUp" || event.key === "Enter" ) {
827 event.preventDefault();
828 if (isDropdownHidden() && searchInput.val().length > 1) {
829 setAriaBusy(true);
830 ajax(
831 $(".search-form input").val(),
832 function (data) {
833 dropdownList.empty();
834 dropdownList.append($(data).find("#nothing"));
835 dropdownList.append($(data).find("#mainCategoryDL"));
836 dropdownList.append($(data).find("#mainCategoryMB"));
837 dropdownList.append($(data).find("#mainCategoryER"));
838 portlet.find('#searchCombobox').attr('aria-expanded', 'true');
839 portlet.find('#searchResultList').attr('aria-hidden', 'false');
840 setAriaBusy(false);
841 },
842 function(){
843 if(event.key === "Enter"){
844 event.key = "ArrowDown"
845 }
846 dropdownListNavigation(event);
847 }
848 )
849 }
850 }
851 });
852
853 //key interaction list box
854 dropdownList.on('keydown',function(event) {
855 if(dropdownList.find($(':focus')).length === 1){
856 if (event.key === "Tab") {
857 closeDropdown();
858 }
859 if (event.key === "Escape") {
860 closeDropdown();
861 searchInput.focus();
862 }
863 if(clickHomeInSearchBox(event)){
864 event.preventDefault();
865 $(resultLinks)[0].focus()
866 return false;
867 }
868 if(clickEndInSearchBox(event)){
869 event.preventDefault();
870 $(resultLinks)[$(resultLinks).length -1].focus()
871 return false;
872 }
873 }
874 });
875
876 $(document).on('keydown',function(event){
877 let nextFocusItemID = getNextFocusElementId()
878 if(event.key === "Tab"){
879 if( searchSection2.find($(':focus')).length === 1 && searchButton[0].id !== nextFocusItemID) {
880 if(searchInput[0].id !== nextFocusItemID){
881 //closeDropdown();
882 }
883 }
884 }
885 if(event.key === "Enter"){
886 console.log('enter1')
887 if(dropdownList.find($(':focus')).length === 1) {
888 event.preventDefault();
889 if (!isDropdownHidden()) {
890 if (($(':focus').children()[0] !== undefined)) {
891 $(':focus').children()[0].click();
892 }
893 }
894 }
895 }
896 })
897 $(document).on('keydown',function(event){
898 dropdownListNavigation(event);
899 });
900 });
901
902 function dropdownListNavigation(event) {
903 if(searchSection2.find($(':focus')).length === 1){
904 if(!isDropdownHidden() && resultListHasContent()){
905 window.addEventListener("keydown", arrow_keys_handler, false);
906 let resultItemCount = $(resultLinks).length;
907 let currentFocus = $('#searchResultContent').find($(':focus'));
908 let focusId = $(':focus')[0].id;
909 let index = getDropdownResultIndex(focusId);
910 switch(event.key) {
911 case 'ArrowUp':
912 dropdownListArrowUp(currentFocus,resultItemCount, index, focusId)
913 break;
914 case 'ArrowDown':
915 dropdownListArrowDown(currentFocus,resultItemCount, index, focusId)
916 break;
917 }
918 }
919 }else{
920 window.removeEventListener("keydown", arrow_keys_handler, false);
921 }
922 return true;
923 }
924 function dropdownListArrowUp(currentFocus, resultItemCount, index, focusId){
925 if(currentFocus.length === 0 || index === 0) {
926 let link = '#' + $(resultLinks)[resultItemCount - 1].id;
927 if ($(link).length > 0) {
928 $(link).focus();
929 } else {
930 $(resultLinks)[resultItemCount - 1].focus();
931 }
932 }else{
933 let link = '#' + $(resultLinks)[index-1].id ;
934 if ($(link).length > 0) {
935 $(link).focus();
936 } else {
937 $(resultLinks)[index-1].focus();
938 }
939 }
940 searchInput.attr('aria-activedescendant',focusId);
941 }
942 function dropdownListArrowDown(currentFocus, resultItemCount, index, focusId){
943 if(currentFocus.length === 0 || $(resultLinks)[index+1] === undefined){
944 let link = '#' + $(resultLinks)[0].id;
945 if ($(link).length > 0) {
946 $(link).focus();
947 } else {
948 $(resultLinks)[0].focus();
949 }
950 }else{
951 let link = '#' + $(resultLinks)[index+1].id;
952 if ($(link).length > 0) {
953 $(link).focus();
954 } else {
955 $(resultLinks)[index+1].focus();
956 }
957 }
958 searchInput.attr('aria-activedescendant',focusId);
959 }
960 let typingTimer;
961 let doneTypingInterval = 500;
962 function addListener() {
963 searchInput.on("keydown", function (event) {
964 clearTimeout(typingTimer);
965 });
966 searchInput.on("keyup", function (event) {
967 closeDropdown();
968 clearTimeout(typingTimer);
969 typingTimer = setTimeout(()=>{
970 postSearchQuery(event, function(){})
971 }, doneTypingInterval);
972 });
973 }
974 function getNextFocusElementId(){
975 let nextFocusItem = $(':focus').next();
976 let nextFocusItemID = undefined
977 if(nextFocusItem[0] !== undefined && nextFocusItem[0] !== ""){
978 nextFocusItemID = nextFocusItem[0].id
979 }
980 return nextFocusItemID
981 }
982 function clickHomeInSearchBox(event) {
983 return event.keyCode === 36 && focusInSearchBox() && resultListHasContent();
984 }
985 function clickEndInSearchBox(event) {
986 return event.keyCode === 35 && focusInSearchBox() && resultListHasContent();
987 }
988 function focusInSearchBox() {
989 return searchSection2.find($(':focus')).length === 1;
990 }
991 function resultListHasContent() {
992 return $(resultLinks).length > 0
993 }
994 function isDropdownHidden(){
995 return dropdownList.attr('aria-hidden') === "true";
996 }
997 function closeDropdown() {
998 dropdownList.empty();
999 dropdownList.attr('aria-hidden', 'true');
1000 combobox2.attr('aria-expanded', 'false');
1001 }
1002 function openDropdown() {
1003 dropdownList.attr('aria-hidden', 'false');
1004 }
1005 function getDropdownResultIndex(id) {
1006 let returningValue = undefined;
1007 $(resultLinks).each(function (index, item) {
1008 if (item.id === id) {
1009 returningValue = index;
1010 return false;
1011 }
1012 });
1013 return returningValue;
1014 }
1015 function addFromFakeInputToInput() {
1016 let value = searchInput.val();
1017 search_input.val(value);
1018 if (value.length < 1) {
1019 searchInput.attr('aria-activedescendant', '');
1020 closeDropdown()
1021 } else {
1022 }
1023 }
1024 function setAriaBusy(boolean){
1025 searchInput.attr('aria-busy', boolean);
1026 portlet.find('#searchInput').attr('aria-busy', boolean);
1027 $('#searchInProgress').css('display',boolean?'block':'none')
1028 }
1029 function ajax(queryString, successFunction,completeFunction) {
1030 jQuery.ajax({
1031 url: url2,
1032 data: {
1033 query:queryString
1034 },
1035 type: 'POST',
1036 success: successFunction
1037
1038 }).done(completeFunction)
1039 }
1040 function postSearchQuery(e, complete) {
1041 if (![37, 39, 9, 13, 27,38,40,35,36,13].includes(e.keyCode)) {
1042 if (searchInput.val().length > 1) {
1043 setAriaBusy(true);
1044 ajax(
1045 $(".search-form input").val(),
1046 function (data) {
1047 dropdownList.empty();
1048 dropdownList.append($(data).find("#nothing"));
1049 dropdownList.append($(data).find("#mainCategoryDL"));
1050 dropdownList.append($(data).find("#mainCategoryMB"));
1051 dropdownList.append($(data).find("#mainCategoryER"));
1052
1053 portlet.find('#searchCombobox').attr('aria-expanded', 'true');
1054 portlet.find('#searchResultList').attr('aria-hidden', 'false');
1055 setAriaBusy(false);
1056 },
1057 complete
1058 )
1059 }
1060 }
1061
1062 }
1063 </script>
1064</#macro>
1065
1066<#macro searchResult13 type suchergebnisse>
1067 <#local
1068 searchSynonyme = getterUtil.getBoolean(themeDisplay.getThemeSetting("Search-Show-DL-Synonyme"))
1069 searchShowFacility = getterUtil.getBoolean(themeDisplay.getThemeSetting("Search-Show-ER"))
1070 searchFacilityAddress = getterUtil.getBoolean(themeDisplay.getThemeSetting("Search-Show-ER-Address"))
1071 searchShowEmployee = getterUtil.getBoolean(themeDisplay.getThemeSetting("Search-Show-MB"))
1072 searchEmployeeAddress = getterUtil.getBoolean(themeDisplay.getThemeSetting("Search-Show-MB-Address"))
1073 />
1074 <#if type?lower_case == "er">
1075 <#assign resultName = "Einrichtungen" />
1076 <#elseif type?lower_case == "mb">
1077 <#assign resultName = "Mitarbeitende" />
1078 <#elseif type?lower_case == "dl">
1079 <#assign resultName = "Dienstleistungen" />
1080 </#if>
1081 <#if (type?lower_case == "dl") ||
1082 (type?lower_case == "er" && searchShowFacility) ||
1083 (type?lower_case == "mb" && searchShowEmployee)
1084 >
1085 <ul role="group" class="col-12 col-sm-12 col-md-12 col-lg-4 resultList" aria-labelledby="${type}0" id="mainCategory${type?upper_case}">
1086 <li class="" role="presentation" id="${type}0">
1087 <#assign hits = suchergebnisse?size />
1088 <#if suchergebnisse?size < hits >
1089 <span aria-hidden="true">${resultName} (${hits})</span>
1090 <span class="sr-only">${resultName}. Es werden ${suchergebnisse?size} von ${hits} Ergebnissen in der Liste angezeigt. Bitte schränken Sie die Suche weiter ein.</span>
1091 <#else>
1092 <span>${resultName} (${hits})</span>
1093 </#if>
1094 </li>
1095 <#if suchergebnisse?size gt 0 >
1096 <#list suchergebnisse as suchergebnis>
1097 <#assign
1098 details = ""
1099 />
1100 <li tabindex="0" role="option" class="result-cell resultOption" id="${type}${suchergebnis.id}">
1101 <#if type == "ER" || type == "er">
1102 <#assign resultUrl = utils.getEinrichtungUrl(suchergebnis.id) />
1103 <#assign resultTitle = "${getFullFacilityName3(suchergebnis,'facilityName-search')}" />
1104 <#if searchFacilityAddress>
1105 <#if suchergebnis.anschrift?has_content>
1106 <#assign details = '<span class="details">${suchergebnis.anschrift.anschriftEinzeilig()}</span>'/>
1107 </#if>
1108 </#if>
1109 <#elseif type == "MB" || type == "mb">
1110 <#assign resultUrl = utils.getMitarbeiterUrl(suchergebnis.id) />
1111 <#assign resultTitle = suchergebnis.name />
1112 <#if searchEmployeeAddress>
1113 <#assign details = '<span class="details">'/>
1114 <#if suchergebnis.telefonnummer?has_content>
1115 <#assign details += 'Tel: ${suchergebnis.telefonnummer}'/>
1116 </#if>
1117 <#if suchergebnis.mobil?has_content>
1118 <#assign details += 'Mobil: ${suchergebnis.mobil}'/>
1119 </#if>
1120 <#if suchergebnis.einrichtung?has_content>
1121 <#assign details += 'Einrichtungen: ${suchergebnis.einrichtung}'/>
1122 </#if>
1123 <#if suchergebnis.beschreibung?has_content>
1124 <#assign details += '${suchergebnis.beschreibung}'/>
1125 </#if>
1126 <#if suchergebnis.beschreibungIntern?has_content>
1127 <#assign details += '${suchergebnis.beschreibungIntern}'/>
1128 </#if>
1129 <#assign details += '</span>'/>
1130 </#if>
1131 <#elseif type == "DL" || type == "dl">
1132 <#assign resultUrl = utils.getDienstleistungUrl(suchergebnis.id) />
1133 <#assign resultTitle = suchergebnis.name/>
1134 <#if searchSynonyme>
1135 <#assign details = '<span class="details"><span class="synonyme">${suchergebnis.synonyme}</span></span>'/>
1136 </#if>
1137 </#if>
1138 <a id="${resultName?lower_case}${suchergebnis.id}" href="${resultUrl}" class="cBlue underline">${resultTitle}</a>
1139 ${details}
1140 </li>
1141 </#list>
1142 ${restrictSearch5(suchergebnisse?size, hits)}
1143 <#else>
1144 <li tabindex="0" role="option" class="result-cell resultOption" id="${type}1">Es gab keine Treffer in dieser Kategorie.</li>
1145 </#if>
1146 </ul>
1147 </#if>
1148</#macro>
1149
1150<#function restrictSearch5 size hits >
1151 <#if size < hits>
1152 <#return "<li><p class='small'><strong>Es werden ${size} von $hits Ergebnissen angezeigt.<br>Bitte Suche weiter einschränken.</strong></p></li>" />
1153 </#if>
1154 <#return ''/>
1155</#function>
1156
1157<#function getFullFacilityName3 einrichtung spanClass >
1158 <#assign
1159 counter = 1
1160 einrichtungsname = ''
1161 />
1162 <#list einrichtung.breadcrumb as i>
1163 <#if i.showAlways>
1164 <#assign
1165 einrichtungsname = einrichtungsname + ' <span class="facility-name-level-' + counter + ' ' + spanClass + '">' + i.name + '</span>'
1166 counter = counter+1
1167 />
1168 </#if>
1169 </#list>
1170 <#if einrichtungsname == ''>
1171 <#assign einrichtungsname = '<span class="facility-name-level-1 '+spanClass+'">'+einrichtung.name+'</span>' />
1172 </#if>
1173 <#return einrichtungsname />
1174</#function>
1175
1176
1177
1178
1179
1180
1181<#macro addOnlineServices dienstleistung, renderRequest, linkClass=''>
1182 <#if existsAndSizeGTZero(dienstleistung.extensions) ||
1183 existsAndSizeGTZero(dienstleistung.formulare) ||
1184 (dienstleistung.kontaktformularUrl?? && dienstleistung.kontaktformularUrl?has_content) ||
1185 existsAndSizeGTZero(dienstleistung.textmodul.formulare.weiterfuehrenderLink)>
1186 <ul class="list-unstyled p-0 m-0">
1187 <@addOnlineServiceExtension dienstleistung, renderRequest linkClass/>
1188 <@addOnlineServiceFS dienstleistung, renderRequest linkClass/>
1189 <@addOnlineServiceContact dienstleistung, renderRequest linkClass/>
1190 <@addOnlineLinks dienstleistung, renderRequest linkClass/>
1191 </ul>
1192 </#if>
1193</#macro>
1194
1195<#macro addOnlineServicesLeft dienstleistung, renderRequest, linkClass=''>
1196 <#if existsAndSizeGTZero(dienstleistung.extensions) ||
1197 existsAndSizeGTZero(dienstleistung.formulare) ||
1198 (dienstleistung.kontaktformularUrl?? && dienstleistung.kontaktformularUrl?has_content) ||
1199 existsAndSizeGTZero(dienstleistung.textmodul.formulare.weiterfuehrenderLink)>
1200 <div class="jumbotron mb-5 mt-3">
1201 <h2 class="mb-4">Dienstleistung jetzt online nutzen!</h2>
1202 <@addOnlineServices dienstleistung, renderRequest, linkClass/>
1203 </div>
1204 </#if>
1205</#macro>
1206
1207<#macro addOnlineServicesRight dienstleistung, renderRequest, linkClass=''>
1208 <#if existsAndSizeGTZero(dienstleistung.extensions) ||
1209 existsAndSizeGTZero(dienstleistung.formulare) ||
1210 (dienstleistung.kontaktformularUrl?? && dienstleistung.kontaktformularUrl?has_content) ||
1211 existsAndSizeGTZero(dienstleistung.textmodul.formulare.weiterfuehrenderLink)>
1212 <div class="card border-secondary">
1213 <div class="card-header">
1214 <h2>Onlinedienstleistung</h2>
1215 </div>
1216 <div class="card-body text-secondary">
1217 <ul class="list-unstyled p-0 m-0">
1218 <@addOnlineServices dienstleistung, renderRequest, linkClass/>
1219 </ul>
1220 </div>
1221 </div>
1222 </#if>
1223</#macro>
1224
1225<#macro addOnlineServiceExtension dienstleistung, renderRequest, linkClass=''>
1226 <#if dienstleistung.extensions?has_content>
1227 <#local
1228 userAuthLevel = utils.getAuthLevel(renderRequest)
1229 counter = 0
1230 />
1231 <#list dienstleistung.extensions as formular>
1232 <li>
1233 <#if userAuthLevel gte formular.minAuthLevel >
1234 <#if userAuthLevel gte formular.minAuthLevel >
1235 <#local
1236 name = formular.titel
1237 title = ''
1238 />
1239 <#if formular.paymentSupported>
1240 <#local
1241 name = serviceWithCostIcon +' '+ name
1242 title = serviceWithCostText +' '+ title
1243 />
1244 </#if>
1245 ${addLink(formular.uri,name,title,true,linkClass)}
1246 <#else>
1247 <#if formular.minAuthLevel gt 2>
1248 <#local
1249 name = getEIDIcon(counter,15,15) + ' ' + formular.titel
1250 title = serviceWithEIDText
1251 />
1252 <#if formular.paymentSupported>
1253 <#local
1254 name = serviceWithCostIcon +' '+ name
1255 title = serviceWithCostText +' '+ title
1256 />
1257 </#if>
1258 ${addLink(createLoginURL(themeDisplay.getURLCurrent()),name,title,true,linkClass)}
1259 <#else>
1260 <#local
1261 name = serviceWithLoginIcon + ' ' + formular.titel
1262 title = serviceWithLoginText
1263 />
1264 <#if formular.paymentSupported>
1265 <#local
1266 name = serviceWithCostIcon +' '+ name
1267 title = serviceWithCostText +' '+ title
1268 />
1269 </#if>
1270 ${addLink(createLoginURL(themeDisplay.getURLCurrent()),title,serviceWithLoginText,true,linkClass)}
1271 </#if>
1272 </#if>
1273 </#if>
1274 </li>
1275 <#local counter += 1/>
1276 </#list>
1277 </#if>
1278</#macro>
1279
1280<#macro addOnlineServiceFS dienstleistung, renderRequest, linkClass=''>
1281 <#if dienstleistung.formulare?has_content>
1282 <li>
1283 <#list dienstleistung.formulare as formular>
1284 <#if !utils.angemeldet && !dienstleistung.nutzbarAlsGast>
1285 <#local
1286 href ="${createLoginURL(formular.uri)}"
1287 title = serviceWithLoginText
1288 name ="${serviceWithLoginIcon} ${formular.titel}"
1289 />
1290 <#else>
1291 <#local
1292 href = "${formular.uri}"
1293 title = ''
1294 name = "${formular.titel}"
1295 />
1296 </#if>
1297 ${addLink(href,name,title,true,linkClass)}
1298 </#list>
1299 </li>
1300 </#if>
1301</#macro>
1302
1303<#macro addOnlineServiceContact dienstleistung, renderRequest, linkClass=''>
1304 <#if dienstleistung.kontaktformularUrl?has_content>
1305 <li>
1306 <#if !utils.angemeldet && !dienstleistung.nutzbarAlsGast>
1307 <#local
1308 href ="${createLoginURL(dienstleistung.kontaktformularUrl)}"
1309 title = serviceWithLoginText
1310 name ="${serviceWithLoginIcon} Zum Kontaktformular"
1311 />
1312
1313 <#else>
1314 <#local
1315 href ="${dienstleistung.kontaktformularUrl}"
1316 title = ''
1317 name ="Zum Kontaktformular"
1318 />
1319 </#if>
1320 ${addLink(href,name,title,true,linkClass)}
1321 </li>
1322 </#if>
1323</#macro>
1324
1325<#macro addOnlineLinks dienstleistung, renderRequest, linkClass=''>
1326 <#if dienstleistung.textmodul.formulare.weiterfuehrenderLink?has_content>
1327 <#list dienstleistung.textmodul.formulare.weiterfuehrenderLink as formular>
1328 <li>
1329 <#if !utils.angemeldet && !dienstleistung.nutzbarAlsGast>
1330 <#local
1331 href ="${createLoginURL(themeDisplay.getURLCurrent())}"
1332 title = serviceWithLoginText
1333 name ="${serviceWithLoginIcon} ${formular.titel}"
1334 />
1335 <#else>
1336 <#local
1337 href ="${formular.uri}"
1338 title = ''
1339 name ="${formular.titel}"
1340 />
1341 </#if>
1342 ${addLink(href,name,title,formular.neuesFenster,linkClass)}
1343 </li>
1344 </#list>
1345 </#if>
1346</#macro>
1347
1348<#function addLink uri, inlineTitle, title, target, class = ''>
1349 <#return '<a class="${class}" href="${uri}" title="${title}" target="${target?then("_blank", "_self")}">${inlineTitle}</a>'/>
1350</#function>
1351
1352<#function createLoginURL destination>
1353 <#local
1354 login_url1_WithHtml = '/login?p_p_id=com_liferay_login_web_portlet_LoginPortlet&p_p_lifecycle=0&_com_liferay_login_web_portlet_LoginPortlet_redirect='
1355 login_url2_WithHtml = '" rel="nofollow" data-redirect="true"'
1356 />
1357 <#return login_url1_WithHtml+destination+login_url2_WithHtml/>
1358</#function>
1359
1360<#macro createLoginURL2 destination>
1361 ${createLoginURL(destination)}
1362</#macro>
1363
1364<#function existsAndSizeGTZero element>
1365 <#if element?? && element?size gt 0>
1366 <#return true />
1367 <#else>
1368 <#return false />
1369 </#if>
1370</#function>
1371
1372<#function existsAndHasContent element>
1373 <#if element?? && element?has_content>
1374 <#return true />
1375 <#else>
1376 <#return false />
1377 </#if>
1378</#function>
1379
1380<#function getEIDIcon id width=15 height=15>
1381 <#local icon ='<svg style="vertical-align: text-bottom;" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"'/>
1382 <#local icon +=' version="1.0" width="${width}" height="${height}" viewBox="-1.10212497 -1.10212497 38.94174894 38.94299994"'/>
1383 <#local icon +=' id="${id}-svg2696">'/>
1384 <#local icon +=' <defs id="${id}-defs2698">'/>
1385 <#local icon +=' <linearGradient x1="0" y1="0" x2="1" y2="0" id="${id}-linearGradient2559" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,21.289352,21.289352,0,33.587295,364.15855)" spreadMethod="pad">'/>
1386 <#local icon +=' <stop id="${id}-stop2561" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>'/>
1387 <#local icon +=' <stop id="${id}-stop2563" style="stop-color:#ffffff;stop-opacity:1" offset="0.78019702"/>'/>
1388 <#local icon +=' <stop id="${id}-stop2565" style="stop-color:#ffffff;stop-opacity:1" offset="0.78019702"/>'/>
1389 <#local icon +=' <stop id="${id}-stop2567" style="stop-color:#ffffff;stop-opacity:1" offset="1"/>'/>
1390 <#local icon +=' </linearGradient>'/>
1391 <#local icon +=' <linearGradient x1="0" y1="0" x2="1" y2="0" id="${id}-linearGradient2688" xlink:href="#${id}-linearGradient2559"'/>
1392 <#local icon +=' gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-26.61169,26.61169,0,5.06287,31.67544)" spreadMethod="pad"/>'/>
1393 <#local icon +=' <linearGradient x1="0" y1="0" x2="1" y2="0" id="${id}-linearGradient2583" gradientUnits="userSpaceOnUse"'/>
1394 <#local icon +=' gradientTransform="matrix(0,-21.289352,21.289352,0,45.222916,385.44789)" spreadMethod="pad">'/>
1395 <#local icon +=' <stop id="${id}-stop2585" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>'/>
1396 <#local icon +=' <stop id="${id}-stop2587" style="stop-color:#ffffff;stop-opacity:1" offset="1"/>'/>
1397 <#local icon +=' </linearGradient>'/>
1398 <#local icon +=' <linearGradient x1="0" y1="0" x2="1" y2="0" id="${id}-linearGradient2683" xlink:href="#${id}-linearGradient2583"'/>
1399 <#local icon +=' gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,26.61169,26.61169,0,19.60739,5.06376)" spreadMethod="pad"/>'/>
1400 <#local icon +=' </defs>'/>
1401 <#local icon +=' <path d="M 5.0625,18.36987 C 5.0625,25.32362 10.36125,30.97612 17.13,31.67487 L 17.13,31.67487 L 17.13,26.93612 C 12.98,26.27237 9.8025,22.70487 9.8025,18.36987 L 9.8025,18.36987 C 9.8025,14.03362 12.98,10.46612 17.13,9.80237 L 17.13,9.80237 L 17.13,5.06487 C 10.36125,5.76237 5.0625,11.41612 5.0625,18.36987" id="path2569" style="fill:url(#${id}-linearGradient2688);stroke:none"/>'/>
1402 <#local icon +=' <path d="M 19.6075,9.80237 C 23.75625,10.46612 26.93625,14.03362 26.93625,18.36987 L 26.93625,18.36987 C 26.93625,22.70487 23.75625,26.27237 19.6075,26.93612 L 19.6075,26.93612 L 19.6075,31.67487 C 26.37625,30.97612 31.675,25.32362 31.675,18.36987 L 31.675,18.36987 C 31.675,11.41612 26.37625,5.76237 19.6075,5.06487 L 19.6075,5.06487 L 19.6075,9.80237 z" id="path2589" style="fill:url(#${id}-linearGradient2683);stroke:none"/>'/>
1403 <#local icon +=' <path d="M 36.7375,31.52125 L 36.7375,5.2175 C 36.7375,5.2175 36.7375,0 31.52,0 L 5.2175,0 C 5.2175,0 0,0 0,5.2175 L 0,31.52125 C 0,31.52125 0,36.738749 5.2175,36.738749 L 31.52,36.738749 C 31.52,36.738749 36.7375,36.738749 36.7375,31.52125 M 35.645,31.2975 C 35.645,35.644999 31.2975,35.644999 31.2975,35.644999 L 5.44,35.644999 C 1.0925,35.644999 1.0925,31.2975 1.0925,31.2975 L 1.0925,5.44125 C 1.0925,1.09375 5.44,1.09375 5.44,1.09375 L 31.2975,1.09375 C 35.645,1.09375 35.645,5.44125 35.645,5.44125 L 35.645,31.2975 z" id="path2601" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"/>'/>
1404 <#local icon +='</svg>'/>
1405 <#return icon/>
1406</#function>
1407
1408
1409<#function linklooper linkList>
1410 <#local
1411 value = ""
1412 class = ""
1413 target = ""
1414 />
1415 <#if linkList??>
1416 <#list linkList.weiterfuehrenderLink as link>
1417 <#local
1418 targetValue = link.neuesFenster?string('_blank','_self')
1419 value = value + "<li><a href='${link.uri}' title='${link.titel}' class='${class}' target='${targetValue}' >${link.titel}</a></li>"/>
1420 </#list>
1421 </#if>
1422 <#return value>
1423</#function>