PDF rausgenommen

This commit is contained in:
aschwarz
2023-01-23 11:03:31 +01:00
parent 82d562a322
commit a6523903eb
28078 changed files with 4247552 additions and 2 deletions

View File

@ -0,0 +1,26 @@
<p>{{ 'ScheduledReports_EmailHello'|translate }}</p>
<p>{{ 'CoreUpdater_ThereIsNewPluginVersionAvailableForUpdate'|translate }}</p>
<ul>
{% for plugin in pluginsToBeNotified %}
<li>{{ plugin.name }} {{ plugin.latestVersion }}</li>
{% endfor %}
</ul>
{% if hasThemeUpdate %}
<p>
{{ 'CoreUpdater_NotificationClickToUpdateThemes'|translate }}<br/>
{{ host }}index.php?module=CorePluginsAdmin&action=themes
</p>
{% endif %}
{% if hasPluginUpdate %}
<p>
{{ 'CoreUpdater_NotificationClickToUpdatePlugins'|translate }}<br/>
{{ host }}index.php?module=CorePluginsAdmin&action=plugins
</p>
{% endif %}
<p>
{{ 'Installation_HappyAnalysing'|translate }}
</p>

View File

@ -0,0 +1,22 @@
<div class="getNewPlugins">
<div class="row">
{% for plugin in plugins %}
<div class="col s12">
<h3 class="pluginName" piwik-plugin-name="{{ plugin.name|e('html_attr') }}">{{ plugin.displayName }}</h3>
<span>
{{ plugin.description }}
<br />
<a href="javascript:;" piwik-plugin-name="{{ plugin.name|e('html_attr') }}">{{ 'General_MoreDetails'|translate }}</a>
</span>
{% if not loop.last %}<br /><br />{% endif %}
</div>
{% endfor %}
</div>
<div class="widgetBody">
<a href="{{ linkTo({'module': 'Marketplace', 'action': 'overview'}) }}"
>{{ 'CorePluginsAdmin_ViewAllMarketplacePlugins'|translate }}</a>
</div>
</div>

View File

@ -0,0 +1,32 @@
<div class="getNewPlugins isAdminPage">
<div class="row">
{% for plugin in plugins %}
<div class="col s12 m4">
<h3 class="pluginName"
title="{{ plugin.description|e('html_attr') }}"
piwik-plugin-name="{{ plugin.name|e('html_attr') }}">{{ plugin.displayName }}</h3>
<p class="description"
title="{{ plugin.description|e('html_attr') }}">{{ plugin.description }}</p>
{% if plugin.screenshots and plugin.screenshots.0 is defined %}
<br />
<img piwik-plugin-name="{{ plugin.name|e('html_attr') }}"
class="screenshot"
src="{{ plugin.screenshots.0 }}?w=600" width="100%" alt="">
{% endif %}
</div>
{% endfor %}
</div>
<div class="widgetBody">
<a href="{{ linkTo({'module': 'Marketplace', 'action': 'overview'}) }}"
>{{ 'CorePluginsAdmin_ViewAllMarketplacePlugins'|translate }}</a>
</div>
<script type="text/javascript">
$('.getNewPlugins .col .description').dotdotdot({
watch: 'window'
});
</script>
</div>

View File

@ -0,0 +1,23 @@
<div class="getNewPlugins getPremiumFeatures widgetBody">
<div class="row">
{% for plugin in plugins %}
<div class="col s12 m4">
<h3 class="pluginName" piwik-plugin-name="{{ plugin.name|e('html_attr') }}">{{ plugin.displayName }}</h3>
<span class="pluginBody">
{{ plugin.description }}
<br />
<a href="javascript:;" class="pluginMoreDetails" piwik-plugin-name="{{ plugin.name|e('html_attr') }}">{{ 'General_MoreDetails'|translate }}</a>
</span>
</div>
{% if loop.index % 3 == 0 %}
</div><div class="row">
{% endif %}
{% endfor %}
</div>
<div class="widgetBody">
<a href="{{ linkTo({'module': 'Marketplace', 'action': 'overview', 'show': 'premium'}) }}"
>{{ 'CorePluginsAdmin_ViewAllMarketplacePlugins'|translate }}</a>
</div>
</div>

View File

@ -0,0 +1,43 @@
{% extends 'admin.twig' %}
{% block content %}
<div style="max-width:980px;">
{% for plugin in plugins %}
<h2>{{ 'Marketplace_InstallingPlugin'|translate(plugin.name) }}</h2>
<div>
{% if plugin.isTheme %}
<p>{{ 'Marketplace_StepDownloadingThemeFromMarketplace'|translate }}</p>
<p>{{ 'Marketplace_StepUnzippingTheme'|translate }}</p>
<p>{{ 'Marketplace_StepThemeSuccessfullyInstalled'|translate(plugin.name, plugin.latestVersion) }}</p>
<p><strong><a class="btn" href="{{ linkTo({'module': 'CorePluginsAdmin', 'action': 'activate', 'pluginName': plugin.name, 'nonce': nonce, 'redirectTo': 'marketplace'}) }}">{{ 'Marketplace_ActionActivateTheme'|translate }}</a></strong>
|
<a href="{{ linkTo({'module': 'Marketplace', 'action': 'overview', 'show': 'themes'}) }}">{{ 'Marketplace_BackToMarketplace'|translate }}</a></p>
{% else %}
<p>{{ 'Marketplace_StepDownloadingPluginFromMarketplace'|translate }}</p>
<p>{{ 'Marketplace_StepUnzippingPlugin'|translate }}</p>
<p>{{ 'Marketplace_StepPluginSuccessfullyInstalled'|translate(plugin.name, plugin.latestVersion) }}</p>
<p><strong><a class="btn" href="{{ linkTo({'module': 'CorePluginsAdmin', 'action': 'activate', 'pluginName': plugin.name, 'nonce': nonce, 'redirectTo': 'marketplace'}) }}">{{ 'Marketplace_ActionActivatePlugin'|translate }}</a></strong>
|
<a href="{{ linkTo({'module': 'Marketplace', 'action': 'overview', 'show': ''}) }}">{{ 'Marketplace_BackToMarketplace'|translate }}</a></p>
{% endif %}
</div>
{% endfor %}
</div>
{% endblock %}

View File

@ -0,0 +1,75 @@
{% set defaultLicenseKeyFields %}
<div piwik-field uicontrol="text" name="license_key"
class="valign licenseKeyText"
full-width="true"
ng-model="licenseController.licenseKey"
ng-change="licenseController.updatedLicenseKey()"
placeholder="{% if isValidConsumer %}{{ 'Marketplace_LicenseKeyIsValidShort'|translate }}{% else %}{{ 'Marketplace_LicenseKey'|translate|e('html_attr') }}{% endif %}">
</div>
<div piwik-save-button
class="valign"
onconfirm="licenseController.updateLicense()"
data-disabled="!licenseController.enableUpdate"
value="{% if hasLicenseKey %}{{ 'CoreUpdater_UpdateTitle'|translate|e('html_attr') }}{% else %}{{ 'Marketplace_ActivateLicenseKey'|translate|e('html_attr') }}{% endif %}"
id="submit_license_key"></div>
{% endset %}
<div class="marketplace-max-width" ng-controller="PiwikMarketplaceLicenseController as licenseController">
<div class="marketplace-paid-intro">
{% if isValidConsumer %}
{% if isSuperUser %}
{{ 'Marketplace_PaidPluginsWithLicenseKeyIntro'|translate('')|raw }}
<br/>
<div class="licenseToolbar valign-wrapper">
{{ defaultLicenseKeyFields|raw }}
<div piwik-save-button
class="valign"
id="remove_license_key"
onconfirm="licenseController.removeLicense()"
value="{{ 'Marketplace_RemoveLicenseKey'|translate|e('html_attr') }}"
></div>
<a href="{{ linkTo({'action': 'subscriptionOverview'}) }}" class="btn valign">
{{ 'Marketplace_ViewSubscriptions'|translate }}
</a>
{% if isAutoUpdatePossible and isPluginsAdminEnabled and paidPluginsToInstallAtOnce|length %}
<a href="javascript:;" class="btn installAllPaidPlugins valign">
{{ 'Marketplace_InstallPurchasedPlugins'|translate }}
</a>
{% include '@Marketplace/paid-plugins-install-list.twig' %}
{% endif %}
</div>
<div piwik-activity-indicator loading="licenseController.isUpdating"></div>
{% endif %}
{% else %}
{% if isSuperUser %}
{{ 'Marketplace_PaidPluginsNoLicenseKeyIntro'|translate("<a target='_blank' rel='noreferrer noopener' href='https://matomo.org/recommends/premium-plugins/'>", "</a>")|raw }}
<br/>
<div class="licenseToolbar valign-wrapper">
{{ defaultLicenseKeyFields|raw }}
</div>
<div piwik-activity-indicator loading="licenseController.isUpdating"></div>
{% else %}
{{ 'Marketplace_PaidPluginsNoLicenseKeyIntroNoSuperUserAccess'|translate("<a target='_blank' rel='noreferrer noopener' href='https://matomo.org/recommends/premium-plugins/'>", "</a>")|raw }}
{% endif %}
{% endif %}
</div>
</div>
<div class="ui-confirm" id="confirmRemoveLicense">
<h2>{{ 'Marketplace_ConfirmRemoveLicense'|translate }}</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>

View File

@ -0,0 +1,25 @@
{% macro pluginDeveloper(owner) %}
{% if 'piwik' == owner or 'matomo-org' == owner %}<img title="Matomo" alt="Matomo" style="padding-bottom:2px;height:12px;" src="plugins/Morpheus/images/logo-dark.svg"/>{% else %}{{ owner }}{% endif %}
{% endmacro %}
{% macro featuredIcon(align='') %}
<img class="featuredIcon"
title="{{ 'Marketplace_FeaturedPlugin'|translate }}"
src="plugins/Marketplace/images/rating_important.png"
align="{{ align }}" />
{% endmacro %}
{% macro missingRequirementsPleaseUpdateNotice(plugin) %}
{% if plugin.missingRequirements and 0 < plugin.missingRequirements|length %}
{% for req in plugin.missingRequirements -%}
<div class="alert alert-danger">
{% set requirement = req.requirement|capitalize %}
{% if 'Php' == requirement %}
{% set requirement = 'PHP' %}
{% endif %}
{{ 'CorePluginsAdmin_MissingRequirementsNotice'|translate(requirement, req.actualVersion, req.requiredVersion) }}
</div>
{%- endfor %}
{% endif %}
{% endmacro %}

View File

@ -0,0 +1,85 @@
{% extends "admin.twig" %}
{% import '@CorePluginsAdmin/macros.twig' as pluginsMacro %}
{% set title %}{{ 'Marketplace_Marketplace'|translate }}{% endset %}
{% block content %}
<div class="marketplace" piwik-marketplace>
<div piwik-content-intro>
<h2 piwik-enriched-headline feature-name="{{ 'CorePluginsAdmin_Marketplace'|translate }}"
>{{ title|e('html_attr') }}</h2>
<p>
{% if not isSuperUser %}
{% if showThemes %}
{{ 'Marketplace_NotAllowedToBrowseMarketplaceThemes'|translate }}
{% else %}
{{ 'Marketplace_NotAllowedToBrowseMarketplacePlugins'|translate }}
{% endif %}
{% elseif showThemes %}
{{ 'CorePluginsAdmin_ThemesDescription'|translate }}
{{ 'Marketplace_InstallingNewPluginViaMarketplaceOrUpload'|translate(('CorePluginsAdmin_Themes'|translate), '<a href="#" class="uploadPlugin">', ('CorePluginsAdmin_Theme'|translate), '</a>')|raw }}
{% else %}
{{ 'CorePluginsAdmin_PluginsExtendPiwik'|translate }}
{{ 'Marketplace_InstallingNewPluginViaMarketplaceOrUpload'|translate(('General_Plugins'|translate), '<a href="#" class="uploadPlugin">', ('General_Plugin'|translate), '</a>')|raw }}
{% endif %}
</p>
{% include '@Marketplace/licenseform.twig' %}
{% include '@Marketplace/uploadPluginDialog.twig' %}
<div class="row marketplaceActions" ng-controller="PiwikMarketplaceController as marketplace">
<div piwik-field uicontrol="select" name="plugin_type"
class="col s12 m6 l4"
ng-model="marketplace.pluginType"
ng-change="marketplace.changePluginType()"
title="{{ 'Show'|translate|e('html_attr') }}"
value="{{ pluginType }}"
full-width="true"
options="{{ pluginTypeOptions|json_encode }}">
</div>
<div piwik-field uicontrol="select" name="plugin_sort"
title="{{ 'Sort'|translate|e('html_attr') }}"
value="{{ sort }}"
ng-model="marketplace.pluginSort"
ng-change="marketplace.changePluginSort()"
class="col s12 m6 l4"
full-width="true"
options="{{ pluginSortOptions|json_encode }}">
</div>
{# Hide filters and search for themes because we don't have many of them #}
{% if (pluginsToShow|length) > 20 or query %}
<div class="col s12 m12 l4 ">
<form action="{{ linkTo({'sort': ''}) }}" method="post" class="plugin-search">
<div piwik-field uicontrol="text" name="query"
title="{{ 'General_Search'|translate }} {{ numAvailablePlugins }} {{ 'General_Plugins'|translate|lcfirst }}..."
value="{{ query }}"
full-width="true">
</div>
<span class="icon-search" onclick="$('form.plugin-search').submit();"></span>
</form>
</div>
{% endif %}
</div>
</div>
{% include '@Marketplace/plugin-list.twig' %}
<div class="footer-message center">
{{ 'Marketplace_DevelopersLearnHowToDevelopPlugins'|translate('<a target="_blank" rel="noreferrer noopener" href="https://developer.matomo.org/develop">', '</a>')|raw }}
<br />
<br />
<br />
<a rel="noreferrer noopener" href="https://shop.matomo.org/faq/" target="_blank">FAQ</a> |
<a rel="noreferrer noopener" href="https://shop.matomo.org/terms-conditions/" target="_blank">Terms</a> |
<a rel="noreferrer noopener" href="https://matomo.org/privacy-policy/" target="_blank">Privacy</a> |
<a rel="noreferrer noopener" href="https://matomo.org/contact/" target="_blank">Contact</a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,18 @@
<div class="ui-confirm" id="installAllPaidPluginsAtOnce">
<h2>{{ 'Marketplace_InstallAllPurchasedPlugins'|translate }}</h2>
<p>
{{ 'Marketplace_InstallThesePlugins'|translate }}
<br /><br />
</p>
<ul>
{% for pluginName in paidPluginsToInstallAtOnce %}
<li>{{ pluginName }}</li>
{% endfor %}
</ul>
<p>
<input role="install" type="button" data-href="{{ linkTo({'action': 'installAllPaidPlugins', 'nonce': installNonce}) }}"
value="{{ 'Marketplace_InstallAllPurchasedPluginsAction'|translate(paidPluginsToInstallAtOnce|length) }}">
<input role="cancel" type="button" value="{{ 'General_Cancel'|translate }}"/>
</p>
</div>

View File

@ -0,0 +1,331 @@
{% import '@Marketplace/macros.twig' as marketplaceMacro %}
{% block content %}
<div class="pluginDetails">
{% if errorMessage %}
{{ errorMessage }}
{% elseif plugin %}
{% set isBundle = plugin.isBundle is defined and plugin.isBundle %}
{% if plugin.versions is not empty and plugin.versions[plugin.versions|length - 1] %}
{% set latestVersion = plugin.versions[plugin.versions|length - 1] %}
{% else %}
{% set latestVersion = '' %}
{% endif %}
<div class="row">
<div class="col s12 m9">
<h2>{{ plugin.displayName }}</h2>
<p class="description">
{% if plugin.featured %}
{{ marketplaceMacro.featuredIcon('left') }}
{% endif %}
{{ plugin.description }}
</p>
<div class="contentDetails">
<div id="pluginDetailsTabs" class="row">
<div class="col s12">
<ul class="tabs">
<li class="tab col s3"><a href="#tabs-description">{{ 'General_Description'|translate }}</a></li>
{% if latestVersion.readmeHtml.faq %}
<li class="tab col s3"><a href="#tabs-faq">{{ 'General_Faq'|translate }}</a></li>
{% endif %}
{% if latestVersion.readmeHtml.documentation %}
<li class="tab col s3"><a href="#tabs-documentation">{{ 'General_Documentation'|translate }}</a></li>
{% endif %}
{% if plugin.screenshots|length %}
<li class="tab col s3"><a href="#tabs-screenshots">{{ 'Marketplace_Screenshots'|translate }}</a></li>
{% endif %}
{% if plugin.shop is defined and plugin.shop and plugin.shop.reviews and plugin.shop.reviews.embedUrl is defined and plugin.shop.reviews.embedUrl %}
<li class="tab col s3"><a href="#tabs-reviews">{{ 'Marketplace_Reviews'|translate }}</a></li>
{% endif %}
</ul>
</div>
<div id="tabs-description" class="tab-content col s12">
{% if isSuperUser and (plugin.isDownloadable or plugin.isInstalled) %}
{{ marketplaceMacro.missingRequirementsPleaseUpdateNotice(plugin) }}
{% if isMultiServerEnvironment %}
<div class="alert alert-warning">{{ 'Marketplace_MultiServerEnvironmentWarning'|translate }}</div>
{% elseif not isAutoUpdateEnabled %}
<div class="alert alert-warning">{{ 'Marketplace_AutoUpdateDisabledWarning'|translate("'[General]enable_auto_update=1'", "'config/config.ini.php'") }}</div>
{% endif %}
{% endif %}
{% if hasSomeAdminAccess and plugin.isMissingLicense is defined and plugin.isMissingLicense %}
<div class="alert alert-danger">{{ 'Marketplace_PluginLicenseMissingDescription'|translate }}</div>
{% elseif hasSomeAdminAccess and plugin.hasExceededLicense is defined and plugin.hasExceededLicense %}
<div class="alert alert-warning">{{ 'Marketplace_PluginLicenseExceededDescription'|translate }}</div>
{% endif %}
{{ latestVersion.readmeHtml.description|raw }}
</div>
{% if latestVersion.readmeHtml.faq %}
<div id="tabs-faq" class="tab-content col s12">
{{ latestVersion.readmeHtml.faq|raw }}
</div>
{% endif %}
{% if latestVersion.readmeHtml.documentation %}
<div id="tabs-documentation" class="tab-content col s12">
{{ latestVersion.readmeHtml.documentation|raw }}
</div>
{% endif %}
{% if plugin.screenshots|length %}
<div id="tabs-screenshots" class="tab-content col s12">
<div class="thumbnails">
{% for screenshot in plugin.screenshots %}
<div class="thumbnail">
<a href="{{ screenshot }}" target="_blank"><img src="{{ screenshot }}?w=400" width="400" alt=""></a>
<p>
{{ screenshot|split('/')|last|replace({'_': ' ', '.png': '', '.jpg': '', '.jpeg': ''}) }}
</p>
</div>
{% endfor %}
</div>
</div>
{% endif %}
{% if plugin.shop is defined and plugin.shop and plugin.shop.reviews and plugin.shop.reviews.embedUrl is defined and plugin.shop.reviews.embedUrl %}
<div id="tabs-reviews" class="tab-content col s12">
<iframe class="reviewIframe"
style="{% if plugin.shop.reviews.height %}height:{{ plugin.shop.reviews.height }}px;{% endif %}"
id="{{ plugin.shop.reviews.embedUrl|md5 }}"
src="{{ plugin.shop.reviews.embedUrl|raw }}"></iframe>
</div>
{% endif %}
</div>
</div>
</div>
<div class="col s12 m3">
<div class="metadata">
<div class="actionButton">
{% if not plugin.isDownloadable or not isSuperUser %}
{% if hasSomeAdminAccess and plugin.hasExceededLicense is defined and plugin.hasExceededLicense and plugin.consumer %}
{% if plugin.consumer.loginUrl is defined and plugin.consumer.loginUrl %}
<a class="install update"
target="_blank"
rel="noreferrer noopener"
href="{{ plugin.consumer.loginUrl|default('')|e('html_attr') }}"
>{{ 'Marketplace_UpgradeSubscription'|translate }}</a>
{% endif %}
{% elseif not plugin.isDownloadable and plugin.isPaid and plugin.shop is defined and plugin.shop %}
{% if plugin.shop.variations|length %}
<div class="input-field variationPicker">
<select title="{{ 'Marketplace_ShownPriceIsExclTax'|translate|e('html_attr') }} {{ 'Marketplace_CurrentNumPiwikUsers'|translate(numUsers)|e('html_attr') }}">
{% for variation in plugin.shop.variations %}
<option value="{{ variation.addToCartUrl }}"
title="{{ 'Marketplace_PriceExclTax'|translate(variation.price, variation.currency)|e('html_attr') }} {{ 'Marketplace_CurrentNumPiwikUsers'|translate(numUsers)|e('html_attr') }}"
{% if variation.recommended is defined and variation.recommended %}selected{% endif %}
>{{ variation.name }} - {{ variation.prettyPrice }} / {{ variation.period }}</option>
{% endfor %}
</select>
</div>
<a class="install update addToCartLink" target="_blank"
title="{{ 'Marketplace_ClickToCompletePurchase'|translate|e('html_attr') }}"
rel="noreferrer noopener"
href="{{ plugin.shop.url|default('')|e('html_attr') }}"
>{{ 'Marketplace_AddToCart'|translate }}</a>
{% else %}
<a class="install update" target="_blank"
rel="noreferrer noopener"
href="{% if plugin.shop is defined and plugin.shop and plugin.shop.url %}{{ plugin.shop.url|e('html_attr') }}{% else %}{{ plugin.homepage|e('html_attr') }}{% endif %}"
>{{ 'General_MoreDetails'|translate }}</a>
{% endif %}
{% endif %}
{% elseif isSuperUser %}
{% if not isAutoUpdatePossible %}
<a onclick="$(this).css('display', 'none')" href="{{ linkTo({'action': 'download', 'pluginName': plugin.name, 'nonce': (plugin.name|nonce)}) }}"
class="download">{{ 'General_Download'|translate }}</a>
{% elseif plugin.canBeUpdated and 0 == plugin.missingRequirements|length %}
<a class="install update"
href="{{ linkTo({'module': 'Marketplace', 'action':'updatePlugin', 'pluginName': plugin.name, 'nonce': updateNonce}) }}"
>{{ 'CoreUpdater_UpdateTitle'|translate }}</a>
{% elseif plugin.isInstalled %}
<br />
<br />
<br />
<br />
{% elseif 0 < plugin.missingRequirements|length %}
<br />
<br />
<br />
<br />
{% else %}
<a href="{{ linkTo({'module': 'Marketplace', 'action': 'installPlugin', 'pluginName': plugin.name, 'nonce': installNonce}) }}"
class="install">{{ 'Marketplace_ActionInstall'|translate }}</a>
{% endif %}
{% else %}
<br />
<br />
<br />
<br />
{% endif %}
</div>
{% if plugin.specialOffer is defined and plugin.specialOffer %}<p style="color: green;"><br />{{ plugin.specialOffer }}</p>{% endif %}
<p><br /></p>
<dl>
{% if not isBundle %}
<dt>{{ 'CorePluginsAdmin_Version'|translate }}</dt>
<dd>{{ plugin.latestVersion }}</dd>
{% endif %}
<dt>{{ 'Marketplace_PluginKeywords'|translate }}</dt>
<dd>{{ plugin.keywords|join(', ') }}</dd>
{% if plugin.lastUpdated and not isBundle %}
<dt>{{ 'Marketplace_LastUpdated'|translate }}</dt>
<dd>{{ plugin.lastUpdated }}</dd>
{% endif %}
{% if plugin.numDownloads %}
<dt>{{ 'General_Downloads'|translate }}</dt>
<dd title="{{ 'Marketplace_NumDownloadsLatestVersion'|translate(latestVersion.numDownloads|number_format) }}">{{ plugin.numDownloads }}</dd>
{% endif %}
{% if not isBundle %}
<dt>{{ 'Marketplace_Developer'|translate }}</dt>
<dd>{{ marketplaceMacro.pluginDeveloper(plugin.owner) }}</dd>
{% if latestVersion and latestVersion.license is defined and latestVersion.license and latestVersion.license.name is defined and latestVersion.license.name %}
<dt>{{ 'Marketplace_License'|translate }}</dt>
<dd>
{% if latestVersion.license.url is defined and latestVersion.license.url %}
<a rel="noreferrer noopener"
href="{{ latestVersion.license.url }}"
target="_blank">{{ latestVersion.license.name }}</a>
{% else %}
{{ latestVersion.license.name }}
{% endif %}
</dd>
{% endif %}
<dt>{{ 'Marketplace_Authors'|translate }}</dt>
<dd>{% for author in plugin.authors if author.name %}
{% spaceless %}
{% if author.homepage %}
<a target="_blank" rel="noreferrer noopener" href="{{ author.homepage }}">{{ author.name }}</a>
{% elseif author.email %}
<a href="mailto:{{ author.email|escape('url') }}">{{ author.name }}</a>
{% else %}
{{ author.name }}
{% endif %}
{% if loop.index < plugin.authors|length %}
,
{% endif %}
{% endspaceless %}
{% endfor %}
</dd>
{% endif %}
<dt>{{ 'CorePluginsAdmin_Websites'|translate }}</dt>
<dd>
{% if plugin.homepage %}
<a target="_blank" rel="noreferrer noopener" href="{{ plugin.homepage }}">{{ 'Marketplace_PluginWebsite'|translate }}</a>
{%- endif -%}
{%- if plugin.changelog is defined and plugin.changelog and plugin.changelog.url is defined and plugin.changelog.url -%}
{%- if plugin.homepage %}, {% endif %}
<a target="_blank" rel="noreferrer noopener" href="{{ plugin.changelog.url }}">{{ 'CorePluginsAdmin_Changelog'|translate }}</a>
{%- endif -%}
{%- if plugin.repositoryUrl %}, <a target="_blank" href="{{ plugin.repositoryUrl }}">GitHub</a>{% endif %}
</dd>
{% if plugin.activity and plugin.activity.numCommits %}
<dt>{{ 'CorePluginsAdmin_Activity'|translate }}</dt>
<dd>
{{ plugin.activity.numCommits }} commits
{% if plugin.activity.numContributors > 1 %}
{{ 'Marketplace_ByXDevelopers'|translate(plugin.activity.numContributors) }}
{% endif %}
{% if plugin.activity.lastCommitDate %}
{{ 'Marketplace_LastCommitTime'|translate(plugin.activity.lastCommitDate) }}
{% endif %}</dd>
{% endif %}
</dl>
{% if plugin.support is not empty %}
{% for entry in plugin.support %}
{% if entry.name and entry.value %}
<dt>{{ entry.name }}</dt>
<dd>{{ entry.value }}</dd>
{% endif %}
{% endfor %}
{% endif %}
<br />
</div>
</div>
</div>
<script type="text/javascript">
$(function() {
var active = 0;
{% if activeTab %}
var $activeTab = $('#tabs-{{ activeTab|e('js') }}');
if ($activeTab) {
active = $activeTab.index() - 1;
}
{% endif %}
$('#pluginDetailsTabs .tabs').tabs();
$('#pluginDetailsTabs .tabs').tabs('select_tab', active >= 0 ? active : 0);
$('.pluginDetails a').each(function (index, a) {
var link = $(a).attr('href');
if (link && 0 === link.indexOf('http')) {
$(a).attr('target', '_blank');
}
});
});
</script>
{% if plugin.shop is defined and plugin.shop and plugin.shop.reviews and plugin.shop.reviews.embedUrl is defined and plugin.shop.reviews.embedUrl %}
<script type="text/javascript">
$(function() {
var $iFrames = $('.pluginDetails iframe.reviewIframe');
for (var i = 0; i < $iFrames.length; i++) {
iFrameResize({checkOrigin: ['{{ plugin.shop.reviews.embedUrl|domainOnly }}']}, $iFrames[i]);
}
});
</script>
{% endif %}
<script type="text/javascript">
$(function() {
var $variationPicker = $('.pluginDetails .variationPicker select');
if ($variationPicker.val()) {
$('.addToCartLink').attr('href', $variationPicker.val());
}
$variationPicker.on('change', function () {
$('.addToCartLink').attr('href', $variationPicker.val())
});
if ($variationPicker.length) {
$variationPicker.material_select();
}
});
</script>
{% endif %}
</div>
{% endblock %}

View File

@ -0,0 +1,166 @@
{% import '@Marketplace/macros.twig' as marketplaceMacro %}
{% if pluginsToShow|length > 0 %}
<div class="pluginListContainer row">
{% for plugin in pluginsToShow %}
<div class="col s12 m6 l4">
{% embed 'contentBlock.twig' with {'title': ''} %}
{% block content %}
<div class="plugin">
<h3 class="card-title" title="{{ 'General_MoreDetails'|translate }}">
<a href="#" piwik-plugin-name="{{ plugin.name }}">{{ plugin.displayName }}</a>
</h3>
<p class="description">
{{ plugin.description }}
<a class="more" href="#" piwik-plugin-name="{{ plugin.name }}" title="{{ 'General_MoreDetails'|translate }}">
&rsaquo; {{ 'General_MoreLowerCase'|translate }}</a>
</p>
{% if showThemes %}
{# Screenshot for themes #}
<a class="more" href="#" piwik-plugin-name="{{ plugin.name }}">
<img title="{{ 'General_MoreDetails'|translate }}"
class="preview" src="{{ plugin.screenshots|first }}?w=250&h=150"/></a>
{% endif %}
<ul class="metadata">
{% if plugin.isBundle is not defined or not plugin.isBundle %}
<li>
{% if plugin.latestVersion %}
{{ 'CorePluginsAdmin_Version'|translate }}: {{ plugin.latestVersion }}
{% endif %}
{% if plugin.canBeUpdated %}
<a class="update-available"
{% if plugin.changelog is defined and plugin.changelog and plugin.changelog.url is defined and plugin.changelog.url %}
target="_blank" href="{{ plugin.changelog.url|e('html_attr') }}"
{% else %}
href="#" piwik-plugin-name="{{ plugin.name }}"
{% endif %}
title="{{ 'Marketplace_PluginUpdateAvailable'|translate(plugin.currentVersion, plugin.latestVersion) }}">
{{ 'Marketplace_NewVersion'|translate }}</a>
{% endif %}
</li>
{% if plugin.lastUpdated %}
<li>{{ 'Marketplace_Updated'|translate }}: {{ plugin.lastUpdated }}</li>
{% endif %}
{% if plugin.numDownloads %}
<li>{{ 'General_Downloads'|translate }}: {{ plugin.numDownloads }}</li>
{% endif %}
<li>{{ 'Marketplace_Developer'|translate }}: {{ marketplaceMacro.pluginDeveloper(plugin.owner) }}</li>
{% endif %}
</ul>
{% macro moreDetailsLink(plugin) %}
{% set canBePurchased = not plugin.isDownloadable and plugin.shop is defined and plugin.shop and plugin.shop.url %}
<a class="btn btn-block plugin-details {% if canBePurchased %}purchaseable{% endif %}" href="#" piwik-plugin-name="{{ plugin.name }}" title="{{ 'General_MoreDetails'|translate }}">
{% if canBePurchased and plugin.shop.variations %}
{% set foundCheapest = 0 %}
{% for variation in plugin.shop.variations %}
{% if not foundCheapest and variation.cheapest is defined and variation.cheapest %}
{% set foundCheapest = 1 %}
{{ 'Marketplace_PriceFromPerPeriod'|translate(variation.prettyPrice, variation.period) }}
{% endif %}
{% endfor %}
{% if not foundCheapest %}
{{ 'Marketplace_PriceFromPerPeriod'|translate(plugin.shop.variations.0.prettyPrice, plugin.shop.variations.0.period) }}
{% endif %}
{% else %}
{{ 'General_MoreDetails'|translate }}
{% endif %}
</a>
{% endmacro %}
{% if isSuperUser %}
<div class="footer">
{% if plugin.isMissingLicense is defined and plugin.isMissingLicense %}
<div class="alert alert-danger" >
{{ 'Marketplace_LicenseMissing'|translate }}
<span style="white-space:nowrap">(<a class="plugin-details" href="#" piwik-plugin-name="{{ plugin.name }}" title="{{ 'General_MoreDetails'|translate }}">{{ 'General_Help'|translate }}</a>)</span>
</div>
{% elseif plugin.hasExceededLicense is defined and plugin.hasExceededLicense %}
<div class="alert alert-danger">
{{ 'Marketplace_LicenseExceeded'|translate }}
<span style="white-space:nowrap">(<a class="plugin-details" href="#" piwik-plugin-name="{{ plugin.name }}" title="{{ 'General_MoreDetails'|translate }}">{{ 'General_Help'|translate }}</a>)</span>
</div>
{% elseif plugin.canBeUpdated and 0 == plugin.missingRequirements|length and isAutoUpdatePossible %}
<a class="btn btn-block"
href="{{ linkTo({'module': 'Marketplace', 'action':'updatePlugin', 'pluginName': plugin.name, 'nonce': updateNonce}) }}">
{{ 'CoreUpdater_UpdateTitle'|translate }}
</a>
{% elseif plugin.missingRequirements|length > 0 or not isAutoUpdatePossible %}
{% macro downloadButton(showOr, plugin, isAutoUpdatePossible, showBrackets = false) -%}
{%- if plugin.missingRequirements|length == 0 and plugin.isDownloadable and not isAutoUpdatePossible -%}
{% if showBrackets %}({% endif %}<span onclick="$(this).css('display', 'none')">
{%- if showOr %} {{ 'General_Or'|translate }} {% endif -%}
<a class="plugin-details download"
href="{{ linkTo({'module': 'Marketplace', 'action': 'download', 'pluginName': plugin.name, 'nonce': (plugin.name|nonce)}) }}"
>{{ 'General_Download'|translate }}</a></span>{% if showBrackets %}){% endif %}
{%- endif -%}
{%- endmacro %}
{% if plugin.canBeUpdated and 0 == plugin.missingRequirements|length %}
{{ 'Marketplace_CannotUpdate'|translate }}
<span style="white-space:nowrap">(<a class="plugin-details" href="#" piwik-plugin-name="{{ plugin.name }}" title="{{ 'General_MoreDetails'|translate }}">{{ 'General_Help'|translate }}</a>{{ _self.downloadButton(true, plugin, isAutoUpdatePossible)|raw }})</span>
{% elseif plugin.isInstalled %}
{{ 'General_Installed'|translate }}
{{ _self.downloadButton(false, plugin, isAutoUpdatePossible, true)|raw }}
{% elseif not plugin.isDownloadable %}
{{ _self.moreDetailsLink(plugin)|raw }}
{% else %}
{{ 'Marketplace_CannotInstall'|translate }}
<span style="white-space:nowrap">(<a class="plugin-details" href="#" piwik-plugin-name="{{ plugin.name }}" title="{{ 'General_MoreDetails'|translate }}">{{ 'General_Help'|translate }}</a>{{ _self.downloadButton(true, plugin, isAutoUpdatePossible)|raw }})</span>
{% endif %}
{% elseif plugin.isInstalled %}
{{ 'General_Installed'|translate }}
{% if not plugin.isInvalid and not isMultiServerEnvironment and isPluginsAdminEnabled %}
({{ pluginsMacro.pluginActivateDeactivateAction(plugin.name, plugin.isActivated, plugin.missingRequirements, deactivateNonce, activateNonce) }})
{% endif %}
{% elseif plugin.isPaid and not plugin.isDownloadable %}
{{ _self.moreDetailsLink(plugin)|raw }}
{% else %}
<a href="{{ linkTo({'module': 'Marketplace', 'action': 'installPlugin', 'pluginName': plugin.name, 'nonce': installNonce}) }}"
class="btn">
{{ 'Marketplace_ActionInstall'|translate }}
</a>
{% endif %}
</div>
{% else %}
<div class="footer">
{{ _self.moreDetailsLink(plugin)|raw }}
</div>
{% endif %}
</div>
{% endblock %}
{% endembed %}
</div>
{% endfor %}
</div>
{% endif %}
{% if pluginsToShow|length == 0 %}
<div piwik-content-block>
{% if showThemes %}
{{ 'Marketplace_NoThemesFound'|translate }}
{% else %}
{{ 'Marketplace_NoPluginsFound'|translate }}
{% endif %}
</div>
{% endif %}

View File

@ -0,0 +1,101 @@
{% extends mode is defined and mode == 'user' ? "user.twig" : "admin.twig" %}
{% import '@Marketplace/macros.twig' as marketplaceMacro %}
{% set title %}{{ 'Marketplace_Marketplace'|translate }}{% endset %}
{% block content %}
<div piwik-content-block
content-title="{{ 'Marketplace_OverviewPluginSubscriptions'|translate|e('html_attr') }}"
class="subscriptionOverview">
{% if hasLicenseKey %}
<p>
{{ 'Marketplace_PluginSubscriptionsList'|translate }}
{% if loginUrl %}
<a target="_blank" rel="noreferrer noopener" href="{{ loginUrl }}">{{ 'Marketplace_OverviewPluginSubscriptionsAllDetails'|translate }}</a>
{% endif %}
<br/>
{{ 'Marketplace_OverviewPluginSubscriptionsMissingInfo'|translate }}
<br />
{{ 'Marketplace_NoValidSubscriptionNoUpdates'|translate }}
{{ 'Marketplace_CurrentNumPiwikUsers'|translate('<strong>' ~ numUsers ~ '</strong>')|raw }}
</p>
<br />
<table piwik-content-table>
<thead>
<tr>
<th>{{ 'General_Name'|translate }}</th>
<th>{{ 'Marketplace_SubscriptionType'|translate }}</th>
<th>{{ 'CorePluginsAdmin_Status'|translate }}</th>
<th>{{ 'Marketplace_SubscriptionStartDate'|translate }}</th>
<th>{{ 'Marketplace_SubscriptionEndDate'|translate }}</th>
<th>{{ 'Marketplace_SubscriptionNextPaymentDate'|translate }}</th>
</tr>
</thead>
<tbody>
{% if subscriptions|length %}
{% for subscription in subscriptions %}
<tr>
<td class="subscriptionName">
{% if subscription.plugin.htmlUrl %}
<a href="{{ subscription.plugin.htmlUrl }}" rel="noreferrer noopener" target="_blank">
{% endif %}
{{ subscription.plugin.displayName }}
{% if subscription.plugin.htmlUrl %}
</a>
{% endif %}
</td>
<td class="subscriptionType">{{ subscription.productType }}</td>
<td class="subscriptionStatus"
title="{% if not subscription.isValid %}{{ 'Marketplace_SubscriptionInvalid'|translate|e('html_attr') }}{% elseif subscription.isExpiredSoon %}{{ 'Marketplace_SubscriptionExpiresSoon'|translate|e('html_attr') }}{% endif %}">
{% if not subscription.isValid %}
<span class="icon-error"></span>
{% elseif subscription.isExpiredSoon %}
<span class="icon-warning"></span>
{% else %}
<span class="icon-ok"></span>
{% endif %}
{{ subscription.status }}
{% if subscription.isExceeded is defined and subscription.isExceeded %}
<span class="errorMessage" title="{{ 'Marketplace_LicenseExceededPossibleCause'|translate }}"><span class="icon-error"></span> {{ 'Marketplace_Exceeded'|translate }}</span>
{% endif %}
</td>
<td>{{ subscription.start }}</td>
<td>{% if subscription.isValid and subscription.nextPayment %}
{{ 'Marketplace_LicenseRenewsNextPaymentDate'|translate }}
{% else %}
{{ subscription.end }}
{% endif %}
</td>
<td>{{ subscription.nextPayment }}</td>
</tr>
{% endfor %}
{% else %}
<tr><td colspan="6">{{ 'Marketplace_NoSubscriptionsFound'|translate }}</td></tr>
{% endif %}
</tbody>
</table>
<div class="tableActionBar">
<a href="{{ linkTo({'module':"Marketplace", 'action':"overview"}) }}"
class="">
<span class="icon-table"></span>
{{ 'Marketplace_BrowseMarketplace'|translate }}
</a>
</div>
{% else %}
<p>{{ 'Marketplace_OverviewPluginSubscriptionsMissingLicense'|translate('<a href="'~ linkTo({'module':"Marketplace", 'action':"overview"}) ~'">', '</a>')|raw }}</p>
{% endif %}
</div>
{% endblock %}

View File

@ -0,0 +1,44 @@
{% extends 'admin.twig' %}
{% block content %}
<div style="max-width:980px;">
{% for plugin in plugins %}
<h2>{{ 'Marketplace_UpdatingPlugin'|translate(plugin.name) }}</h2>
<div>
{% if plugin.isTheme %}
<p>{{ 'Marketplace_StepDownloadingThemeFromMarketplace'|translate }}</p>
<p>{{ 'Marketplace_StepUnzippingTheme'|translate }}</p>
<p>{{ 'Marketplace_StepReplaceExistingTheme'|translate }}</p>
<p>{{ 'Marketplace_StepThemeSuccessfullyUpdated'|translate(plugin.name, plugin.latestVersion) }}</p>
{% else %}
<p>{{ 'Marketplace_StepDownloadingPluginFromMarketplace'|translate }}</p>
<p>{{ 'Marketplace_StepUnzippingPlugin'|translate }}</p>
<p>{{ 'Marketplace_StepReplaceExistingPlugin'|translate }}</p>
<p>{{ 'Marketplace_StepPluginSuccessfullyUpdated'|translate(plugin.name, plugin.latestVersion) }}</p>
{% endif %}
</div>
{% endfor %}
<div>
<p><a href="{{ linkTo({'module': 'CorePluginsAdmin', 'action': 'plugins'}) }}">{{ 'General_Plugins'|translate }}</a>
|
<a href="{{ linkTo({'module': 'CorePluginsAdmin', 'action': 'themes'}) }}">{{ 'CorePluginsAdmin_Themes'|translate }}</a>
|
<a href="{{ linkTo({'module': 'Marketplace', 'action': 'overview'}) }}">{{ 'Marketplace_Marketplace'|translate }}</a></p>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,19 @@
<div class="ui-confirm" id="installPluginByUpload" piwik-plugin-upload>
<h2>{{ 'Marketplace_TeaserExtendPiwikByUpload'|translate }}</h2>
{% if isPluginUploadEnabled %}
<p class="description"> {{ 'Marketplace_AllowedUploadFormats'|translate }} </p>
<form enctype="multipart/form-data" method="post" id="uploadPluginForm"
action="{{ linkTo({'module':'CorePluginsAdmin', 'action':'uploadPlugin', 'nonce': installNonce}) }}">
<input type="file" name="pluginZip">
<br />
<input class="startUpload btn" type="submit" value="{{ 'Marketplace_UploadZipFile'|translate }}">
</form>
{% else %}
<p class="description"> {{ 'Marketplace_PluginUploadDisabled'|translate|raw }} </p>
<pre>[General]
enable_plugin_upload = 1</pre>
<input role="yes" type="button" value="{{ 'General_Ok'|translate }}"/>
{% endif %}
</div>