Initial commit - Typo3 11.5.41

This commit is contained in:
Matteo Gallo
2026-07-03 17:53:31 +02:00
commit 5ca4743197
6811 changed files with 568848 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
# Apache >= 2.3
<IfModule mod_authz_core.c>
Require all denied
</IfModule>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2017-04-04T12:30:37Z" product-name="tt_address">
<header/>
<body>
<trans-unit id="extbase_title" xml:space="preserve">
<source>Addresses</source>
</trans-unit>
<trans-unit id="extbase_description" xml:space="preserve">
<source>Displays one or more addresses.</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2017-04-05T08:11:35Z" product-name="tt_address">
<header/>
<body>
<trans-unit id="pi1_flexform.sheet_selection" xml:space="preserve">
<source>Selection</source>
</trans-unit>
<trans-unit id="pi1_flexform.single_records" xml:space="preserve">
<source>Single addresses</source>
</trans-unit>
<trans-unit id="pi1_flexform.group_selection" xml:space="preserve">
<source>Categories</source>
</trans-unit>
<trans-unit id="pi1_flexform.includeSubcategories" xml:space="preserve">
<source>Include subcategories</source>
</trans-unit>
<trans-unit id="pi1_flexform.combination" xml:space="preserve">
<source>Combination</source>
</trans-unit>
<trans-unit id="pi1_flexform.combination.and" xml:space="preserve">
<source>AND</source>
</trans-unit>
<trans-unit id="pi1_flexform.combination.or" xml:space="preserve">
<source>OR</source>
</trans-unit>
<trans-unit id="pi1_flexform.sortBy" xml:space="preserve">
<source>Sort By</source>
</trans-unit>
<trans-unit id="pi1_flexform.sortBy.singleSelection" xml:space="preserve">
<source>Order of single addresses</source>
</trans-unit>
<trans-unit id="pi1_flexform.sortBy.sorting" xml:space="preserve" approved="yes">
<source>Order of addresses</source>
</trans-unit>
<trans-unit id="pi1_flexform.sortBy.sorting.default" xml:space="preserve" approved="yes">
<source>Default</source>
</trans-unit>
<trans-unit id="pi1_flexform.sortBy.sorting.sorting" xml:space="preserve" approved="yes">
<source>Manual sorting</source>
</trans-unit>
<trans-unit id="pi1_flexform.sortOrder" xml:space="preserve">
<source>Sort Order</source>
</trans-unit>
<trans-unit id="pi1_flexform.sortOrder.ascending" xml:space="preserve">
<source>Ascending</source>
</trans-unit>
<trans-unit id="pi1_flexform.sortOrder.descending" xml:space="preserve">
<source>Descending</source>
</trans-unit>
<trans-unit id="pi1_flexform.ignoreWithoutCoordinates" xml:space="preserve">
<source>Ignore records with no latitude/longitude</source>
</trans-unit>
<trans-unit id="pi1_flexform.allowOverride" xml:space="preserve">
<source>Allow override configuration by GET/POST</source>
</trans-unit>
<trans-unit id="pi1_flexform.sheet_display" xml:space="preserve">
<source>Display</source>
</trans-unit>
<trans-unit id="pi1_flexform.templateFile" xml:space="preserve">
<source>Template</source>
</trans-unit>
<trans-unit id="pi1_flexform.templateFile.I.0" xml:space="preserve">
<source>Default</source>
</trans-unit>
<trans-unit id="pi1_flexform.displayMode" xml:space="preserve">
<source>Select display mode</source>
</trans-unit>
<trans-unit id="pi1_flexform.displayMode.listView" xml:space="preserve">
<source>List view</source>
</trans-unit>
<trans-unit id="pi1_flexform.displayMode.singleView" xml:space="preserve">
<source>Single view</source>
</trans-unit>
<trans-unit id="pi1_flexform.displayMode.map" xml:space="preserve">
<source>Map view</source>
</trans-unit>
<trans-unit id="pi1_flexform.hidePagination" xml:space="preserve">
<source>Do not display pagebrowser (listview)</source>
</trans-unit>
<trans-unit id="pi1_flexform.itemsPerPage" xml:space="preserve">
<source>Number of items to be displayed (listview)</source>
</trans-unit>
<trans-unit id="pi1_flexform.singlePid" xml:space="preserve">
<source>Page for single view</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<xliff version="1.0">
<file source-language="en" datatype="plaintext" original="messages" date="2017-04-13T10:24:37Z" product-name="tt_address">
<header/>
<body>
<trans-unit id="label.address" xml:space="preserve">
<source>Address</source>
</trans-unit>
<trans-unit id="label.building" xml:space="preserve">
<source>Building</source>
</trans-unit>
<trans-unit id="label.room" xml:space="preserve">
<source>Room</source>
</trans-unit>
<trans-unit id="label.position" xml:space="preserve">
<source>Position</source>
</trans-unit>
<trans-unit id="label.zip" xml:space="preserve">
<source>Postal code</source>
</trans-unit>
<trans-unit id="label.city" xml:space="preserve">
<source>City</source>
</trans-unit>
<trans-unit id="label.telephone" xml:space="preserve">
<source>Telephone</source>
</trans-unit>
<trans-unit id="label.fax" xml:space="preserve">
<source>Fax</source>
</trans-unit>
<trans-unit id="label.mobile" xml:space="preserve">
<source>Mobile phone</source>
</trans-unit>
<trans-unit id="label.email" xml:space="preserve">
<source>E-mail</source>
</trans-unit>
<trans-unit id="label.www" xml:space="preserve">
<source>Go to website</source>
</trans-unit>
<trans-unit id="label.socialmedia" xml:space="preserve">
<source>Social media contacts</source>
</trans-unit>
<trans-unit id="label.twitter" xml:space="preserve" translate="no">
<source>Twitter</source>
</trans-unit>
<trans-unit id="label.facebook" xml:space="preserve" translate="no">
<source>Facebook</source>
</trans-unit>
<trans-unit id="label.linkedin" xml:space="preserve" translate="no">
<source>LinkedIn</source>
</trans-unit>
<trans-unit id="label.skype" xml:space="preserve" translate="no">
<source>Skype</source>
</trans-unit>
<trans-unit id="label.birthday" xml:space="preserve">
<source>Birthday</source>
</trans-unit>
<trans-unit id="paginate_overall" xml:space="preserve">
<source>Page %s of %s</source>
</trans-unit>
<trans-unit id="paginate_next">
<source>Next</source>
</trans-unit>
<trans-unit id="paginate_previous">
<source>Previous</source>
</trans-unit>
<trans-unit id="backToList">
<target>Back to list</target>
</trans-unit>
<trans-unit id="more">
<source>More</source>
</trans-unit>
<trans-unit id="show_on_map">
<source>Show on map</source>
</trans-unit>
<trans-unit id="no_google_maps_key">
<source>No Google Maps key provided with TypoScript</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,122 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.0" xmlns:t3="http://typo3.org/schemas/xliff">
<file t3:id="1502483828" source-language="en" datatype="plaintext" original="messages" date="2017-08-11T20:37:40Z" product-name="tt_address">
<header/>
<body>
<trans-unit id="tt_address">
<source>Address</source>
</trans-unit>
<trans-unit id="tt_address.gender">
<source>Gender</source>
</trans-unit>
<trans-unit id="tt_address.gender.m">
<source>Male (Mr)</source>
</trans-unit>
<trans-unit id="tt_address.gender.f">
<source>Female (Mrs)</source>
</trans-unit>
<trans-unit id="tt_address.gender.v">
<source>Various</source>
</trans-unit>
<trans-unit id="tt_address.gender.undefined">
<source>Undefined</source>
</trans-unit>
<trans-unit id="tt_address.first_name">
<source>First Name</source>
</trans-unit>
<trans-unit id="tt_address.middle_name">
<source>Middle Name</source>
</trans-unit>
<trans-unit id="tt_address.last_name">
<source>Last Name</source>
</trans-unit>
<trans-unit id="tt_address.birthday">
<source>Birthday</source>
</trans-unit>
<trans-unit id="tt_address.building">
<source>Building</source>
</trans-unit>
<trans-unit id="tt_address.room">
<source>Room</source>
</trans-unit>
<trans-unit id="tt_address.organization">
<source>Organization</source>
</trans-unit>
<trans-unit id="tt_address.position">
<source>Position</source>
</trans-unit>
<trans-unit id="tt_address.region">
<source>Region / State</source>
</trans-unit>
<trans-unit id="tt_address.mobile">
<source>Mobile</source>
</trans-unit>
<trans-unit id="tt_address.skype">
<source>Skype</source>
</trans-unit>
<trans-unit id="tt_address.twitter">
<source>Twitter</source>
</trans-unit>
<trans-unit id="tt_address.facebook">
<source>Facebook</source>
</trans-unit>
<trans-unit id="tt_address.instagram">
<source>Instagram</source>
</trans-unit>
<trans-unit id="tt_address.tiktok">
<source>TikTok</source>
</trans-unit>
<trans-unit id="tt_address.linkedin">
<source>LinkedIn</source>
</trans-unit>
<trans-unit id="tt_address.latitude">
<source>Latitude</source>
</trans-unit>
<trans-unit id="tt_address.longitude">
<source>Longitude</source>
</trans-unit>
<trans-unit id="tt_address.title_suffix">
<source>Title suffix</source>
</trans-unit>
<trans-unit id="tt_address.locationMapWizard">
<source>Map wizard for visual selection of coordinates</source>
</trans-unit>
<trans-unit id="tt_address.locationMapWizard.close">
<source>Close Map Wizard</source>
</trans-unit>
<trans-unit id="tt_address.locationMapWizard.import">
<source>Import marker-coordinates</source>
</trans-unit>
<trans-unit id="tt_address_tab.contact">
<source>Contact</source>
</trans-unit>
<trans-unit id="tt_address_tab.address">
<source>Address</source>
</trans-unit>
<trans-unit id="tt_address_palette.name">
<source>Name</source>
</trans-unit>
<trans-unit id="tt_address_palette.organization">
<source>Organisation</source>
</trans-unit>
<trans-unit id="tt_address_palette.address">
<source>Address</source>
</trans-unit>
<trans-unit id="tt_address_palette.building">
<source>Building</source>
</trans-unit>
<trans-unit id="tt_address_palette.contact">
<source>Contact</source>
</trans-unit>
<trans-unit id="tt_address_palette.social">
<source>Social Networks</source>
</trans-unit>
<trans-unit id="tt_address_palette.coordinates">
<source>Coordinates</source>
</trans-unit>
<trans-unit id="pi_tt_address">
<source>Addresses</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -0,0 +1,3 @@
<div class="tx-ttaddress">
<f:render section="main"/>
</div>

View File

@@ -0,0 +1,112 @@
{namespace ttaddr=FriendsOfTYPO3\TtAddress\ViewHelpers}
<f:section name="address">
<f:if condition="{address.address}">
<div class="address" itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
<address>
<span itemprop="streetAddress">{address.address}</span><br>
<span itemprop="postalCode">{address.zip}</span>&nbsp;<span
itemprop="addressLocality">{address.city}</span><br>
<span itemprop="addressCountry">{address.country}</span>
</address>
</div>
</f:if>
</f:section>
<f:section name="position">
<f:if condition="{address.position}">
<p class="jobTitle" itemprop="jobTitle"><em>{address.position}</em></p>
</f:if>
</f:section>
<f:section name="contact">
<ul class="list-unstyled">
<f:if condition="{address.phone}">
<li>
<i class="fas fa-phone"></i>
{f:translate(key:'label.telephone')}: <a href="tel:{address.cleanedPhone}">
<span itemprop="telephone">{address.phone}</span>
</a>
</li>
</f:if>
<f:if condition="{address.mobile}">
<li>
<i class="fas fa-mobile-alt"></i>
{f:translate(key:'label.mobile')}: <a href="tel:{address.cleanedMobile}">
<span itemprop="telephone">{address.mobile}</span>
</a>
</li>
</f:if>
<f:if condition="{address.fax}">
<li>
<i class="fas fa-fax"></i>
{f:translate(key:'label.fax')}: <span itemprop="faxNumber">{address.fax}</span>
</li>
</f:if>
<f:if condition="{address.email}">
<li>
<i class="fas fa-envelope"></i>
{f:translate(key:'label.email')}:
<span><f:link.email email="{address.email}" /></span>
</li>
</f:if>
<f:if condition="{address.www}">
<meta itemprop="url" content="{f:uri.typolink(parameter:address.www)}"/>
<li>
<i class="fas fa-link"></i>
{f:translate(key:'label.www')}:
<f:link.typolink parameter="{address.www}">{address.wwwSimplified}</f:link.typolink>
</li>
</f:if>
<f:if condition="{address.birthday}">
<meta itemprop="birthDate" content="{address.birthday -> f:format.date(format:'%Y-%m-%d')}">
<li>
<i class="fas fa-birthday-cake"></i>
{f:translate(key:'label.birthday')}: {address.birthday -> f:format.date(format:'%d.%m.%Y')}
</li>
</f:if>
</ul>
</f:section>
<f:section name="social">
<f:if condition="{address.skype} || {address.twitter} || {address.facebook} || {address.linkedin}">
<ul class="list-inline">
<f:if condition="{address.skype}">
<li class="list-inline-item">
<i class="fab fa-skype" aria-hidden title="{f:translate(key:'label.skype')}"></i>
<span class="sr-only">{f:translate(key:'label.skype')}:</span>
<a href="skype:{address.skype}?call">{address.skype}</a>
<meta itemprop="sameAs" content="skype:{address.skype}?call"/>
</li>
</f:if>
<f:if condition="{address.twitter}">
<li class="list-inline-item">
<i class="fab fa-twitter" aria-hidden title="{f:translate(key:'label.twitter')}"></i>
<span class="sr-only">{f:translate(key:'label.twitter')}:</span>
<a href="https://twitter.com/{address.twitter}" target="_blank">{address.twitter}</a>
<meta itemprop="sameAs" content="https://twitter.com/{address.twitter}"/>
</li>
</f:if>
<f:if condition="{address.facebook}">
<li class="list-inline-item">
<i class="fab fa-facebook" aria-hidden title="{f:translate(key:'label.facebook')}"></i>
<span class="sr-only">{f:translate(key:'label.facebook')}:</span>
<a href="https://www.facebook.com/{address.facebook}" target="_blank">{address.facebook}</a>
<meta itemprop="sameAs" content="https://www.facebook.com/{address.facebook}"/>
</li>
</f:if>
<f:if condition="{address.linkedin}">
<li class="list-inline-item">
<i class="fab fa-linkedin" aria-hidden title="{f:translate(key:'label.linkedin')}"></i>
<span class="sr-only">{f:translate(key:'label.linkedin')}:</span>
<a href="https://www.linkedin.com/in/{address.linkedin}" target="_blank">{address.linkedin}</a>
<meta itemprop="sameAs" content="https://www.linkedin.com/in/{address.linkedin}"/>
</li>
</f:if>
</ul>
</f:if>
</f:section>

View File

@@ -0,0 +1,109 @@
<div class="vcard tt_address_detail" itemscope itemtype="http://schema.org/Person">
<h4 itemprop="name">{address.fullName}</h4>
<f:render section="position" partial="Address" arguments="{_all}"/>
<f:if condition="{address.image}">
<f:then>
<div class="row">
<div class="col-md-3">
<figure class="figure">
<f:image image="{address.firstImage}" width="600"
class="figure-img img-fluid img-thumbnail rounded"
alt="{address.firstImage.originalResource.alt}"
title="{address.firstImage.originalResource.title}"
additionalAttributes="{itemprop:'image'}"/>
<f:if condition="{address.firstImage.originalResource.description}">
<figcaption class="figure-caption">
{address.firstImage.originalResource.description ->
f:format.nl2br()}
</figcaption>
</f:if>
</figure>
</div>
<div class="col-md-9">
<f:render section="content" arguments="{_all}"/>
</div>
</div>
</f:then>
<f:else>
<f:render section="content" arguments="{_all}"/>
</f:else>
</f:if>
</div>
<f:section name="content">
<f:if condition="{address.description}">
<div class="description" itemprop="description">
{address.description -> f:format.html()}
</div>
</f:if>
<f:render section="address" partial="Address" arguments="{_all}"/>
<f:if condition="{address.building} || {address.room}">
<ul class="list-inline">
<f:if condition="{address.building}">
<li class="list-inline-item">
{f:translate(key:'label.building')}: {address.building}
</li>
</f:if>
<f:if condition="{address.room}">
<li class="list-inline-item">
{f:translate(key:'label.room')}: {address.room}
</li>
</f:if>
</ul>
</f:if>
<f:render section="contact" partial="Address" arguments="{_all}"/>
<f:render section="social" partial="Address" arguments="{_all}"/>
<f:if condition="{address.image -> f:count()} > 1">
<div class="address-image-rows">
<div class="row">
<f:for each="{address.image}" as="img" iteration="iterator">
<f:if condition="{iterator.cycle}>1">
<div class="col-md-4">
<figure class="figure">
<f:if condition="{img.originalResource.link}">
<f:then>
<f:link.typolink
parameter="{img.originalResource.link}"
class="media-object {settings.detail.imageClass}"
additionalAttributes="{title:img.originalResource.title}">
<f:image image="{img}" width="400"
alt="{img.originalResource.alt}"
title="{img.originalResource.title}"
class="figure-img img-fluid img-thumbnail rounded"
additionalAttributes="{itemprop:'image'}"/>
</f:link.typolink>
</f:then>
<f:else>
<a href="{f:uri.image(src:img.originalResource.publicUrl, maxWidth:1000)}"
class="media-object {settings.detail.imageClass}"
rel="images_tt_address_{address.uid}"
title="{img.originalResource.title}"
target="_blank">
<f:image image="{img}" width="400"
alt="{img.originalResource.alt}"
title="{img.originalResource.title}"
class="figure-img img-fluid img-thumbnail rounded"
additionalAttributes="{itemprop:'image'}"/>
</a>
</f:else>
</f:if>
<f:if condition="{img.originalResource.description}">
<figcaption class="figure-caption">
{img.originalResource.description -> f:format.nl2br()}
</figcaption>
</f:if>
</figure>
</div>
</f:if>
</f:for>
</div>
</div>
</f:if>
</f:section>

View File

@@ -0,0 +1,32 @@
<div class="vcard" itemscope itemtype="http://schema.org/Person">
<div class="row">
<div class="col-md-2 addressImage">
<f:link.action action="show" arguments="{address : address}"
title="{address.fullName}"
pageUid="{settings.singlePid}">
<f:if condition="{address.image}">
<f:media file="{address.firstImage}" width="400" class="img-fluid img-thumbnail rounded"
alt="{address.firstImage.originalResource.alt}"
title="{address.fullName}"/>
</f:if>
</f:link.action>
</div>
<div class="col-md-10">
<h3>{address.fullName}</h3>
<f:if condition="{address.position}">
<p class="position"><em>{address.position}</em></p>
</f:if>
<f:render section="address" partial="Address" arguments="{_all}"/>
<f:render section="social" partial="Address" arguments="{_all}"/>
<f:if condition="{settings.singlePid}">
<f:link.action action="show" arguments="{address : address}"
title="{address.fullName}"
pageUid="{settings.singlePid}" class="btn btn-default">{f:translate(key:'more')}
</f:link.action>
</f:if>
</div>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<f:widget.paginate objects="{addresses}" as="paginatedAdresses" configuration="{settings.paginate}">
<f:for each="{paginatedAdresses}" as="address" iteration="iterator">
<f:render partial="ListItem" arguments="{_all}"/>
</f:for>
</f:widget.paginate>
<f:comment><!-- todo: remove with version 8 --></f:comment>

View File

@@ -0,0 +1,74 @@
{namespace ttaddr=FriendsOfTYPO3\TtAddress\ViewHelpers}
<f:section name="leaflet">
<f:render section="rendering" arguments="{_all}"/>
<f:asset.css identifier="ttaddress-leaflet" href="EXT:tt_address/Resources/Public/Contrib/leaflet-core-1.4.0.css" />
<f:asset.css identifier="ttaddress" href="EXT:tt_address/Resources/Public/Styles/basic.css" />
<f:asset.script identifier="ttaddress-leaflet-core" src="EXT:tt_address/Resources/Public/JavaScript/leaflet-core-1.4.0.js" />
<f:asset.script identifier="ttaddress-leaflet" src="EXT:tt_address/Resources/Public/JavaScript/Frontend/Leaflet.js" />
</f:section>
<f:section name="googleMaps">
<f:if condition="{settings.map.googleMaps.key}">
<f:then>
<f:render section="rendering" arguments="{_all}"/>
<script src="https://maps.googleapis.com/maps/api/js?key={settings.map.googleMaps.key}"
type="text/javascript"></script>
<script type="text/javascript" src="{f:uri.resource(path:'JavaScript/Frontend/GoogleMaps.js')}"></script>
</f:then>
<f:else>
<div class="alert alert-danger">{f:translate(key:'no_google_maps_key')}</div>
</f:else>
</f:if>
</f:section>
<f:section name="staticGoogleMaps">
<f:if condition="{settings.map.staticGoogleMaps.parameters.key}">
<f:then>
<img src="{ttaddr:staticGoogleMaps(parameters:settings.map.staticGoogleMaps.parameters,addresses:addresses)}" />
</f:then>
<f:else>
<div class="alert alert-danger">{f:translate(key:'no_google_maps_key')}</div>
</f:else>
</f:if>
</f:section>
<f:section name="rendering">
<div class="row">
<div class="col-md-3">
<ul class="list-group">
<f:for each="{addresses}" as="address" iteration="i">
<li id="ttaddress__label-{address.uid}" class="ttaddress__label list-group-item">
<strong>{address.fullName}</strong><br>
<f:render partial="Address" section="address" arguments="{_all}"/>
<a href="#" data-iteration-id="{i.index}" class="ttaddress__markerlink">{f:translate(key:'show_on_map')}</a>
</li>
</f:for>
</ul>
</div>
<div class="col-md-9">
<div id="ttaddress__map" data-default-lat="{settings.map.defaultPosition.lat}"
data-default-lng="{settings.map.defaultPosition.lng}"></div>
<ul id="ttaddress__records">
<f:for each="{addresses}" as="address">
<div id="ttaddress__record-{address.uid}" data-id="{address.uid}" data-lat="{address.latitude}"
data-lng="{address.longitude}" data-icon="icon">
<h6>{address.fullName}</h6>
<div>
<f:render partial="Address" section="address" arguments="{_all}"/>
<f:render partial="Address" section="contact" arguments="{_all}"/>
<f:if condition="{settings.singlePid}">
<f:link.action action="show" arguments="{address : address}" title="{address.fullName}" class="btn"
pageUid="{settings.singlePid}">{f:translate(key:'more')}
</f:link.action>
</f:if>
</div>
</div>
</f:for>
</ul>
</div>
</div>
</f:section>

View File

@@ -0,0 +1,9 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:ttaddr="http://typo3.org/ns/FriendsOfTYPO3/TtAddress/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:variable name="address">{address.fullName} {f:if(condition: address.phone,then:'☎ {address.phone}')} {f:if(condition: address.addressInOneLine,then:'➤ {address.addressInOneLine}')}</f:variable>
<ttaddr:metaTag property="description">{address}</ttaddr:metaTag>
<ttaddr:metaTag property="og:description">{address}</ttaddr:metaTag>
</html>

View File

@@ -0,0 +1,52 @@
<ul class="f3-widget-paginator">
<f:if condition="{pagination.previousPageNumber} && {pagination.previousPageNumber} >= {pagination.firstPageNumber}">
<f:then>
<f:comment>
<li class="first">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: 1})}" title="{f:translate(key:'pagination.first')}">
<i class="material-icons">first_page</i>
</a>
</li>
</f:comment>
<li class="previous">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.previousPageNumber})}" title="{f:translate(key:'widget.pagination.previous', extensionName: 'fluid')}">
{f:translate(key:'widget.pagination.previous', extensionName: 'fluid')}
</a>
</li>
</f:then>
<f:else>
<f:comment>
<li class="disabled"><span><i class="material-icons">first_page</i></span></li>
<li class="disabled"><span>{f:translate(key:'widget.pagination.previous', extensionName: 'fluid')}</span></li>
</f:comment>
</f:else>
</f:if>
<f:for each="{pagination.allPageNumbers}" as="page">
<li class="{f:if(condition: '{page} == {paginator.currentPageNumber}', then:'current')}">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: page})}">{page}</a>
</li>
</f:for>
<f:if condition="{pagination.nextPageNumber} && {pagination.nextPageNumber} <= {pagination.lastPageNumber}">
<f:then>
<li class="next">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.nextPageNumber})}" title="{f:translate(key:'widget.pagination.next', extensionName: 'fluid')}">
{f:translate(key:'widget.pagination.next', extensionName: 'fluid')}
</a>
</li>
<f:comment>
<li class="last">
<a href="{f:uri.action(action:actionName, arguments:{currentPage: pagination.lastPageNumber})}" title="{f:translate(key:'pagination.last')}">
last
</a>
</li>
</f:comment>
</f:then>
<f:else>
<f:comment>
<li class="disabled"><span>{f:translate(key:'widget.pagination.previous', extensionName: 'fluid')}</span></li>
<li class="disabled"><span>last page</span></li>
</f:comment>
</f:else>
</f:if>
</ul>

View File

@@ -0,0 +1,40 @@
<f:layout name="Default"/>
<f:section name="main">
<div class="tt_address_list">
<f:render section="displayMode_{settings.displayMode}" arguments="{_all}" />
</div>
</f:section>
<f:section name="displayMode_list">
<!--TYPO3SEARCH_end-->
<f:if condition="{settings.hidePagination}">
<f:then>
<f:for each="{addresses}" as="address" iteration="iterator">
<f:render partial="ListItem" arguments="{_all}"/>
</f:for>
</f:then>
<f:else>
<f:if condition="{settings.paginate.insertAbove}">
<f:render partial="Pagination" arguments="{pagination: pagination.pagination, pages: pagination.pages, paginator: pagination.paginator}" />
</f:if>
<f:for each="{pagination.paginator.paginatedItems}" as="address" iteration="iterator">
<f:render partial="ListItem" arguments="{_all}"/>
</f:for>
<f:if condition="{settings.paginate.insertBelow}">
<f:render partial="Pagination" arguments="{pagination: pagination.pagination, pages: pagination.pages, paginator: pagination.paginator}" />
</f:if>
</f:else>
</f:if>
<!--TYPO3SEARCH_begin-->
</f:section>
<f:section name="displayMode_single">
<f:for each="{addresses}" as="address">
<f:render partial="Full" arguments="{_all}"/>
</f:for>
</f:section>
<f:section name="displayMode_map">
<f:render partial="Maps" section="{settings.map.rendering}" arguments="{_all}"/>
</f:section>

View File

@@ -0,0 +1,6 @@
<f:layout name="Default"/>
<f:section name="main">
<f:render partial="MetaTags" arguments="{_all}" />
<f:render partial="Full" arguments="{_all}"/>
</f:section>

View File

@@ -0,0 +1,95 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:variable name="flex">{pi_flexform_transformed.settings}</f:variable>
<table class="table table-condensed table-triped">
<thead>
<tr>
<td colspan="2"><strong>{f:translate(key:'LLL:EXT:tt_address/Resources/Private/Language/db/locallang.xlf:extbase_title')}</strong>
</td>
</tr>
</thead>
<tbody>
<f:if condition="{flex.displayMode}">
<tr>
<th>{f:translate(key:'{_computed.lll}displayMode')}</th>
<td>
<f:switch expression="{flex.displayMode}">
<f:case value="list">{f:translate(key:'{_computed.lll}displayMode.listView')}</f:case>
<f:case value="single">{f:translate(key:'{_computed.lll}displayMode.singleView')}
</f:case>
<f:case value="map">{f:translate(key:'{_computed.lll}displayMode.map')}</f:case>
<f:defaultCase>{flex.displayMode}</f:defaultCase>
</f:switch>
</td>
</tr>
</f:if>
<f:if condition="{_computed.singleRecords}">
<tr>
<th>{f:translate(key:'{_computed.lll}single_records')}</th>
<td>
<f:for each="{_computed.singleRecords}" as="row">
<f:render section="rowElement" arguments="{table:'tt_address', row:row}"/>
</f:for>
</td>
</tr>
</f:if>
<f:if condition="{_computed.pages}">
<tr>
<th>{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.startingpoint')}
</th>
<td>
<f:for each="{_computed.pages}" as="row">
<f:render section="rowElement" arguments="{table:'pages', row:row}"/>
</f:for>
<f:if condition="{flex.recursive}">
{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.recursive')}:
{f:translate(key:'LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:recursive.I.{flex.recursive}')}
</f:if>
</td>
</tr>
</f:if>
<f:if condition="{_computed.singlePid}">
<tr>
<th>{f:translate(key:'{_computed.lll}singlePid')}</th>
<td>
<f:render section="rowElement" arguments="{table:'pages', row:_computed.singlePid}"/>
</td>
</tr>
</f:if>
<f:if condition="{_computed.groups}">
<tr>
<th>{f:translate(key:'{_computed.lll}group_selection')}</th>
<td>
<f:for each="{_computed.groups}" as="row">
<f:render section="rowElement" arguments="{table:'sys_category', row:row}"/>
</f:for>
<hr style="margin:5px"/>
{f:translate(key:'{_computed.lll}combination')}:
<f:if condition="{flex.groupsCombination}">
<f:then>
{f:translate(key:'{_computed.lll}combination.or')}
</f:then>
<f:else>
{f:translate(key:'{_computed.lll}combination.and')}
</f:else>
</f:if>
<br>
<f:if condition="{flex.includeSubcategories}">
<core:icon identifier="actions-check" size="small"/>
{f:translate(key:'{_computed.lll}includeSubcategories')}
</f:if>
</td>
</tr>
</f:if>
</tbody>
</table>
<f:section name="rowElement">
<a href="#" class="t3js-contextmenutrigger" data-table="{table}" data-uid="{row.uid}" title="id={row.uid}">
<core:iconForRecord row="{row}" table="{table}"/>
</a>
{row._computed.title}<br>
</f:section>
</html>

View File

@@ -0,0 +1,39 @@
#t3js-location-map-wrap {
position: absolute;
width: 80vw;
height: 80vh;
top: 6vh;
left: 10vw;
opacity: 0;
box-shadow: 0 2px 15px #000;
transition: opacity 1500ms;
z-index: -1;
}
#t3js-location-map-wrap.active {
opacity: 1;
z-index: 999;
}
.t3js-location-map-container {
width: 100%;
height: calc(100% - 40px);
border: 1px solid #CCC;
}
.t3js-location-map-title>div.btn-group {
position: absolute;
left: 15px;
}
.t3js-location-map-title a {
font-weight: bold;
}
.t3js-location-map-title {
background: rgb(237, 237, 237);
font-family: Share, Verdana, Arial, Helvetica, sans-serif;
font-size: 20px;
padding: 5px 15px;
text-align: center;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

View File

@@ -0,0 +1,635 @@
/* required styles */
.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
position: absolute;
left: 0;
top: 0;
}
.leaflet-container {
overflow: hidden;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-user-drag: none;
}
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
.leaflet-safari .leaflet-tile {
image-rendering: -webkit-optimize-contrast;
}
/* hack that prevents hw layers "stretching" when loading new tiles */
.leaflet-safari .leaflet-tile-container {
width: 1600px;
height: 1600px;
-webkit-transform-origin: 0 0;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container .leaflet-overlay-pane svg,
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
max-width: none !important;
max-height: none !important;
}
.leaflet-container.leaflet-touch-zoom {
-ms-touch-action: pan-x pan-y;
touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
-ms-touch-action: pinch-zoom;
/* Fallback for FF which doesn't support pinch-zoom */
touch-action: none;
touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-ms-touch-action: none;
touch-action: none;
}
.leaflet-container {
-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
-moz-box-sizing: border-box;
box-sizing: border-box;
z-index: 800;
}
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
.leaflet-overlay-pane svg {
-moz-user-select: none;
}
.leaflet-pane { z-index: 400; }
.leaflet-tile-pane { z-index: 200; }
.leaflet-overlay-pane { z-index: 400; }
.leaflet-shadow-pane { z-index: 500; }
.leaflet-marker-pane { z-index: 600; }
.leaflet-tooltip-pane { z-index: 650; }
.leaflet-popup-pane { z-index: 700; }
.leaflet-map-pane canvas { z-index: 100; }
.leaflet-map-pane svg { z-index: 200; }
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
/* control positioning */
.leaflet-control {
position: relative;
z-index: 800;
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
/* zoom and fade animations */
.leaflet-fade-anim .leaflet-tile {
will-change: opacity;
}
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-animated {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
transform-origin: 0 0;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
-webkit-transition: none;
-moz-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* cursors */
.leaflet-interactive {
cursor: pointer;
}
.leaflet-grab {
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
cursor: crosshair;
}
.leaflet-popup-pane,
.leaflet-control {
cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
/* marker & overlays interactivity */
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
pointer-events: none;
}
.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive {
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
/* visual tweaks */
.leaflet-container {
background: #ddd;
outline: 0;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-container a.leaflet-active {
outline: 2px solid orange;
}
.leaflet-zoom-box {
border: 2px dotted #38f;
background: rgba(255,255,255,0.5);
}
/* general typography */
.leaflet-container {
font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
}
/* general toolbar styles */
.leaflet-bar {
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
border-radius: 4px;
}
.leaflet-bar a,
.leaflet-bar a:hover {
background-color: #fff;
border-bottom: 1px solid #ccc;
width: 26px;
height: 26px;
line-height: 26px;
display: block;
text-align: center;
text-decoration: none;
color: black;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-bar a:hover {
background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-bottom: none;
}
.leaflet-bar a.leaflet-disabled {
cursor: default;
background-color: #f4f4f4;
color: #bbb;
}
.leaflet-touch .leaflet-bar a {
width: 30px;
height: 30px;
line-height: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
/* zoom control */
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: bold 18px 'Lucida Console', Monaco, monospace;
text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
font-size: 22px;
}
/* layers control */
.leaflet-control-layers {
box-shadow: 0 1px 5px rgba(0,0,0,0.4);
background: #fff;
border-radius: 5px;
}
.leaflet-control-layers-toggle {
background-image: url(./layers.png);
width: 36px;
height: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(./layers-2x.png);
background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
color: #333;
background: #fff;
}
.leaflet-control-layers-scrollbar {
overflow-y: scroll;
overflow-x: hidden;
padding-right: 5px;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
/* Default icon URLs */
.leaflet-default-icon-path {
background-image: url(./marker-icon.png);
}
/* attribution and scale controls */
.leaflet-container .leaflet-control-attribution {
background: #fff;
background: rgba(255, 255, 255, 0.7);
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
}
.leaflet-control-attribution a {
text-decoration: none;
}
.leaflet-control-attribution a:hover {
text-decoration: underline;
}
.leaflet-container .leaflet-control-attribution,
.leaflet-container .leaflet-control-scale {
font-size: 11px;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
line-height: 1.1;
padding: 2px 5px 1px;
font-size: 11px;
white-space: nowrap;
overflow: hidden;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: #fff;
background: rgba(255, 255, 255, 0.5);
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
border-bottom: none;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
border: 2px solid rgba(0,0,0,0.2);
background-clip: padding-box;
}
/* popup */
.leaflet-popup {
position: absolute;
text-align: center;
margin-bottom: 20px;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
border-radius: 12px;
}
.leaflet-popup-content {
margin: 13px 19px;
line-height: 1.4;
}
.leaflet-popup-content p {
margin: 18px 0;
}
.leaflet-popup-tip-container {
width: 40px;
height: 20px;
position: absolute;
left: 50%;
margin-left: -20px;
overflow: hidden;
pointer-events: none;
}
.leaflet-popup-tip {
width: 17px;
height: 17px;
padding: 1px;
margin: -10px auto 0;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
background: white;
color: #333;
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
padding: 4px 4px 0 0;
border: none;
text-align: center;
width: 18px;
height: 14px;
font: 16px/14px Tahoma, Verdana, sans-serif;
color: #c3c3c3;
text-decoration: none;
font-weight: bold;
background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover {
color: #999;
}
.leaflet-popup-scrolled {
overflow: auto;
border-bottom: 1px solid #ddd;
border-top: 1px solid #ddd;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
width: 24px;
margin: 0 auto;
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
}
.leaflet-oldie .leaflet-popup-tip-container {
margin-top: -1px;
}
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
border: 1px solid #999;
}
/* div icon */
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
/* Tooltip */
/* Base styles for the element that has a tooltip */
.leaflet-tooltip {
position: absolute;
padding: 6px;
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
color: #222;
white-space: nowrap;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
}
.leaflet-tooltip.leaflet-clickable {
cursor: pointer;
pointer-events: auto;
}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
position: absolute;
pointer-events: none;
border: 6px solid transparent;
background: transparent;
content: "";
}
/* Directions */
.leaflet-tooltip-bottom {
margin-top: 6px;
}
.leaflet-tooltip-top {
margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
left: 50%;
margin-left: -6px;
}
.leaflet-tooltip-top:before {
bottom: 0;
margin-bottom: -12px;
border-top-color: #fff;
}
.leaflet-tooltip-bottom:before {
top: 0;
margin-top: -12px;
margin-left: -6px;
border-bottom-color: #fff;
}
.leaflet-tooltip-left {
margin-left: -6px;
}
.leaflet-tooltip-right {
margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
top: 50%;
margin-top: -6px;
}
.leaflet-tooltip-left:before {
right: 0;
margin-right: -12px;
border-left-color: #fff;
}
.leaflet-tooltip-right:before {
left: 0;
margin-left: -12px;
border-right-color: #fff;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<rect width="16" height="12" y="2" fill="#151515" color="#000" overflow="visible" rx="1.4" ry="1.4" style="isolation:auto;mix-blend-mode:normal"/>
<path fill="#fff" d="M1.7 3c-.389 0-.7.311-.7.7v8.6c0 .389.311.7.7.7h1.728a1.15 1.15 0 0 1-.028-.25 1.15 1.15 0 0 1 1.15-1.15 1.15 1.15 0 0 1 1.15 1.15 1.15 1.15 0 0 1-.028.25h4.656a1.15 1.15 0 0 1-.027-.25 1.15 1.15 0 0 1 1.148-1.15 1.15 1.15 0 0 1 1.15 1.15 1.15 1.15 0 0 1-.029.25h1.73c.389 0 .7-.311.7-.7V3.7c0-.389-.311-.7-.7-.7H1.7zm4.015 1.05A2.294 2.294 0 0 1 8 6.337c0 .612-.248 1.168-.645 1.58 1.06.585 1.788 1.7 1.788 2.99H8a2.276 2.276 0 0 0-2.285-2.285 2.277 2.277 0 0 0-2.287 2.285H2.285c0-1.29.73-2.405 1.79-2.99a2.274 2.274 0 0 1-.647-1.58A2.295 2.295 0 0 1 5.715 4.05zm0 1.143c-.638 0-1.143.505-1.143 1.143s.505 1.143 1.143 1.143 1.142-.505 1.142-1.143-.504-1.143-1.142-1.143zm4.57 1.143h3.43v1.143h-3.43V6.336zm0 2.285h3.43v1.143h-3.43V8.62z" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill="#eee" d="M0 0h16v16H0z" color="#333" overflow="visible" style="isolation:auto;mix-blend-mode:normal"/>
<path fill="#000" d="M3.05 3.5C2.47 3.5 2 3.969 2 4.55v6.9c0 .581.469 1.05 1.05 1.05h9.9c.581 0 1.05-.469 1.05-1.05v-6.9c0-.581-.469-1.05-1.05-1.05h-9.9zm.224.75h9.452c.29 0 .524.234.524.524v6.452c0 .29-.234.524-.524.524h-1.298a.862.862 0 0 0 .022-.188.862.862 0 0 0-.863-.862.862.862 0 0 0-.861.862.862.862 0 0 0 .02.188H6.254a.862.862 0 0 0 .02-.188.862.862 0 0 0-.86-.862.862.862 0 0 0-.864.862.862.862 0 0 0 .02.188H3.275a.523.523 0 0 1-.524-.524V4.774c0-.29.234-.524.524-.524zm3.012.788c-.942 0-1.715.772-1.715 1.714 0 .46.187.876.485 1.185a2.567 2.567 0 0 0-1.342 2.243h.857c0-.952.763-1.714 1.715-1.714.952 0 1.714.762 1.714 1.714h.857c0-.968-.546-1.804-1.34-2.243.297-.309.483-.726.483-1.185a1.72 1.72 0 0 0-1.714-1.714zm0 .857a.85.85 0 0 1 .857.857.85.85 0 0 1-.857.857.85.85 0 0 1-.857-.857.85.85 0 0 1 .857-.857zm3.428.857v.857h2.572v-.857H9.714zm0 1.714v.857h2.572v-.857H9.714z" color="#ccc" overflow="visible" style="isolation:auto;mix-blend-mode:normal"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg4"
version="1.1"
viewBox="0 0 16 16">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<path
id="path817"
d="m 7.9998157,0.9592584 c -2.2900552,0 -4.1467179,1.9491077 -4.1467179,4.3542424 0,2.5466592 0.8574979,5.5847192 4.0146568,9.7272412 C 11.205675,10.82248 12.168579,7.86016 12.146534,5.3135008 12.125714,2.9084655 10.289872,0.9592583 7.9998157,0.9592584 Z m 0,2.4789751 A 1.9332866,1.9332866 0 0 1 9.933567,5.371985 1.9332866,1.9332866 0 0 1 7.9998157,7.3057364 1.9332866,1.9332866 0 0 1 6.0660642,5.371985 1.9332866,1.9332866 0 0 1 7.9998157,3.4382335 Z"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.09425406;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<path fill="#888" d="M0 2v12h12.69V3.81H5.08L3.95 2H0z"/>
<path fill="#151515" d="M3.058 0c3.33.004 6.661-.006 9.991.006.617.043 1.02.668.94 1.253-.003 2.263.008 4.527-.004 6.79-.043.617-.668 1.021-1.253.94-3.26-.003-6.521.008-9.781-.005-.617-.042-1.02-.668-.94-1.253.003-2.263-.008-4.526.004-6.789A1.05 1.05 0 0 1 3.058.001z"/>
<path fill="#fff" d="M3.275.75a.527.527 0 0 0-.523.47c-.006 2.1 0 4.198-.002 6.298-.046.318.105.705.47.73h1.37c-.054-.229-.035-.475.111-.672.298-.473 1.056-.5 1.387-.049a.861.861 0 0 1 .168.721l3.51.002c-.054-.23-.037-.476.109-.674.298-.473 1.058-.5 1.389-.049a.86.86 0 0 1 .185.535.74.74 0 0 1-.017.188h1.086c.318.046.705-.105.73-.47.006-2.1 0-4.198.002-6.298.046-.318-.105-.705-.47-.73C9.61.746 6.442.752 3.274.75zm3.01.787C7.227 1.537 8 2.31 8 3.252c0 .46-.187.877-.484 1.186A2.566 2.566 0 0 1 8.857 6.68H8c0-.952-.763-1.713-1.715-1.713-.952 0-1.713.76-1.713 1.713h-.857c0-.968.545-1.804 1.34-2.242a1.705 1.705 0 0 1-.483-1.186 1.72 1.72 0 0 1 1.713-1.715zm0 .858a.851.851 0 0 0-.857.857c0 .478.379.857.857.857a.851.851 0 0 0 .858-.857.851.851 0 0 0-.858-.857zm3.43.857h2.57v.857h-2.57v-.857zm0 1.715h2.57v.855h-2.57v-.855z"/>
<path fill="#aaa" d="M16 6.08L12.96 14H0l2.53-6.6h4.02l1.71-1.32z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<rect width="16" height="12" y="2" fill="#151515" color="#000" overflow="visible" rx="1.4" ry="1.4" style="isolation:auto;mix-blend-mode:normal"/>
<path fill="#fff" d="M1.7 3c-.389 0-.7.311-.7.7v8.6c0 .389.311.7.7.7h1.728a1.15 1.15 0 0 1-.028-.25 1.15 1.15 0 0 1 1.15-1.15 1.15 1.15 0 0 1 1.15 1.15 1.15 1.15 0 0 1-.028.25h4.656a1.15 1.15 0 0 1-.027-.25 1.15 1.15 0 0 1 1.148-1.15 1.15 1.15 0 0 1 1.15 1.15 1.15 1.15 0 0 1-.029.25h1.73c.389 0 .7-.311.7-.7V3.7c0-.389-.311-.7-.7-.7H1.7zm4.015 1.05A2.294 2.294 0 0 1 8 6.337c0 .612-.248 1.168-.645 1.58 1.06.585 1.788 1.7 1.788 2.99H8a2.276 2.276 0 0 0-2.285-2.285 2.277 2.277 0 0 0-2.287 2.285H2.285c0-1.29.73-2.405 1.79-2.99a2.274 2.274 0 0 1-.647-1.58A2.295 2.295 0 0 1 5.715 4.05zm0 1.143c-.638 0-1.143.505-1.143 1.143s.505 1.143 1.143 1.143 1.142-.505 1.142-1.143-.504-1.143-1.142-1.143zm4.57 1.143h3.43v1.143h-3.43V6.336zm0 2.285h3.43v1.143h-3.43V8.62z" color="#000" overflow="visible" style="isolation:auto;mix-blend-mode:normal"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,68 @@
function ttAddressGoogleMaps() {
var obj = {};
obj.map = null;
obj.markers = [];
obj.run = function () {
const mapOptions = {
center: new google.maps.LatLng(48.3057664, 14.2873126),
zoom: 11,
maxZoom: 15,
streetViewControl: false,
fullscreenControl: false
};
obj.map = new google.maps.Map(document.getElementById('ttaddress__map'), mapOptions);
infoWindow = new google.maps.InfoWindow();
var bounds = new google.maps.LatLngBounds();
var records = document.getElementById("ttaddress__records");
for (var i = 0; i < records.childNodes.length; i++) {
var item = records.childNodes[i];
var marker = new google.maps.Marker({
map: obj.map,
position: new google.maps.LatLng(item.getAttribute('data-lat'), item.getAttribute('data-lng')),
infowindow: infoWindow,
recordId: item.getAttribute('data-id')
});
google.maps.event.addListener(marker, 'click', function (e) {
infoWindow.setContent(document.getElementById('ttaddress__record-' + this.recordId).innerHTML);
infoWindow.open(obj.map, this);
var allLabels = document.querySelectorAll('.ttaddress__label');
for (var i = 0; i < allLabels.length; i++) {
allLabels[i].classList.remove('active')
}
document.getElementById('ttaddress__label-' + this.recordId).classList.add('active');
});
bounds.extend(marker.getPosition());
obj.markers.push(marker);
}
obj.map.fitBounds(bounds);
};
obj.openMarker = function (markerId) {
google.maps.event.trigger(obj.markers[markerId], 'click');
};
return obj;
}
document.addEventListener("DOMContentLoaded", function () {
var ttAddressMapInstance = ttAddressGoogleMaps();
ttAddressMapInstance.run();
document.addEventListener('click', function (event) {
if (!event.target.matches('.ttaddress__markerlink')) {
return;
}
event.preventDefault();
var element = event.target;
ttAddressMapInstance.openMarker(element.getAttribute('data-iteration-id'));
}, false);
});

View File

@@ -0,0 +1,68 @@
function ttAddressLeaflet() {
var obj = {};
obj.map = null;
obj.markers = [];
obj.run = function () {
obj.map = L.map('ttaddress__map').setView([51.505, -0.09], 13);
obj.map.scrollWheelZoom.disable();
var mapBounds = L.latLngBounds();
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 18,
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
'Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
id: 'mapbox.streets'
}).addTo(obj.map);
var records = document.getElementById("ttaddress__records").children;
for (var i = 0; i < records.length; i++) {
var item = records[i];
var marker = L.marker([item.getAttribute('data-lat'), item.getAttribute('data-lng')]).addTo(obj.map)
.bindPopup(document.getElementById('ttaddress__record-' + item.getAttribute('data-id')).innerHTML);
obj.markers.push(marker);
}
var group = new L.featureGroup(obj.markers);
obj.map.fitBounds(group.getBounds());
// Zoom out if zoom level is too high
// var zoomLevel = obj.map.getZoom();
// if (zoomLevel >= 10) {
// obj.map.setZoom(8);
// }
};
obj.openMarker = function (markerId) {
obj.markers[markerId].openPopup();
};
return obj;
}
function ttAddressOnload() {
var ttAddressMapInstance = ttAddressLeaflet();
ttAddressMapInstance.run();
document.addEventListener('click', function (event) {
if (!event.target.matches('.ttaddress__markerlink')) {
return;
}
event.preventDefault();
var element = event.target;
ttAddressMapInstance.openMarker(parseInt(element.getAttribute('data-iteration-id')));
}, false);
}
/** event listener on DOMContentLoaded does not work with scripts which are loaded async.
* With TYPO3 this could e.g. happen with EXT:scriptmerger
* Thus we listen only if document.readyState is loading, otherwise we can already fire as DOM is loaded already.
**/
if (document.readyState === 'loading') {
document.addEventListener("DOMContentLoaded", function () {
ttAddressOnload();
});
} else {
ttAddressOnload();
}

View File

@@ -0,0 +1,195 @@
define(['jquery', 'TYPO3/CMS/Backend/Icons', 'TYPO3/CMS/Backend/FormEngine', 'TYPO3/CMS/TtAddress/leaflet-core-1.4.0'], function ($, Icons, FormEngine) {
'use strict';
let LeafBE = {
$element: null,
$gLatitude: null,
$gLongitude: null,
$latitude: null,
$longitude: null,
$fieldLat: null,
$fieldLon: null,
$fieldLatActive: null,
$geoCodeUrl: null,
$geoCodeUrlShort: null,
$tilesUrl: null,
$tilesCopy: null,
$zoomLevel: 13,
$marker: null,
$map: null,
$iconClose: null
};
// Load icon via TYPO3 Icon-API and requireJS
Icons.getIcon('actions-close', Icons.sizes.small, null, null).then(function(markup) {
LeafBE['$iconClose']= markup;
});
LeafBE.init = function (element) {
// basic variable initialisation, uses data vars on the trigger button
LeafBE.$element = element;
LeafBE.$labelTitle = LeafBE.$element.attr('data-label-title');
LeafBE.$labelClose = LeafBE.$element.attr('data-label-close');
LeafBE.$labelImport = LeafBE.$element.attr('data-label-import');
LeafBE.$latitude = LeafBE.$element.attr('data-lat');
LeafBE.$longitude = LeafBE.$element.attr('data-lon');
LeafBE.$gLatitude = LeafBE.$element.attr('data-glat');
LeafBE.$gLongitude = LeafBE.$element.attr('data-glon');
LeafBE.$tilesUrl = LeafBE.$element.attr('data-tiles');
LeafBE.$tilesCopy = LeafBE.$element.attr('data-copy');
LeafBE.$geoCodeUrl = LeafBE.$element.attr('data-geocodeurl');
LeafBE.$geoCodeUrlShort = LeafBE.$element.attr('data-geocodeurlshort');
LeafBE.$fieldLat = LeafBE.$element.attr('data-namelat');
LeafBE.$fieldLon = LeafBE.$element.attr('data-namelon');
LeafBE.$fieldLatActive = LeafBE.$element.attr('data-namelat-active');
// add the container to display the map as a nice overlay
if (!$('#t3js-location-map-wrap').length) {
LeafBE.addMapMarkup();
}
};
LeafBE.addMapMarkup = function () {
$('body').append(
'<div id="t3js-location-map-wrap">' +
'<div class="t3js-location-map-title">' +
'<div class="btn-group"><a href="#" class="btn btn-icon btn-default" title="' + LeafBE.$labelClose + '" id="t3js-ttaddress-close-map">' +
LeafBE.$iconClose +
'</a>' +
'<a class="btn btn-default" href="#" title="Import marker position to form" id="t3js-ttaddress-import-position">' +
LeafBE.$labelImport +
'</a></div>' +
LeafBE.$labelTitle +
'</div>' +
'<div class="t3js-location-map-container" id="t3js-location-map-container">' +
'</div>' +
'</div>'
);
};
LeafBE.createMap = function () {
if (((!LeafBE.$latitude || !LeafBE.$longitude) || (LeafBE.$latitude == 0 && LeafBE.$longitude == 0)) && LeafBE.$geoCodeUrl != null) {
LeafBE.geocode();
}
// The ultimate fallback: if one of the coordinates is empty, fallback to Kopenhagen.
// Thank you Kaspar for TYPO3 and its great community! ;)
if (LeafBE.$latitude == null || LeafBE.$longitude == null) {
LeafBE.$latitude = LeafBE.$gLatitude;
LeafBE.$longitude = LeafBE.$gLongitude;
// set zoomlevel lower for faster navigation
LeafBE.$zoomLevel = 4;
}
LeafBE.$map = L.map('t3js-location-map-container', {
center: [LeafBE.$latitude, LeafBE.$longitude],
zoom: LeafBE.$zoomLevel
});
L.tileLayer(LeafBE.$tilesUrl, {
attribution: LeafBE.$tilesCopy
}).addTo(LeafBE.$map);
LeafBE.$marker = L.marker([LeafBE.$latitude, LeafBE.$longitude], {
draggable: true
}).addTo(LeafBE.$map);
let position = LeafBE.$marker.getLatLng();
LeafBE.$marker.on('dragend', function (event) {
LeafBE.$marker = event.target;
position = LeafBE.$marker.getLatLng();
});
LeafBE.$map.on('click', function (event) {
LeafBE.$marker.setLatLng(event.latlng);
});
// import coordinates and close overlay
$('#t3js-ttaddress-import-position').on('click', function () {
// set visual coordinates
$('input[data-formengine-input-name="' + LeafBE.$fieldLat + '"]').val(LeafBE.$marker.getLatLng().lat);
$('input[data-formengine-input-name="' + LeafBE.$fieldLon + '"]').val(LeafBE.$marker.getLatLng().lng);
// set hidden fields values
$('input[name="' + LeafBE.$fieldLat + '"]').val(LeafBE.$marker.getLatLng().lat);
$('input[name="' + LeafBE.$fieldLon + '"]').val(LeafBE.$marker.getLatLng().lng);
// enable also latitude, if not already done by user.
$('input[id="' + LeafBE.$fieldLatActive + '"]').parentsUntil('.form-group').removeClass('disabled');
$('input[id="' + LeafBE.$fieldLatActive + '"]').prop('checked', true);
// mark fields as changed for re-evaluation and revalidate the form,
// this is e.g. needed when this wizard is used on inline elements
FormEngine.Validation.markFieldAsChanged($('input[name="' + LeafBE.$fieldLat + '"]'));
FormEngine.Validation.markFieldAsChanged($('input[name="' + LeafBE.$fieldLon + '"]'));
FormEngine.Validation.validate();
// close map after import of coordinates.
$('#t3js-location-map-wrap').removeClass('active');
});
// close overlay without any further action
$('#t3js-ttaddress-close-map').on('click', function () {
$('#t3js-location-map-wrap').removeClass('active');
});
};
LeafBE.geocode = function () {
$.ajax({
type: 'GET',
url: LeafBE.$geoCodeUrl,
async: false,
dataType: 'json',
success: function (data) {
if (data.length == 0) {
$.ajax({
type: 'GET',
url: LeafBE.$geoCodeUrlShort,
async: false,
dataType: 'json',
success: function (data) {
if (data.length != 0) {
$.each(data[0], function (key, value) {
if (key == "lat") {
LeafBE.$latitude = value;
}
if (key == "lon") {
LeafBE.$longitude = value;
}
});
}
}
});
} else {
$.each(data[0], function (key, value) {
if (key == "lat") {
LeafBE.$latitude = value;
}
if (key == "lon") {
LeafBE.$longitude = value;
}
});
}
}
});
};
LeafBE.initializeEvents = function (element) {
$(element).on('click', function () {
if (LeafBE.$map !== null) {
LeafBE.$map.remove();
LeafBE.$map = null;
}
LeafBE.init($(this));
LeafBE.createMap();
$('#t3js-location-map-wrap').addClass('active');
});
};
// reinit when form has changes, e.g. inline relations loaded using ajax
LeafBE.reinitialize = FormEngine.reinitialize;
FormEngine.reinitialize = function () {
LeafBE.reinitialize();
if ($('.locationMapWizard').length) {
LeafBE.initializeEvents('.locationMapWizard');
}
};
//LeafBE.addMapMarkup();
LeafBE.initializeEvents('.locationMapWizard');
return LeafBE;
});

View File

@@ -0,0 +1,17 @@
import FormEngineValidation from '@typo3/backend/form-engine-validation.js';
export class TelephoneEvaluation {
static registerCustomEvaluation(name) {
FormEngineValidation.registerCustomEvaluation(name, TelephoneEvaluation.applyTelephoneValidationPattern);
}
static applyTelephoneValidationPattern(value) {
const items = TYPO3.settings.TtAddress.Evaluation.telephoneValidationPattern.split('/');
// fetch RegExp modifier and remove it
const modifier = items.pop();
// remove first item
items.shift();
const expression = new RegExp(items.join('/'), modifier);
return value.replace(expression, '');
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,59 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Address Example Template</title>
</head>
<body>
<!--
Markers you can use:
###UID###
###GENDER###
###FIRSTNAME###
###MIDDLENAME###
###LASTNAME###
###TITLE###
###EMAIL###
###PHONE###
###MOBILE###
###WWW###
###ADDRESS###
###BUILDING###
###ROOM###
###BIRTHDAY###
###ORGANIZATION###
###COMPANY### (only here for backwards compatibility, this is an alias for ORGANIZATION)
###CITY###
###ZIP###
###REGION###
###COUNTRY###
###IMAGE### (###IMAGE1-5### are available, too if multiple images are added to the address record)
###FAX###
###DESCRIPTION###
###MAINGROUP###
###GROUPLIST###
-->
<!-- ###TEMPLATE_ADDRESS### beginn -->
<div class="vcard" itemscope itemtype="http://schema.org/Person">
###IMAGE###
<!-- ###SUBPART_URL### begin -->
###FIRSTNAME### ###MIDDLENAME### ###LASTNAME###
<!-- ###SUBPART_URL### end -->
###ORGANIZATION###
###EMAIL###
<!-- ###SUBPART_ADR### begin -->
<div class="adr" itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
###ADDRESS###
###CITY### ###REGION### ###ZIP### ###COUNTRY###
</div>
<!-- ###SUBPART_ADR### end -->
###PHONE###
</div>
<!-- ###TEMPLATE_ADDRESS### end -->
</body>
</html>

View File

@@ -0,0 +1,8 @@
#ttaddress__records {
display: none;
}
#ttaddress__map {
width: 100%;
min-height: 300px;
}