Initial commit: CloudOps infrastructure platform

This commit is contained in:
root
2026-04-09 19:58:57 +02:00
commit 1166a52f26
7762 changed files with 839452 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
{% for f in form %}
{{ form_row(f) }}
{% endfor %}

View File

@@ -0,0 +1,17 @@
{% block _config_pageconfig_widget %}
<h4 class="fw-sb mt-48 mb-xs">{{ 'mautic.config.tab.pageconfig'|trans }}</h4>
<div class="text-muted small pb-md">{{ 'mautic.core.config.header.pageconfig.description'|trans }}</div>
<div class="row">
<div class="panel panel-default mb-md">
<div class="panel-body">
<div class="row">
{% for name, f in form.children %}
<div class="col-xs-12">
{{ form_row(f) }}
</div>
{% endfor %}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,80 @@
{% block _config_trackingconfig_widget %}
<h4 class="fw-sb mt-48 mb-xs">{{ 'mautic.config.tab.pagetracking'|trans }}</h4>
<div class="text-muted small pb-md">{{ 'mautic.core.config.header.pagetracking.description'|trans }}</div>
<div class="row">
<div class="panel panel-default mb-md">
<div class="panel-body">
<div class="form-group">
<p>{{ 'mautic.config.tab.pagetracking.info'|trans|purify }}</p>
{% include '@MauticCore/Components/code-snippet.html.twig' with {
variant: 'multi',
innerText: '&lt;script&gt;
(function(w,d,t,u,n,a,m){w[\'MauticTrackingObject\']=n;
w[n]=w[n]||function(){(w[n].q=w[n].q||[]).push(arguments)},a=d.createElement(t),
m=d.getElementsByTagName(t)[0];a.async=1;a.src=u;m.parentNode.insertBefore(a,m)
})(window,document,\'script\',\'' ~ url('mautic_js') ~ '\',\'mt\');
mt(\'send\', \'pageview\');
&lt;/script&gt;',
} %}
</div>
<div class="row">
<hr>
{% for name, f in form.children %}
{% if name in ['anonymize_ip', 'track_contact_by_ip', 'do_not_track_404_anonymous'] %}
<div class="col-xs-12">
{{ form_row(f) }}
{% if name == 'anonymize_ip' %}
<div class="anonymize_ip_address hide text-danger">{{ 'mautic.page.config.form.anonymize_ip.warning'|trans }}</div>
{% endif %}
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
<h4 class="fw-sb mt-48 mb-xs">{{ 'mautic.config.tab.tracking.facebook.pixel'|trans }}</h4>
<div class="text-muted small pb-md">{{ 'mautic.core.config.header.tracking.facebook.pixel.description'|trans }}</div>
<div class="row">
<div class="panel panel-default mb-md">
<div class="panel-body">
<div class="row">
<div class="col-xs-12">
{{ form_row(form.facebook_pixel_id) }}
</div>
<hr>
{% for name, f in form.children %}
{% if name in ['facebook_pixel_trackingpage_enabled', 'facebook_pixel_landingpage_enabled'] %}
<div class="col-xs-12">
{{ form_row(f) }}
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
<h4 class="fw-sb mt-48 mb-xs">{{ 'mautic.config.tab.tracking.google.analytics'|trans }}</h4>
<div class="text-muted small pb-md">{{ 'mautic.core.config.header.tracking.google.analytics.description'|trans }}</div>
<div class="row">
<div class="panel panel-default mb-md">
<div class="panel-body">
<div class="row">
<div class="col-xs-12">
{{ form_row(form.google_analytics_id) }}
</div>
<hr>
{% for name, f in form.children %}
{% if name in ['google_analytics_trackingpage_enabled', 'google_analytics_landingpage_enabled', 'google_analytics_anonymize_ip'] %}
<div class="col-xs-12">
{{ form_row(f) }}
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,3 @@
{% block _page_abtest_settings_properties_row %}
{{ form_widget(form) }}
{% endblock %}

View File

@@ -0,0 +1,3 @@
{% block _page_variantSettings_properties_row %}
{{ form_widget(form) }}
{% endblock %}

View File

@@ -0,0 +1,95 @@
{% block pointaction_urlhit_widget %}
{%- set timeFrames = {
's': 'mautic.core.time.seconds'|trans,
'i': 'mautic.core.time.minutes'|trans,
'H': 'mautic.core.time.hours'|trans,
'd': 'mautic.core.time.days'|trans,
} %}
<div class="row">
<div class="col-xs-12">
{{ form_row(form['page_url']) }}
</div>
</div>
<div class="row">
<div class="col-xs-12">
{{ form_row(form['page_hits']) }}
</div>
</div>
<div class="row">
<div class="col-xs-12 form-group ">
{{ form_label(form['returns_within']) }}
<div class="input-group">
{{ form_widget(form['returns_within']) }}
{%- set default = form.returns_within_unit.vars.data %}
<div class="input-group-btn">
<button type="button" class="btn btn-ghost dropdown-toggle" data-toggle="dropdown">
<span class="returns_within_label">{{ timeFrames[default] }}</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu time-dropdown">
{%- for abbr, label in timeFrames %}
<li><a href="#" data-time="{{ abbr }}" data-field="returns_within">{{ label }}</a></li>
{%- endfor %}
</ul>
</div>
</div>
{{ form_errors(form['returns_within']) }}
{{ form_widget(form['returns_within_unit']) }}
</div>
<div class="col-xs-12 form-group ">
{{ form_label(form['returns_after']) }}
<div class="input-group">
{{ form_widget(form['returns_after']) }}
{%- set default = form['returns_after_unit'].vars['data'] %}
<div class="input-group-btn">
<button type="button" class="btn btn-ghost dropdown-toggle" data-toggle="dropdown">
<span class="returns_after_label">{{ timeFrames[default] }}</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu time-dropdown">
{%- for abbr, label in timeFrames %}
<li><a href="#" data-time="{{ abbr }}" data-field="returns_after">{{ label }}</a></li>
{%- endfor %}
</ul>
</div>
</div>
{{ form_errors(form['returns_after']) }}
{{ form_widget(form['returns_after_unit']) }}
</div>
<div class="col-xs-12 form-group ">
{{ form_label(form['accumulative_time']) }}
<div class="input-group">
{{ form_widget(form['accumulative_time']) }}
{%- set default = form['accumulative_time_unit'].vars['data'] %}
<div class="input-group-btn">
<button type="button" class="btn btn-ghost dropdown-toggle" data-toggle="dropdown">
<span class="accumulative_time_label">{{ timeFrames[default] }}</span> <span class="caret"></span>
</button>
<ul class="dropdown-menu time-dropdown">
{%- for abbr, label in timeFrames %}
<li><a href="#" data-time="{{ abbr }}" data-field="accumulative_time">{{ label }}</a></li>
{%- endfor %}
</ul>
</div>
</div>
{{ form_errors(form['accumulative_time']) }}
{{ form_widget(form['accumulative_time_unit']) }}
</div>
</div>
<script>
mQuery('.time-dropdown li a').click(function (e) {
e.preventDefault();
var selected = mQuery(this).data('time');
var label = mQuery(this).html();
var field = mQuery(this).data('field');
mQuery('#point_properties_' + field + '_unit').val(selected);
mQuery('.' + field + '_label').html(label);
});
</script>
{% endblock %}

View File

@@ -0,0 +1,230 @@
{#
Variables
- searchValue
- items
- categories
- page
- limit
- permissions
- model
- tmpl
- security
#}
{% if items|length > 0 %}
<div class="table-responsive page-list">
<table class="table table-hover pagetable-list" id="pageTable">
<thead>
<tr>
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'checkall': 'true',
'target': '#pageTable',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'p.title',
'text': 'mautic.core.title',
'class': 'col-page-title',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'c.title',
'text': 'mautic.core.category',
'class': 'visible-md visible-lg col-page-category',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'p.template',
'text': 'mautic.core.form.theme',
'class': 'visible-md visible-lg col-page-template',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'p.hits',
'text': 'mautic.page.thead.hits',
'class': 'col-page-hits visible-md visible-lg',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'p.dateAdded',
'text': 'mautic.lead.import.label.dateAdded',
'class': 'col-page-dateAdded visible-md visible-lg',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'p.dateModified',
'text': 'mautic.lead.import.label.dateModified',
'class': 'col-page-dateModified visible-md visible-lg',
'default': true,
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'p.createdByUser',
'text': 'mautic.core.createdby',
'class': 'col-page-createdByUser visible-md visible-lg',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'submission_count',
'text': 'mautic.form.form.results',
'class': 'visible-md visible-lg col-page-submissions',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'page',
'orderBy': 'p.id',
'text': 'mautic.core.id',
'class': 'col-page-id visible-md visible-lg',
}) }}
</tr>
</thead>
<tbody>
{% for i in items %}
{% set item = i[0] %}
<tr>
<td>
{{ include('@MauticCore/Helper/list_actions.html.twig', {
'item': item,
'templateButtons': {
'edit': securityHasEntityAccess(permissions['page:pages:editown'], permissions['page:pages:editother'], item.createdBy),
'clone': permissions['page:pages:create'],
'delete': securityHasEntityAccess(permissions['page:pages:deleteown'], permissions['page:pages:deleteother'], item.createdBy),
},
'routeBase': 'page',
'nameGetter': 'getTitle',
'customButtons': {
'preview': {
'attr': {
'class': 'btn btn-ghost btn-sm btn-nospin',
'href': path('mautic_page_preview', {'id': item.id}),
'target': '_blank',
'data-toggle': '',
},
'iconClass': 'ri-external-link-line',
'btnText': 'mautic.core.open_link'|trans,
'priority': 100
},
'results': {
'attr': {
'class': 'btn btn-ghost btn-sm btn-nospin',
'href': path('mautic_page_results', {'objectId': item.id}),
'data-toggle': 'ajax',
'data-menu-link': 'mautic_form_index'
},
'iconClass': 'ri-bar-chart-line',
'btnText': 'mautic.form.form.results'|trans,
'priority': 80
}
}|merge(not item.isPreferenceCenter ? {
'copy': {
'attr': {
'data-copy': url('mautic_page_public', {'slug': item.alias}),
'data-toggle': 'none',
},
'btnText': 'mautic.core.copy_page_link'|trans,
'iconClass': 'ri-clipboard-line',
'priority': 90
}
} : {})
}) }}
</td>
<td>
{{ include('@MauticCore/Helper/publishstatus_icon.html.twig', {'item': item, 'model': 'page.page'}) }}
<a href="{{ path('mautic_page_action', {'objectAction': 'view', 'objectId': item.id}) }}" data-toggle="ajax">
{{ item.title }} ({{ item.alias }})
{% if item.isVariant or item.isTranslation or item.isPreferenceCenter or pageConfig.isDraftEnabled %}
<span>
{% if item.isVariant %}
<span data-toggle="tooltip" title="{{ 'mautic.core.icon_tooltip.ab_test'|trans }}">
<i class="ri-fw ri-organization-chart"></i>
</span>
{% endif %}
{% if item.isTranslation %}
<span data-toggle="tooltip" title="{{ 'mautic.core.icon_tooltip.translation'|trans }}">
<i class="ri-fw ri-translate"></i>
</span>
{% endif %}
{% if item.isPreferenceCenter %}
<span data-toggle="tooltip" title="{{ 'mautic.core.icon_tooltip.preference_center'|trans }}">
<i class="ri-settings-5-line"></i>
</span>
{% endif %}
{% if pageConfig.isDraftEnabled and item.hasDraft %}
<span data-toggle="tooltip" title="{{ 'mautic.email.icon_tooltip.has_draft'|trans }}">
<i class="fa fa-fw fa-file"></i>
</span>
{% endif %}
</span>
{% endif %}
</a>
{{ customContent('page.name', _context) }}
{{ include('@MauticProject/Modules/projects.html.twig') }}
</td>
<td class="visible-md visible-lg">
{{ include('@MauticCore/Modules/category--expanded.html.twig', {'category': item.category}) }}
</td>
<td class="visible-md visible-lg">
{% if item.template %}
{{ getThemeName(item.template) }}
{% else %}
<span class="text-muted">{{ 'mautic.core.form.default'|trans }}</span>
{% endif %}
</td>
<td class="visible-md visible-lg">{{ item.hits }}</td>
<td class="visible-md visible-lg" title="{% if item.dateAdded %}{{ dateToFullConcat(item.dateAdded) }}{% endif %}">
{% if item.dateAdded %}{{ dateToDate(item.dateAdded) }}{% endif %}
</td>
<td class="visible-md visible-lg" title="{% if item.dateModified %}{{ dateToFullConcat(item.dateModified) }}{% endif %}">
{% if item.dateModified %}{{ dateToDate(item.dateModified) }}{% endif %}
</td>
<td class="visible-md visible-lg">{{ item.createdByUser }}</td>
<td class="visible-md visible-lg">
<a href="{{ path('mautic_page_results', {'objectId': item.id}) }}" data-toggle="ajax" data-menu-link="mautic_form_index" size="sm" class="label label-gray" {% if 0 == i.submission_count %}disabled="disabled"{% endif %}>
{{- 'mautic.form.form.viewresults'|trans({'%count%': i.submission_count}) -}}
</a>
</td>
<td class="visible-md visible-lg">{{ item.id }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="panel-footer">
{{ include('@MauticCore/Helper/pagination.html.twig', {
'totalItems': items|length,
'page': page,
'limit': limit,
'menuLinkId': 'mautic_page_index',
'baseUrl': path('mautic_page_index'),
'sessionVar': 'page',
}) }}
</div>
</div>
{% else %}
{% if searchValue is not empty %}
{{ include('@MauticCore/Helper/noresults.html.twig') }}
{% else %}
<div class="mt-80 col-md-offset-2 col-lg-offset-3 col-md-8 col-lg-5 height-auto">
{% set childContainer %}
<div class="mb-md">
{% include '@MauticCore/Components/pictogram.html.twig' with {
'pictogram': 'landing-page',
'size': '80'
} %}
</div>
{% endset %}
{{ include('@MauticCore/Components/content-block.html.twig', {
heading: 'mautic.page.contentblock.heading',
subheading: 'mautic.page.contentblock.subheading',
childContainer: childContainer,
}) }}
</div>
{% endif %}
{% endif %}

View File

@@ -0,0 +1,367 @@
{#
Variables
- activePage (\Mautic\PageBundle\Entity\Page)
- variants
- translations
- permissions
- stats
- abTestResults
- security
- pageUrl
- previewUrl
- logs
- dateRangeForm
@todo - add landing page stats/analytics
#}
{# Only show A/B test button if not already a translation of an a/b test #}
{% set allowAbTest = (activePage.isPreferenceCenter or (activePage.isTranslation(true) and translations.parent.isVariant)) ? false : true %}
{% extends '@MauticCore/Default/content.html.twig' %}
{% block mauticContent %}page{% endblock %}
{% block preHeader %}
{{ include('@MauticCore/Helper/page_actions.html.twig', {
'item': activePage,
'customButtons': customButtons|default([]),
'templateButtons': {
'close': securityHasEntityAccess( permissions['page:pages:viewown'], permissions['page:pages:viewother'], activePage.createdBy),
},
'routeBase': 'page',
'targetLabel': 'mautic.page.pages'|trans
}) }}
{{ include('@MauticCore/Modules/category--inline.html.twig', {'category': activePage.category}) }}
{{ include('@MauticProject/Modules/projects.html.twig', {'item': activePage}) }}
{% endblock %}
{% block headerTitle %}{{ activePage.title }}{% endblock %}
{% block actions %}
{{ include('@MauticCore/Helper/page_actions.html.twig', {
'item': activePage,
'customButtons': customButtons|default([]),
'templateButtons': {
'edit': securityHasEntityAccess(permissions['page:pages:editown'], permissions['page:pages:editother'], activePage.createdBy),
'abtest': allowAbTest and permissions['page:pages:create'],
'clone': permissions['page:pages:create'],
'delete': securityHasEntityAccess(permissions['page:pages:deleteown'], permissions['page:pages:deleteown'], activePage.createdBy),
},
'routeBase': 'page',
}) }}
{% endblock %}
{% block publishStatus %}
{{- include('@MauticCore/Helper/publishstatus_badge.html.twig', {
'entity': activePage,
'status': 'available'
}) -}}
<div class="label__divider"></div>
{% set blueTags = [] %}
{% set grayTags = [] %}
{% if activePage.isPreferenceCenter %}
{% set blueTags = blueTags|merge([{ type: 'read-only', color: 'blue', icon_only: true, label: 'mautic.email.form.preference_center', icon: 'ri-equalizer-2-fill' }]) %}
{% endif %}
{% if activePage.isTranslation and not activePage.isTranslation(true) %}
{% set blueTags = blueTags|merge([{ color: 'blue', label: 'mautic.core.icon_tooltip.translation', icon: 'ri-translate', icon_only: true }]) %}
{% endif %}
{% if activePage.noIndex is defined and activePage.noIndex == 1 %}
{% set blueTags = blueTags|merge([{ label: 'mautic.core.tag.search_index.disabled'|trans, icon: 'ri-eye-off-fill', color: 'blue', icon_only: true }]) %}
{% endif %}
{% if activePage.isVariant and not activePage.isVariant(true) %}
{% set grayTags = grayTags|merge([{ type: 'read-only', color: 'warm-gray', label: 'mautic.email.icon_tooltip.abtest' }]) %}
{% endif %}
{% if activePage.isVariant(true) %}
{% set grayTags = grayTags|merge([{ color: 'warm-gray', label: 'mautic.core.variant_of'|trans({'%parent%' : variants.parent.getName()}), icon: 'ri-organization-chart' }]) %}
{% endif %}
{% if activePage.isTranslation(true) %}
{% set grayTags = grayTags|merge([{
color: 'warm-gray',
label: 'mautic.core.translation_of'|trans({'%parent%' : translations.parent.getName()}),
icon: 'ri-translate',
attributes: {
'href': path('mautic_page_action', {'objectAction': 'view', 'objectId': translations.parent.id})
}
}]) %}
{% endif %}
{% if activePage.language is defined and activePage.language is not empty %}
{% set grayTags = grayTags|merge([{ label: activePage.language|language_name, icon: 'ri-translate-2', color: 'warm-gray', attributes: { 'data-toggle': 'tooltip', 'data-placement': 'top', 'title': 'mautic.core.language'|trans } }]) %}
{% endif %}
{% include '@MauticCore/Helper/_tag.html.twig' with { tags: blueTags|merge(grayTags) } %}
{% endblock %}
{% block content %}
{% set variantContent = include('@MauticCore/Variant/index.html.twig', {
'activeEntity': activePage,
'variants': variants,
'abTestResults': abTestResults,
'model': 'page',
'actionRoute': 'mautic_page_action',
'nameGetter': 'getTitle',
})|trim %}
{% set showVariants = variantContent is not empty %}
{% set translationContent = include('@MauticCore/Translation/index.html.twig', {
'activeEntity': activePage,
'translations': translations,
'model': 'page',
'actionRoute': 'mautic_page_action',
'nameGetter': 'getTitle',
})|trim %}
{% set showTranslations = translationContent is not empty %}
<!-- start: box layout -->
<div class="box-layout">
<!-- left section -->
<div class="col-md-9 height-auto">
<div>
<!-- page detail header -->
{% include '@MauticCore/Helper/description--expanded.html.twig' with {
'description': activePage.metaDescription
} %}
<!--/ page detail header -->
<!-- page detail collapseable -->
<div class="collapse pr-md pl-md" id="page-details">
<div class="pr-md pl-md pb-md">
<div class="panel shd-none mb-0">
<table class="table table-hover mb-0">
<tbody>
{{ include('@MauticCore/Helper/details.html.twig', {'entity': activePage}, with_context=false) }}
</tbody>
</table>
</div>
</div>
</div>
<!--/ page detail collapseable -->
</div>
<div>
<!-- page detail collapseable toggler -->
<div class="hr-expand nm">
<span data-toggle="tooltip" title="Detail">
<a href="javascript:void(0)" class="arrow text-secondary collapsed" data-toggle="collapse" data-target="#page-details">
<span class="caret"></span> {{ 'mautic.core.details'|trans }}
</a>
</span>
</div>
<!--/ page detail collapseable toggler -->
<!-- some stats -->
<div class="pa-md">
<div class="row">
<div class="col-sm-12">
<div class="panel">
<div class="panel-body box-layout">
<div class="col-md-3 va-m">
<h5 class="text-white dark-md fw-sb mb-xs">
<span class="ri-line-chart-fill"></span>
{{ 'mautic.page.pageviews'|trans }}
</h5>
</div>
<div class="col-md-9 va-m">
{{ include('@MauticCore/Helper/graph_dateselect.html.twig', {'dateRangeForm': dateRangeForm, 'class': 'pull-right'}) }}
</div>
</div>
<div class="d-flex fd-column pt-0 pl-15 pb-15 pr-15 min-h-256">
{{ include('@MauticCore/Helper/chart.html.twig', {'chartData': stats.pageviews, 'chartType': 'line', 'chartHeight': 300}) }}
</div>
</div>
</div>
</div>
</div>
<!--/ stats -->
{{ customContent('details.stats.graph.below', _context) }}
<!-- tabs controls -->
<ul class="nav nav-tabs nav-tabs-contained">
{% if showVariants %}
<li class="active">
<a href="#variants-container" role="tab" data-toggle="tab">
{{- 'mautic.core.variants'|trans -}}
</a>
</li>
{% endif %}
{% if showTranslations %}
<li class="{% if not showVariants %}active{% endif %}">
<a href="#translation-container" role="tab" data-toggle="tab">
{{- 'mautic.core.translations'|trans -}}
</a>
</li>
{% endif %}
</ul>
<!--/ tabs controls -->
</div>
{% if showVariants or showTranslations %}
<!-- start: tab-content -->
<div class="tab-content pa-md">
{% if showVariants %}
<!-- #variants-container -->
<div class="tab-pane active bdr-w-0" id="variants-container">
{{ variantContent|raw }}
</div>
<!--/ #variants-container -->
{% endif %}
<!-- #translation-container -->
{% if showTranslations %}
<div class="tab-pane {% if not showVariants %}active{% endif %} bdr-w-0" id="translation-container">
{{ translationContent|raw }}
</div>
{% endif %}
<!--/ #translation-container -->
</div>
<!--/ end: tab-content -->
{% endif %}
{% set additionalCards = [{
heading: 'mautic.page.results.view',
copy: (not showVariants and not showTranslations) ? 'mautic.page.results.view.description' : null,
pictogram: 'data--set',
href: path('mautic_page_results', {'objectId': activePage.id}),
attributes: {
'data-toggle': 'ajax',
'data-menu-link': 'mautic_form_index'
}
}] %}
{{ include('@MauticCore/Modules/suggested-actions.html.twig', {
'entity': activePage,
'routeBase': 'page',
'showVariants': showVariants,
'showTranslations': showTranslations,
'allowAbTest': allowAbTest,
'additionalCards': additionalCards
}) }}
</div>
<!--/ left section -->
<!-- right section -->
<div class="col-md-3 bdr-l height-auto">
<!-- preview URL -->
{% if not activePage.isPreferenceCenter %}
<div class="panel shd-none bdr-rds-0 bdr-w-0 mt-sm mb-0">
<div class="panel-body pt-xs">
{% include '@MauticCore/Components/card.html.twig' with {
type: 'link',
href: pageUrl,
ctaType: 'new tab',
heading: 'mautic.core.open_link',
attributes: {
'target': '_blank'
}
} %}
</div>
</div>
{% endif %}
<div class="panel shd-none bdr-rds-0 bdr-w-0 mt-sm mb-0">
<div class="panel-heading">
<div class="panel-title">{{ 'mautic.page.preview.url'|trans }}</div>
</div>
<div class="panel-body pt-xs">
{% if previewSettingsForm.translation is defined %}
<div class="row">
<div class="form-group col-xs-12 ">
<div class="control-label">{{ 'mautic.email.preview.show.translation'|trans }}</div>
{{ form_widget(previewSettingsForm.translation) }}
</div>
</div>
{% endif %}
{% if previewSettingsForm.variant is defined %}
<div class="row">
<div class="form-group col-xs-12 ">
<div class="control-label">{{ 'mautic.email.preview.show.ab.variant'|trans }}</div>
{{ form_widget(previewSettingsForm.variant) }}
</div>
</div>
{% endif %}
{% if previewSettingsForm.contact is defined %}
<div class="row">
<div class="form-group col-xs-12 ">
<div class="control-label">{{ 'mautic.page.preview.show.contact'|trans }}</div>
{{ form_widget(previewSettingsForm.contact) }}
</div>
</div>
{% endif %}
<div class="row">
<div class="form-group col-xs-12 ">
<div class="input-group">
<div class="input-group-addon">
{{- include('@MauticCore/Helper/publishstatus_icon.html.twig', {
'item' : activePage,
'model' : 'page',
'query' : 'customToggle=publicPreview'
}) -}}
</div>
<input id="content_preview_url"
data-route="page/preview"
onclick="this.setSelectionRange(0, this.value.length);"
type="text"
class="form-control"
readonly
value="{{ previewUrl|e }}"/>
<span class="input-group-btn">
{% include '@MauticCore/Helper/button.html.twig' with {
buttons: [
{
label: 'mautic.core.open_link',
variant: 'ghost',
icon_only: true,
icon: 'ri-external-link-line',
onclick: 'window.open("' ~ previewUrl ~ '", "_blank");',
attributes: {
'id': 'content_preview_url_button',
'class': 'btn-nospin'
}
}
]
} %}
</span>
<input type="hidden" id="content_preview_settings_object_id" value="{{ activePage.id }}">
<input type="hidden" id="content_preview_settings_contact_id" value="">
</div>
</div>
</div>
</div>
</div>
{% if draftPreviewUrl is not empty %}
<div class="panel bg-transparent shd-none bdr-rds-0 bdr-w-0 mt-sm mb-0">
<div class="panel-heading">
<div class="panel-title">{{ 'mautic.email.draft.preview.url'|trans }}</div>
</div>
<div class="panel-body pt-xs">
<div class="input-group">
<input onclick="this.setSelectionRange(0, this.value.length);" type="text" class="form-control"
readonly
value="{{ draftPreviewUrl|e }}"/>
<span class="input-group-btn">
<button class="btn btn-default btn-nospin"
onclick="window.open('{{ draftPreviewUrl }}', '_blank');">
<i class="fa fa-external-link"></i>
</button>
</span>
</div>
</div>
</div>
{% endif %}
<!--/ preview URL -->
<hr class="hr-w-2" style="width:50%">
<!-- recent activity -->
{{ include('@MauticCore/Helper/recentactivity.html.twig', {'logs': logs}, with_context=false) }}
</div>
<!--/ right section -->
</div>
<!--/ end: box layout -->
{% endblock %}

View File

@@ -0,0 +1,152 @@
{#
Variables
- form
- isVariant
- tokens
- activePage
- themes
- permissions
- previewUrl (optional)
- security (optional)
- Defined when editing page
#}
{% form_theme form with [
'@MauticPage/FormTheme/Page/_page_abtest_settings_properties_row.html.twig',
'@MauticPage/FormTheme/Page/_page_variantSettings_properties_row.html.twig',
] %}
{% set isExisting = activePage.id %}
{% set variantParent = activePage.variantParent %}
{% set previewUrl = previewUrl|default('') %}
{% set draftPreviewUrl = draftPreviewUrl|default('') %}
{% extends '@MauticCore/Default/content.html.twig' %}
{% block mauticContent %}page{% endblock %}
{% block headerTitle %}
{%- if isExisting -%}
{{ 'mautic.page.header.edit'|trans({'%name%': activePage.title}) }}
{%- else -%}
{{ 'mautic.page.header.new'|trans }}
{%- endif -%}
{% if variantParent %}
<div><span class="small">{{ 'mautic.core.variant_of'|trans({'%name%': activePage.title, '%parent%': variantParent.title}) }}</span></div>
{% elseif activePage.isVariant(false) %}
<div><span class="small">{{ 'mautic.page.form.has_variants'|trans }}</span></div>
{%- endif -%}
{% endblock %}
{% block content %}
<div id="grapesjsbuilder_assets" class="hide"></div>
{% set template, attr = form.template.vars.data, form.vars.attr %}
{% set attr = attr|merge({
'data-submit-callback-async': 'clearThemeHtmlBeforeSave',
}) %}
{{ form_start(form, {'attr': attr}) }}
<!-- start: box layout -->
<div class="box-layout">
<!-- container -->
<div class="col-md-9 height-auto">
<div class="row">
<div class="col-xs-12">
<!-- tabs controls -->
<ul class="nav nav-tabs nav-tabs-contained">
<li class="active">
<a href="#theme-container" role="tab" data-toggle="tab">{{ 'mautic.core.form.theme'|trans }}</a>
</li>
<li id="advanced-tab" class="hidden">
<a href="#advanced-container" role="tab" data-toggle="tab">{{ 'mautic.core.advanced'|trans }}</a>
</li>
</ul>
<!--/ tabs controls -->
<div class="tab-content pa-md">
<div class="tab-pane fade in active bdr-w-0" id="theme-container">
<div class="row">
<div class="col-md-12">
{{ form_row(form.template) }}
</div>
</div>
{{ include('@MauticCore/Helper/theme_select.html.twig', {
'type': 'page',
'themes': themes,
'active': form.template.vars.value,
}, with_context=false) }}
</div>
<div class="tab-pane fade bdr-w-0" id="advanced-container">
<br>
<div class="row hidden" id="custom-html-row">
<div class="col-md-12">
{{ form_label(form.customHtml) }}
{{ form_widget(form.customHtml) }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3 height-auto bdr-l">
<div class="pr-lg pl-lg pt-md pb-md">
{{ form_row(form.title) }}
{% if isVariant %}
{{ form_row(form.variantSettings) }}
{% else %}
{{ form_row(form.alias) }}
{{ form_row(form.category) }}
{{ form_row(form.projects) }}
{{ form_row(form.language) }}
{{ form_row(form.translationParent) }}
{% endif %}
{{ form_row(form.isPublished, {
'attr': {
'data-none': 'mautic.core.form.unavailable_regardless_of_scheduling',
'data-start': 'mautic.core.form.available_on_scheduled_date',
'data-both': 'mautic.core.form.available_during_scheduled_period',
'data-end': 'mautic.core.form.available_until_scheduled_end'
}
}) }}
{% if (permissions['page:preference_center:editown'] or permissions['page:preference_center:editother']) and not activePage.isVariant %}
{{ form_row(form.isPreferenceCenter) }}
{% endif %}
{{ form_row(form.publishUp, {'label': 'mautic.core.form.available.available_from'}) }}
{{ form_row(form.publishDown, {'label': 'mautic.core.form.available.unavailable_from'}) }}
{% if not isVariant %}
{{ form_row(form.redirectType) }}
{{ form_row(form.redirectUrl) }}
{% endif %}
{{ form_row(form.noIndex) }}
<div class="template-fields {% if not template %}hide{% endif %}">
{{ form_row(form.metaDescription) }}
</div>
<div class="template-fields {% if not template %}hide{% endif %}">
{{ form_row(form.headScript) }}
</div>
<div class="template-fields {% if not template %}hide{% endif %}">
{{ form_row(form.footerScript) }}
</div>
<div class="hide">
{{ form_rest(form) }}
</div>
</div>
</div>
</div>
{{ form_end(form) }}
{{ include('@MauticCore/Helper/builder.html.twig', {
'type': 'page',
'isCodeMode': ('mautic_code_mode' is same as activePage.template),
'objectId': activePage.sessionId,
'previewUrl': previewUrl,
'draftPreviewUrl': draftPreviewUrl,
}, with_context=false) }}
{% endblock %}

View File

@@ -0,0 +1,98 @@
{#
Variables
- searchValue
- items
- categories
- page
- limit
- permissions
- model
- tmpl
- security
#}
{% set isIndex = 'index' == tmpl ? true : false %}
{% set tmpl = 'list' %}
{% extends isIndex ? '@MauticCore/Default/content.html.twig' : '@MauticCore/Default/raw_output.html.twig' %}
{% block mauticContent %}page{% endblock %}
{% block headerTitle %}{{ 'mautic.page.pages'|trans }}{% endblock %}
{% block content %}
{% if isIndex %}
<div id="page-list-wrapper" class="{% if items|length > 0 or searchValue is not empty %}panel {% endif %}panel-default">
{{ include('@MauticCore/Helper/list_toolbar.html.twig', {
'searchValue': searchValue,
'searchHelp': 'mautic.page.help.searchcommands',
'action': currentRoute,
'page_actions': {
'templateButtons': {
'new': permissions['page:pages:create'],
},
'routeBase': 'page',
},
'bulk_actions': {
'routeBase': 'page',
'templateButtons': {
'delete': permissions['page:pages:deleteown'] or permissions['page:pages:deleteother'],
},
},
'quickFilters': [
{
'search': 'mautic.core.searchcommand.ispublished',
'label': 'mautic.core.form.active',
'tooltip': 'mautic.core.searchcommand.ispublished.description',
'icon': 'ri-check-line'
},
{
'search': 'mautic.core.searchcommand.isunpublished',
'label': 'mautic.core.form.inactive',
'tooltip': 'mautic.core.searchcommand.isunpublished.description',
'icon': 'ri-close-line'
},
{
'search': 'mautic.core.searchcommand.isuncategorized',
'label': 'mautic.core.form.uncategorized',
'tooltip': 'mautic.core.searchcommand.isuncategorized.description',
'icon': 'ri-folder-unknow-line'
},
{
'search': 'mautic.core.searchcommand.ismine',
'label': 'mautic.core.searchcommand.ismine.label',
'tooltip': 'mautic.core.searchcommand.ismine.description',
'icon': 'ri-user-line'
},
{
'search': 'mautic.page.searchcommand.isexpired',
'label': 'mautic.core.form.expired',
'tooltip': 'mautic.page.searchcommand.isexpired.description',
'icon': 'ri-time-line'
},
{
'search': 'mautic.page.searchcommand.ispending',
'label': 'mautic.core.form.pending',
'tooltip': 'mautic.page.searchcommand.ispending.description',
'icon': 'ri-timer-line'
},
{
'search': 'mautic.page.searchcommand.isprefcenter',
'label': 'mautic.page.searchcommand.isprefcenter.label',
'tooltip': 'mautic.page.searchcommand.isprefcenter.description',
'icon': 'ri-settings-4-line'
}
]
}) }}
<div class="page-list">
{% endif %}
{{ include('@MauticPage/Page/_list.html.twig') }}
{% if isIndex %}
</div>
</div>
{{ include('@MauticCore/Modules/protip.html.twig', {
tip: random(['mautic.protip.pages.mobile', 'mautic.protip.pages.forms'])
}) }}
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,95 @@
{#
Variables
- activePage
- items
#}
{% set pageId = activePage.id %}
<div class="table-responsive table-responsive-force">
<table class="table table-hover pageresult-list" id="pageResultsTable">
<thead>
<tr>
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'pageresult.' ~ pageId,
'orderBy': 's.id',
'text': 'mautic.form.report.submission.id',
'class': 'col-pageresult-id',
'filterBy': 's.id',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'pageresult.' ~ pageId,
'orderBy': 's.lead_id',
'text': 'mautic.lead.report.contact_id',
'class': 'col-pageresult-lead-id',
'filterBy': 's.lead_id',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'pageresult.' ~ pageId,
'orderBy': 's.form_id',
'text': 'mautic.form.report.form_id',
'class': 'col-pageresult-form-id',
'filterBy': 's.form_id',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'pageresult.' ~ pageId,
'orderBy': 's.date_submitted',
'text': 'mautic.form.result.thead.date',
'class': 'col-pageresult-date',
'default': true,
'filterBy': 's.date_submitted',
'dataToggle': 'date',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'pageresult.' ~ pageId,
'orderBy': 'i.ip_address',
'text': 'mautic.core.ipaddress',
'class': 'col-pageresult-ip',
'filterBy': 'i.ip_address',
}) }}
</tr>
</thead>
<tbody>
{% if items|length > 0 %}
{% for item in items %}
<tr>
<td>{{ item.id|e }}</td>
<td>
{% if item.leadId is defined %}
<a href="{{ path('mautic_contact_action', {'objectAction': 'view', 'objectId': item.leadId}) }}" data-toggle="ajax">
{{- item.leadId|e -}}
</a>
{% endif %}
</td>
<td>
{% if item.formId is defined %}
<a href="{{ path('mautic_form_action', {'objectAction': 'view', 'objectId': item.formId}) }}" data-toggle="ajax">
{{- item.formId|e -}}
</a>
{% endif %}
</td>
<td>{{ dateToFull(item.dateSubmitted, 'UTC') }}</td>
<td>{{ item.ipAddress|e }}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="4">
{{ include('@MauticCore/Helper/noresults.html.twig') }}
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div class="panel-footer">
{{ include('@MauticCore/Helper/pagination.html.twig', {
'totalItems': totalCount,
'page': page,
'limit': limit,
'baseUrl': path('mautic_page_results', {'objectId': activePage.id}),
'sessionVar': 'pageresult.' ~ pageId,
}) }}
</div>

View File

@@ -0,0 +1,39 @@
{#
Variables
- pageTitle
- results
- page
#}
{% set contentOnly = true %}
{% extends '@MauticCore/Default/content.html.twig' %}
{% block pageTitle %}{{ pageTitle }}{% endblock %}
{% block headerTitle %}{{ 'mautic.page.result.header.index'|trans({'%name%': page.getName()}) }}{% endblock %}
{% block content %}
<div class="pageresults">
<table class="table table-hover pageresult-list">
<thead>
<tr>
<th class="col-pageresult-id">{{ 'mautic.form.report.submission.id'|trans }}</th>
<th class="col-pageresult-leadId">{{ 'mautic.lead.report.contact_id'|trans }}</th>
<th class="col-pageresult-formId">{{ 'mautic.form.report.form_id'|trans }}</th>
<th class="col-pageresult-date">{{ 'mautic.form.result.thead.date'|trans }}</th>
<th class="col-pageresult-ip">{{ 'mautic.core.ipaddress'|trans }}</th>
</tr>
</thead>
<tbody>
{% for item in results %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.leadId }}</td>
<td>{{ item.formId }}</td>
<td>{{ dateToFull(item.dateSubmitted, 'UTC') }}</td>
<td>{{ item.ipAddress }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

View File

@@ -0,0 +1,79 @@
{#
Variables
- activePage
- items
#}
{% set isIndex = 'index' == tmpl ? true : false %}
{% set tmpl = 'list' %}
{% extends isIndex ? '@MauticCore/Default/content.html.twig' : '@MauticCore/Default/raw_output.html.twig' %}
{% block mauticContent %}pageresult{% endblock %}
{% block headerTitle %}
{{ 'mautic.page.result.header.index'|trans({
'%name%': activePage.getName(),
}) }}
{% endblock %}
{% block actions %}
{% set buttons = [
{
'attr': {
'target': '_new',
'data-toggle': '',
'class': 'btn btn-ghost btn-nospin',
'href': path('mautic_page_export', {'objectId': activePage.id, 'format': 'html'}),
},
'btnText': 'mautic.form.result.export.html'|trans,
'iconClass': 'ri-file-code-line',
'primary': true,
},
{
'attr': {
'data-toggle': '',
'class': 'btn btn-ghost btn-nospin',
'href': path('mautic_page_export', {'objectId': activePage.id, 'format': 'csv'}),
},
'btnText': 'mautic.form.result.export.csv'|trans,
'iconClass': 'ri-file-text-line',
'primary': true,
}
] %}
{% if '\\PhpOffice\\PhpSpreadsheet\\Spreadsheet' is class %}
{% set buttons = buttons|merge([{
'attr': {
'data-toggle': '',
'class': 'btn btn-ghost btn-nospin',
'href': path('mautic_page_export', {'objectId': activePage.id, 'format': 'xlsx'}),
},
'btnText': 'mautic.form.result.export.xlsx'|trans,
'iconClass': 'ri-file-excel-2-fill',
'primary': true,
}]) %}
{% endif %}
{% set buttons = buttons|merge([{
'attr': {
'class': 'btn btn-ghost',
'href': path('mautic_page_action', {'objectAction': 'view', 'objectId': activePage.id}),
'data-toggle': 'ajax',
},
'iconClass': 'ri-close-line',
'btnText': 'mautic.core.form.close'|trans,
}]) %}
{{ include('@MauticCore/Helper/page_actions.html.twig', {'customButtons': buttons}) }}
{% endblock %}
{% block content %}
{% if isIndex %}
<div class="page-list">
{% endif %}
{{ include('@MauticPage/Result/_list.html.twig') }}
{% if isIndex %}
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,26 @@
{#
Variables
- results
- variants
#}
{% set support = results.support %}
{% set label = variants.criteria[results.basedOn].label %}
{% set chart = barChartInitialize(support.labels) %}
{% if support.data is defined and support.data is iterable %}
{% for datasetLabel, values in support.data %}
{% do chart.setDataset(datasetLabel, values) %}
{% endfor %}
{% endif %}
<div class="panel ovf-h bg-light-xs abtest-bar-chart">
<div class="panel-body box-layout">
<div class="col-xs-8 va-m">
<h5 class="text-white dark-md fw-sb mb-xs">
{{ label|trans }}
</h5>
</div>
<div class="col-xs-4 va-t text-right">
<h3 class="text-white dark-sm"><span class="ri-bar-chart-box-line"></span></h3>
</div>
</div>
{{ include('@MauticCore/Helper/chart.html.twig', {'chartData': chart.render, 'chartType': 'bar', 'chartHeight': 300}) }}
</div>

View File

@@ -0,0 +1,22 @@
{#
Variables
- pages
#}
{% set count = pages|length %}
{% if count > 0 %}
<div class="page-lang-bar">
{% for page in pages %}
{% set active = app.request.requestUri == page.url %}
<span>
{% if not active %}
<a href="{{ page.url }}">
{% endif %}
{{ page.lang }}
{% if not active %}
</a>
{% endif %}
</span>
{% set count = count - 1 %}
{% endfor %}
</div>
{% endif %}

View File

@@ -0,0 +1,5 @@
{{ assetAddScriptDeclaration('.share-buttons { display: block; }
.share-button { float: left; margin-right: 5px; }
.share-button.facebook-share-button.layout-box_count.action-like iframe { width: 50px !important; }
.share-button.facebook-share-button.layout-box_count { margin-right: 10px !important; }
.share-button.twitter-share-button.layout-horizontal { width: 75px !important; }') }}

View File

@@ -0,0 +1,19 @@
{% if showMore is defined %}
<a href="{{ url('mautic_page_index', {'search': searchString}) }}" data-toggle="ajax">
<span>{{ 'mautic.core.search.more'|trans({'%count%': remaining}) }}</span>
</a>
{% else %}
<a href="{{ url('mautic_page_action', {'objectAction': 'view', 'objectId': item.id}) }}" data-toggle="ajax">
<span class="fw-sb">{{ item.title|purify }}</span>
<span class="ml-4 mr-sm">#{{ item.getId() }}</span>
{{- include('@MauticCore/Helper/publishstatus_badge.html.twig', {
'entity': item,
'status': 'available',
'simplified': 'true'
}) -}}
<span class="pull-right" data-toggle="tooltip" title="{{ 'mautic.page.hits'|trans }}" data-placement="left">
<i class="ri-eye-line"></i>
{{ item.hits }}
</span>
</a>
{% endif %}

View File

@@ -0,0 +1,100 @@
{% if event.extra is defined %}
{% set timeOnPage = 'mautic.core.unknown'|trans %}
{% if event.extra.hit.dateLeft %}
{% set timeOnPage = (event.extra.hit.dateLeft.timestamp - event.extra.hit.dateHit.timestamp) %}
{# format the time #}
{% if timeOnPage > 60 %}
{% set sec = timeOnPage % 60 %}
{% set min = (timeOnPage / 60)|round(0, 'floor') %}
{% set timeOnPage = min ~ 'm ' ~ sec ~ 's' %}
{% else %}
{% set timeOnPage = timeOnPage ~ 's' %}
{% endif %}
{% endif %}
<dl class="dl-horizontal">
<dt>{{ 'mautic.page.time.on.page'|trans }}:</dt>
<dd>{{ timeOnPage }}</dd>
<dt>{{ 'mautic.page.referrer'|trans }}:</dt>
<dd>{% if event['extra']['hit']['referer'] %}{{ assetMakeLinks(event['extra']['hit']['referer']) }}{% else %}{{ 'mautic.core.unknown'|trans }}{% endif %}</dd>
<dt>{{ 'mautic.page.url'|trans }}:</dt>
<dd>{% if event['extra']['hit']['url'] %}{{ assetMakeLinks(event['extra']['hit']['url']) }}{% else %}{{ 'mautic.core.unknown'|trans }}{% endif %}</dd>
{% if event.extra.hit.device is defined and event.extra.hit.device is not empty %}
<dt>{{ 'mautic.core.timeline.device.name'|trans }}</dt>
<dd class="ellipsis">{{ inputClean(event.extra.hit.device) }}</dd>
{% endif %}
{% if event.extra.hit.deviceOsName is defined and event.extra.hit.deviceOsName is not empty %}
<dt>{{ 'mautic.core.timeline.device.os'|trans }}</dt>
<dd class="ellipsis">{{ inputClean(event.extra.hit.deviceOsName) }}</dd>
{% endif %}
{% if event.extra.hit.deviceBrand is defined and event.extra.hit.deviceBrand is not empty %}
<dt>{{ 'mautic.core.timeline.device.brand'|trans }}</dt>
<dd class="ellipsis">{{ inputClean(event.extra.hit.deviceBrand) }}</dd>
{% endif %}
{% if event.extra.hit.deviceModel is defined and event.extra.hit.deviceModel is not empty %}
<dt>{{ 'mautic.core.timeline.device.model'|trans }}</dt>
<dd class="ellipsis">{{ inputClean(event.extra.hit.deviceModel) }}</dd>
{% endif %}
{% if event.extra.hit.sourceName is defined and event.extra.hit.sourceName is not empty %}
<dt>{{ 'mautic.core.source'|trans }}:</dt>
<dd>
{% if event.extra.hit.sourceRate is defined %}
<a href="{{ inputClean(event.extra.hit.sourceRoute) }}" data-toggle="ajax">{{ inputClean(event.extra.hit.sourceName) }}</a>
{% else %}
{{ inputClean(event.extra.hit.sourceName) }}
{% endif %}
</dd>
{% if event.extra.hit.clientInfo is defined and event.extra.hit.clientInfo is not empty and event.extra.hit.clientInfo is iterable %}
<dt>{{ 'mautic.core.timeline.device.client.info'|trans }}</dt>
<dd class="ellipsis">
{% for clientInfo in event.extra.hit.clientInfo %}
{{ inputClean(clientInfo) }}
{% endfor %}
</dd>
{% endif %}
{% endif %}
{% if event.extra.hit.query is defined and event.extra.hit.query is not empty and event.extra.hit.query is iterable %}
{% set counter = 0 %}
{% for k, v in event.extra.hit.query %}
{% if v is not empty and k not in ['ct', 'page_title', 'page_referrer', 'page_url'] %}
{% if v is iterable %}
{% for k2, v2 in v %}
{% set counter = counter + 1 %}
{% set k2 = k|replace({'_': ' '})|title %}
<dt>{{ k2 }}:</dt>
<dd class="ellipsis">{{ v2 }}</dd>
{% endfor %}
{% else %}
{% set counter = counter + 1 %}
{% set k = k|replace({'_': ' '})|title %}
<dt>{{ k }}</dt>
<dd class="ellipsis">{{ v }}</dd>
{% endif %}
{% if showMore is not defined and counter > 5 %}
{% set showMore = true %}
<div style="display:none">
{% endif %}
{% endif %}
{% endfor %}
{% if showMore is defined and true == showMore %}
</div>
<a href="javascript:void(0);" class="text-center small center-block mt-xs" onclick="Mautic.toggleTimelineMoreVisiblity(mQuery(this).prev());">{{ 'mautic.core.more.show'|trans }}</a>
{% endif %}
{% endif %}
</dl>
<div class="small">
{{ inputClean(event.extra.hit.userAgent) }}
</div>
{% endif %}

View File

@@ -0,0 +1,49 @@
{% set viewTime = 'mautic.core.unknown'|trans %}
{% set duration = 'mautic.core.unknown'|trans %}
{% set percentage = 'mautic.core.unknown'|trans %}
{% set unknown = 'mautic.core.unknown'|trans %}
{% set icon = event.icon|default('') %}
{% if event.extra.hit.time_watched is defined %}
{% set viewTimeActual = event.extra.hit.time_watched %}
{% set viewTime = event.extra.hit.time_watched %}
{# format the time #}
{% if viewTime > 60 %}
{% set sec = viewTime % 60 %}
{% set min = (viewTime / 60)|round(0, 'floor') %}
{% set viewTime = min ~ 'm ' ~ sec ~ 's' %}
{% else %}
{% set viewTime = viewTime ~ 's' %}
{% endif %}
{% endif %}
{% if event.extra.hit.duration is defined %}
{% set durationActual = event.extra.hit.duration %}
{% set duration = event.extra.hit.duration %}
{# format the time #}
{% if duration > 60 %}
{% set sec = duration % 60 %}
{% set min = (duration / 60)|round(0, 'floor') %}
{% set duration = min ~ 'm ' ~ sec ~ 's' %}
{% else %}
{% set duration = duration ~ 's' %}
{% endif %}
{% endif %}
{% if viewTime != unknown and duration != unknown %}
{% set percentage = ((viewTimeActual / durationActual) * 100)|round %}
{% endif %}
<dl class="dl-horizontal">
<dt>{{ 'mautic.page.time.on.video'|trans }}:</dt>
<dd class="ellipsis">{{ 'mautic.page.time.on.video.value'|trans({'%time_watched%': viewTime, '%duration%': duration, '%percentage%': percentage}) }}</dd>
<dt>{{ 'mautic.page.referrer'|trans }}:</dt>
<dd class="ellipsis">{% if event.extra.hit.referer is defined and event.extra.hit.referer is not empty %}{{ assetMakeLinks(event['extra']['hit']['referer']) }}{% else %}{{ 'mautic.core.unknown'|trans }}{% endif %}</dd>
<dt>{{ 'mautic.video.url'|trans }}:</dt>
<dd class="ellipsis">{% if event.hit.url is defined and event.hit.url is not empty %}{{ assetMakeLinks(event['extra']['hit']['url']) }}{% else %}{{ 'mautic.core.unknown'|trans }}{% endif %}</dd>
</dl>
<div class="small">
{{ inputClean(event.extra.hit.user_agent) }}
</div>

View File

@@ -0,0 +1,138 @@
{% set childContainer %}
<p class="text-secondary pi-md">{{'mautic.placeholder_tokens.landing_page_tokens.explanation'|trans}}</p>
<ul id="pageTokensAccordion" class="accordion" role="tablist" aria-multiselectable="true">
<!-- Landing Page tokens -->
<li class="panel">
<a role="button" id="headingLandingPageTokens" class="accordion-heading collapsed" data-toggle="collapse"
data-parent="#pageTokensAccordion" href="#collapseLandingPageTokens" aria-expanded="false"
aria-controls="collapseLandingPageTokens">
<i class="ri-arrow-down-s-line accordion-arrow"></i>
<span class="accordion-title">{{ 'mautic.placeholder_tokens.landing_page_tokens'|trans }}</span>
</a>
<div id="collapseLandingPageTokens" class="collapse accordion-wrapper" role="tabpanel"
aria-labelledby="headingLandingPageTokens">
<table class="table table-hover">
<thead>
<tr>
<th>{{ 'mautic.placeholder_tokens.variable_name'|trans }}</th>
<th>{{ 'mautic.placeholder_tokens.variable_syntax'|trans }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ 'mautic.placeholder_tokens.landing_page.meta_description'|trans }}</td>
<td><code>{pagemetadescription}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.landing_page.title'|trans }}</td>
<td><code>{pagetitle}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.landing_page.language_bar'|trans }}</td>
<td><code>{langbar}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.landing_page.share_buttons'|trans }}</td>
<td><code>{sharebuttons}</code></td>
</tr>
</tbody>
</table>
</div>
</li>
<!-- Preference Center Landing Page tokens -->
<li class="panel">
<a role="button" id="headingPreferenceCenterTokens" class="accordion-heading collapsed" data-toggle="collapse"
data-parent="#pageTokensAccordion" href="#collapsePreferenceCenterTokens" aria-expanded="false"
aria-controls="collapsePreferenceCenterTokens">
<i class="ri-arrow-down-s-line accordion-arrow"></i>
<span class="accordion-title">{{ 'mautic.placeholder_tokens.preference_center_tokens'|trans }}</span>
</a>
<div id="collapsePreferenceCenterTokens" class="collapse accordion-wrapper" role="tabpanel"
aria-labelledby="headingPreferenceCenterTokens">
<table class="table table-hover">
<thead>
<tr>
<th>{{ 'mautic.placeholder_tokens.variable_name'|trans }}</th>
<th>{{ 'mautic.placeholder_tokens.variable_syntax'|trans }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ 'mautic.placeholder_tokens.preference_center.lead_identifier'|trans }}</td>
<td><code>{leadidentifier}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.preference_center.category_list'|trans }}</td>
<td><code>{categorylist}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.preference_center.segment_list'|trans }}</td>
<td><code>{segmentlist}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.preference_center.preferred_channel'|trans }}</td>
<td><code>{preferredchannel}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.preference_center.channel_frequency'|trans }}</td>
<td><code>{channelfrequency}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.preference_center.save_preferences'|trans }}</td>
<td><code>{saveprefsbutton}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.landing_page.success_message'|trans }}</td>
<td><code>{successmessage}</code></td>
</tr>
</tbody>
</table>
</div>
</li>
<!-- Mautic component tokens -->
<li class="panel">
<a role="button" id="headingComponentTokens" class="accordion-heading collapsed" data-toggle="collapse"
data-parent="#pageTokensAccordion" href="#collapseComponentTokens" aria-expanded="false"
aria-controls="collapseComponentTokens">
<i class="ri-arrow-down-s-line accordion-arrow"></i>
<span class="accordion-title">{{ 'mautic.placeholder_tokens.component_tokens'|trans }}</span>
</a>
<div id="collapseComponentTokens" class="collapse accordion-wrapper" role="tabpanel"
aria-labelledby="headingComponentTokens">
<table class="table table-hover">
<thead>
<tr>
<th>{{ 'mautic.placeholder_tokens.variable_name'|trans }}</th>
<th>{{ 'mautic.placeholder_tokens.variable_syntax'|trans }}</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{ 'mautic.placeholder_tokens.component.asset_link'|trans }}</td>
<td><code>{assetlink=25}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.component.focus_item'|trans }}</td>
<td><code>{focus=4}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.component.form'|trans }}</td>
<td><code>{form=83}</code></td>
</tr>
<tr>
<td>{{ 'mautic.placeholder_tokens.component.landing_page_link'|trans }}</td>
<td><code>{pagelink=17}</code></td>
</tr>
</tbody>
</table>
</div>
</li>
</ul>
{% endset %}
{% include '@MauticCore/Components/content-section.html.twig' with {'heading': 'mautic.placeholder_tokens.landing_page_tokens', 'childContainer': childContainer} %}

View File

@@ -0,0 +1,79 @@
{% set showConversionRate = showConversionRate is defined ? showConversionRate : false %}
{% if trackables is not empty %}
<div class="table-responsive">
<table class="table table-hover click-list"
{% if showConversionRate %} data-conversion-rate-table data-entity-id="{{ entity.id }}"{% endif %}>
<thead>
<tr>
<td>{{ 'mautic.trackable.click_url'|trans }}</td>
<td>{{ 'mautic.trackable.click_count'|trans }}</td>
<td>{{ 'mautic.trackable.click_unique_count'|trans }}</td>
{{ customContent('click_counts_headers', _context) }}
{% if showConversionRate %}
<td>{{ 'mautic.trackable.click_conversion_rate'|trans }}</td>
{% endif %}
<td>{{ 'mautic.trackable.click_track_id'|trans }}</td>
</tr>
</thead>
<tbody>
{% set totalClicks = 0 %}
{% set totalUniqueClicks = 0 %}
{% for link in trackables %}
{% set totalClicks = totalClicks + link.hits %}
{% set totalUniqueClicks = totalUniqueClicks + link.unique_hits %}
<tr>
<td class="long-text"><a href="{{ link.url }}">{{ link.url }}</a></td>
<td class="text-center">{{ link.hits }}</td>
<td class="text-center">
<span class="mt-xs label label-primary">
{% if channel is defined and entity is defined %}
<a href="{{ path('mautic_contact_index', {'search' : 'mautic.lead.lead.searchcommand.page_source'|trans ~ ':' ~ channel ~ ' ' ~ 'mautic.lead.lead.searchcommand.page_source_id'|trans ~ ':' ~ entity.getId() ~ ' ' ~ 'mautic.lead.lead.searchcommand.page_id'|trans ~ ':' ~ link.id}) }}"
data-toggle="tooltip"
title="{{ 'mautic.email.stat.simple.tooltip'|trans }}">
{{ link.unique_hits }}
</a>
{% else %}
{{ link.unique_hits }}
{% endif %}
</span>
</td>
{{ customContent('click_counts', _context|merge({'redirect_id' : link.redirect_id})) }}
{% if showConversionRate %}
<td data-conversion-rate-cell data-unique-hits="{{ link.unique_hits }}"><div class="spinner"><i class="ri-loader-3-line ri-spin"></i></div></td>
{% endif %}
<td>{{ link.redirect_id }}</td>
</tr>
{% endfor %}
<tr>
<td class="long-text">{{ 'mautic.trackable.total_clicks'|trans }}</td>
<td class="text-center">{{ totalClicks }}</td>
<td class="text-center">
<span class="mt-xs label label-primary">
{% if channel is defined and entity is defined %}
<a href="{{ path('mautic_contact_index',
{'search' : 'mautic.lead.lead.searchcommand.page_source'|trans ~ ':' ~ channel ~ ' ' ~ 'mautic.lead.lead.searchcommand.page_source_id'|trans ~ ':' ~ entity.getId()}) }}"
data-toggle="tooltip"
title="{{ 'mautic.email.stat.simple.tooltip'|trans }}">
{{ totalUniqueClicks }}
</a>
{% else %}
{{ totalUniqueClicks }}
{% endif %}
</span>
</td>
{% if showConversionRate %}
<td data-conversion-rate-total-cell>
<div class="spinner"><i class="ri-loader-3-line ri-spin"></i></div>
<i class="ri-question-line" data-toggle="tooltip" data-container="body" data-placement="top" data-original-title="{{ 'mautic.trackable.total_conversion_rate_tooltip'|trans }}"></i>
</td>
{% endif %}
<td></td>
</tr>
</tbody>
</table>
</div>
{% else %}
{{- include('@MauticCore/Helper/noresults.html.twig', {'header' : 'mautic.trackable.click_counts.header_none', 'message' : 'mautic.trackable.click_counts.none'}) -}}
<div class="clearfix"></div>
{% endif %}