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,45 @@
{#
Form Theme is used at "Configuration" > "Notification Settings"
Variables
- form
#}
{% block _config_notification_config_widget %}
<h4 class="fw-sb mt-48 mb-xs">{{ 'mautic.config.tab.campaign_notification_config'|trans }}</h4>
<div class="text-muted small pb-md">{{ 'mautic.core.config.header.campaign_notification_config.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.campaign_send_notification_to_author) }}
</div>
</div>
<div class="row">
<div class="col-xs-12">
{{ form_row(form.campaign_notification_email_addresses) }}
</div>
</div>
</div>
</div>
</div>
<h4 class="fw-sb mt-48 mb-xs">{{ 'mautic.config.tab.webhook_notification_config'|trans }}</h4>
<div class="text-muted small pb-md">{{ 'mautic.core.config.header.webhook_notification_config.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.webhook_send_notification_to_author) }}
</div>
</div>
<div class="row">
<div class="col-xs-12">
{{ form_row(form.webhook_notification_email_addresses) }}
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,47 @@
{% block _mobile_notification_mobileSettings_widget %}
{% if 'ios' in integrationSettings.platforms %}
<div class="tab-pane fade in bdr-w-0" id="ios-notification-container">
<div class="row">
<div class="col-md-6">
{{ form_row(form.ios_subtitle) }}
{{ form_row(form.ios_media) }}
</div>
<div class="col-md-6">
<div class="well">
<h4>{{ 'Advanced Settings'|trans }}</h4>
<hr />
{{ form_row(form.ios_badges) }}
{{ form_row(form.ios_badgeCount) }}
{{ form_row(form.ios_sound) }}
{{ form_label(form.ios_contentAvailable) }}
{{ form_row(form.ios_contentAvailable) }}
{{ form_label(form.ios_mutableContent) }}
{{ form_row(form.ios_mutableContent) }}
</div>
</div>
</div>
</div>
{% endif %}
{% if 'android' in integrationSettings.platforms %}
<div class="tab-pane fade in bdr-w-0" id="android-notification-container">
<div class="row">
<div class="col-md-6">
{{ form_row(form.android_small_icon) }}
{{ form_row(form.android_large_icon) }}
{{ form_row(form.android_big_picture) }}
</div>
<div class="col-md-6">
<div class="well">
<h4>{{ 'Advanced Settings'|trans }}</h4>
<hr />
{{ form_row(form.android_sound) }}
{{ form_row(form.android_group_key) }}
{{ form_row(form.android_led_color) }}
{{ form_row(form.android_accent_color) }}
{{ form_row(form.android_lockscreen_visibility) }}
</div>
</div>
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,12 @@
{% block _notificationsend_list_row %}
<div class="row">
<div class="col-xs-8">
{{ form_row(form.notification) }}
</div>
<div class="col-xs-4 mt-lg">
<div class="mt-3">
{{ form_row(form.newNotificationButton) }}
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,122 @@
{#
Variables
- searchValue
- items
- totalItems
- page
- limit
- tmpl
- permissions
- model
- security
#}
{% if items|length > 0 %}
<div class="table-responsive">
<table class="table table-hover notification-list">
<thead>
<tr>
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'checkall': 'true',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'mobile_notification',
'orderBy': 'e.name',
'text': 'mautic.core.name',
'class': 'col-notification-name',
'default': true,
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'mobile_notification',
'orderBy': 'c.title',
'text': 'mautic.core.category',
'class': 'visible-md visible-lg col-notification-category',
}) }}
<th class="visible-sm visible-md visible-lg col-notification-stats">{{ 'mautic.core.stats'|trans }}</th>
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'mobile_notification',
'orderBy': 'e.id',
'text': 'mautic.core.id',
'class': 'visible-md visible-lg col-notification-id',
}) }}
</tr>
</thead>
<tbody>
{# @var \Mautic\NotificationBundle\Entity\Notification $item #}
{% for item in items %}
{% set type = item.notificationType %}
<tr>
<td>
{{ include('@MauticCore/Helper/list_actions.html.twig', {
'item': item,
'templateButtons': {
'edit': securityHasEntityAccess(permissions['notification:mobile_notifications:editown'], permissions['notification:mobile_notifications:editother'], item.createdBy),
'delete': securityHasEntityAccess(permissions['notification:mobile_notifications:deleteown'], permissions['notification:mobile_notifications:deleteother'], item.createdBy),
},
'routeBase': 'mobile_notification',
'customButtons': [
{
'attr': {
'data-toggle': 'ajaxmodal',
'data-target': '#MauticSharedModal',
'data-header': 'mautic.notification.mobile_notification.preview'|trans,
'data-footer': 'false',
'href': path('mautic_mobile_notification_action', {'objectId': item.id, 'objectAction': 'preview'}),
},
'btnText': 'mautic.notification.mobile_notification.preview'|trans,
'iconClass': 'ri-share-forward-box-fill',
},
]
}) }}
</td>
<td>
<div>
{% if 'template' == type %}
{{ include('@MauticCore/Helper/publishstatus_icon.html.twig', {'item': item, 'model': 'notification'}) }}
{% else %}
<i class="ri-fw ri-lg ri-toggle-fill text-secondary disabled"></i>
{% endif %}
<a href="{{ path('mautic_mobile_notification_action', {'objectAction': 'view', 'objectId': item.id}) }}" data-toggle="ajax">
{{ item.name }}
{% if 'list' == type %}
<span data-toggle="tooltip" title="{{ 'mautic.notification.icon_tooltip.list_notification'|trans }}"><i class="ri-fw ri-list-check"></i></span>
{% endif %}
{% if item.isTranslation() %}
<span data-toggle="tooltip" title="{{ 'mautic.core.icon_tooltip.translation'|trans }}"><i class="ri-fw ri-translate fs-14"></i></span>
{% endif %}
</a>
</div>
</td>
<td class="visible-md visible-lg">
{{ include('@MauticCore/Modules/category--expanded.html.twig', {'category': item.category}) }}
</td>
<td class="visible-sm visible-md visible-lg col-stats">
<span class="mt-xs label label-green"
data-toggle="tooltip"
title="{{ 'mautic.channel.stat.leadcount.tooltip'|trans }}">
<a href="{{ path('mautic_contact_index', {'search': 'mautic.lead.lead.searchcommand.mobile_sent'|trans ~ ':' ~ item.id}) }}">
{{- 'mautic.notification.stat.sentcount'|trans({'%count%': item.getSentCount(true)}) -}}
</a>
</span>
</td>
<td class="visible-md visible-lg">{{ item.id }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="panel-footer">
{{ include('@MauticCore/Helper/pagination.html.twig', {
'totalItems': totalItems,
'page': page,
'limit': limit,
'baseUrl': path('mautic_mobile_notification_index'),
'sessionVar': 'mobile_notification',
}) }}
</div>
{% else %}
{{ include('@MauticCore/Helper/noresults.html.twig') }}
{% endif %}

View File

@@ -0,0 +1,198 @@
{#
Variables
- notification
- trackables
- logs
- permissions
- security
- entityViews
- contacts
- dateRangeForm
#}
{% extends '@MauticCore/Default/content.html.twig' %}
{% block mauticContent %}notification{% endblock %}
{% block headerTitle %}{{ notification.name }}{% endblock %}
{% block preHeader %}
{{- include('@MauticCore/Helper/page_actions.html.twig',
{
'item' : notification,
'templateButtons' : {
'close' : securityHasEntityAccess(permissions['notification:mobile_notifications:viewown'], permissions['notification:mobile_notifications:viewother'], notification.createdBy),
},
'routeBase' : 'mobile_notification',
'targetLabel' : 'mautic.notification.mobile_notifications'|trans
}
) -}}
{{ include('@MauticCore/Modules/category--inline.html.twig', {'category': notification.category}) }}
{% endblock %}
{% block actions %}
{{- include('@MauticCore/Helper/page_actions.html.twig', {
'item': notification,
'templateButtons': {
'edit': securityHasEntityAccess(permissions['notification:mobile_notifications:editown'], permissions['notification:mobile_notifications:editother'], notification.createdBy),
'delete': permissions['notification:mobile_notifications:create'],
},
'routeBase': 'mobile_notification',
}) -}}
{% endblock %}
{% block publishStatus %}
{{ include('@MauticCore/Helper/publishstatus_badge.html.twig', {'entity': notification}, with_context=false) }}
{% set tags = [] %}
{# Translation tags #}
{% set tags = tags
|merge(notification.isTranslation and not notification.isTranslation(true)
? [{ color: 'warm-gray', label: 'mautic.core.icon_tooltip.translation' }]
: [])
|merge(notification.isTranslation(true)
? [{ color: 'warm-gray', label: 'mautic.core.translation_of'|trans({'%parent%' : translations.parent.name}), icon: 'ri-translate' }]
: [])
%}
{% include '@MauticCore/Helper/_tag.html.twig' with { tags: tags } %}
{% endblock %}
{% set translationContent = include('@MauticCore/Translation/index.html.twig',
{
'activeEntity' : notification,
'translations' : translations,
'model' : 'notifications',
'actionRoute' : 'mautic_mobile_notification_action',
}
) %}
{% set showTranslations = translationContent|trim is not empty %}
{% block content %}
<!-- start: box layout -->
<div class="box-layout">
<!-- left section -->
<div class="col-lg-9 col-md-8 height-auto">
<div>
<!-- notification detail collapseable -->
<div class="collapse pr-md pl-md" id="notification-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': notification}, with_context=false) }}
</tbody>
</table>
</div>
</div>
</div>
<!--/ notification detail collapseable -->
<!-- notification detail collapseable toggler -->
<div class="hr-expand nm">
<span data-toggle="tooltip" title="{{ 'mautic.core.details'|trans }}">
<a href="javascript:void(0)" class="arrow text-secondary collapsed" data-toggle="collapse" data-target="#notification-details"><span class="caret"></span> {{ 'mautic.core.details'|trans }}</a>
</span>
</div>
<!--/ notification detail collapseable toggler -->
<!-- some stats -->
<div class="pa-md">
<div class="row">
<div class="col-sm-12">
{% if security.isGranted('lead:leads:viewown') %}
{{ include('@MauticCore/Modules/stat--icon.html.twig', {'stats': [
{
'title': 'mautic.lead.lead.contacts.mobile_sent',
'value': notification.getSentCount(true),
'link': path('mautic_contact_index', {
'search': ('mautic.lead.lead.searchcommand.mobile_sent'|trans) ~ ':' ~ notification.id
}),
'icon': 'ri-smartphone-line'
}
]}) }}
{% endif %}
<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.core.stats'|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': entityViews, 'chartType': 'line', 'chartHeight': 300}) }}
</div>
</div>
</div>
</div>
</div>
<!--/ stats -->
<!-- tabs controls -->
<ul class="nav nav-tabs nav-tabs-contained">
<li class="active">
<a href="#clicks-container" role="tab" data-toggle="tab">
{{ 'mautic.trackable.click_counts'|trans }}
</a>
</li>
<li class="">
<a href="#contacts-container" role="tab" data-toggle="tab">
{{ 'mautic.lead.leads'|trans }}
</a>
</li>
{% if showTranslations %}
<li>
<a href="#translation-container" role="tab" data-toggle="tab">
{{ 'mautic.core.translations'|trans }}
</a>
</li>
{% endif %}
</ul>
<!--/ tabs controls -->
</div>
<!-- start: tab-content -->
<div class="tab-content pa-md">
<div class="tab-pane active bdr-w-0" id="clicks-container">
{{ include('@MauticPage/Trackable/click_counts.html.twig', {
'trackables': trackables,
'entity': notification,
'channel': 'notification',
}) }}
</div>
<div class="tab-pane fade in bdr-w-0 page-list" id="contacts-container">
{{ contacts|raw }}
</div>
{% if showTranslations %}
<div class="tab-pane bdr-w-0" id="translation-container">
{{ translationContent|raw }}
</div>
{% endif %}
</div>
<!--/ tab-content -->
</div>
<!--/ left section -->
<!-- right section -->
<div class="col-lg-3 col-md-4 height-auto">
<div class="pa-md mb-32 animation--slide-in-down">
{{ include('@MauticNotification/MobileNotification/preview.html.twig') }}
</div>
<!-- activity feed -->
{{ include('@MauticCore/Helper/recentactivity.html.twig', {'logs': logs}, with_context=false) }}
</div>
<!--/ right section -->
<input name="entityId" id="entityId" type="hidden" value="{{ notification.id|e }}" />
</div>
<!--/ end: box layout -->
{% endblock %}

View File

@@ -0,0 +1,87 @@
{#
Variables
- form
- notification
- integration (\Mautic\NotificationBundle\Integration\OneSignalIntegration)
- forceTypeSelection (optional, bool, default = false)
Only defined when editing notification
#}
{% form_theme form '@MauticNotification/FormTheme/MobileNotification/_mobile_notification_mobileSettings_widget.html.twig' %}
{% extends '@MauticCore/Default/content.html.twig' %}
{% block mauticContent %}mobile_notification{% endblock %}
{% block headerTitle %}
{% if notification.id %}
{{ 'mautic.notification.mobile.header.edit'|trans({'%name%': notification.name}) }}
{% else %}
{{ 'mautic.notification.mobile.header.new'|trans }}
{% endif %}
{% endblock %}
{% block content %}
{% set integrationSettings = integration.integrationSettings.featureSettings %}
{{ form_start(form) }}
<div class="box-layout">
<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="#notification-container" role="tab" data-toggle="tab">{{ 'mautic.core.details'|trans }}</a></li>
<li><a href="#data-notification-container" role="tab" data-toggle="tab">{{ 'mautic.notification.tab.data'|trans }}</a></li>
{% if integrationSettings.platforms is defined and 'ios' in integrationSettings.platforms %}
<li><a href="#ios-notification-container" role="tab" data-toggle="tab">{{ 'mautic.notification.tab.ios'|trans }}</a></li>
{% endif %}
{% if integrationSettings.platforms is defined and 'android' in integrationSettings.platforms %}
<li><a href="#android-notification-container" role="tab" data-toggle="tab">{{ 'mautic.notification.tab.android'|trans }}</a></li>
{% endif %}
</ul>
<!--/ tabs controls -->
<!-- tabs content -->
<div class="tab-content pa-md">
<div class="tab-pane fade in active bdr-w-0" id="notification-container">
<div class="row">
<div class="col-md-6">
{{- form_row(form.name) -}}
{{- form_row(form.heading) -}}
{{- form_row(form.url) -}}
</div>
<div class="col-md-6">{{ form_row(form.message) }}</div>
</div>
</div>
<div class="tab-pane fade in bdr-w-0" id="data-notification-container">
<div class="row">
<div class="col-md-6">{{ form_row(form.mobileSettings.additional_data) }}</div>
</div>
</div>
{% if form.mobileSettings.ios_sound is defined or form.mobileSettings.android_sound is defined %}
{{ form_widget(form.mobileSettings, {'integrationSettings': integrationSettings}) }}
{% endif %}
</div>
<!--/ tabs content -->
</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.category) }}
{{ form_row(form.language) }}
{{ form_row(form.translationParentSelector) }}
<hr />
{% include '@MauticCore/FormTheme/Fields/_utm_tags_fields.html.twig' %}
<div class="hide">
{{ form_row(form.isPublished) }}
{{ form_row(form.publishUp) }}
{{ form_row(form.publishDown) }}
{{ form_rest(form) }}
</div>
</div>
</div>
</div>
{{ form_end(form) }}
{% endblock %}

View File

@@ -0,0 +1,99 @@
{#
Variables
- searchValue
- items
- totalItems
- page
- limit
- tmpl
- permissions
- model
- 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 %}mobile_notification{% endblock %}
{% block headerTitle %}{{ 'mautic.notification.mobile_notifications'|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,
'searchId': 'mobile-notification-search',
'action': currentRoute,
'page_actions': {
'templateButtons': {
'new': permissions['notification:mobile_notifications:create'],
},
'routeBase': 'mobile_notification',
},
'bulk_actions': {
'routeBase': 'mobile_notification',
'templateButtons': {
'delete': permissions['notification:mobile_notifications:deleteown'] or permissions['notification:mobile_notifications:deleteother'],
},
},
'quickFilters': [
{
'search': 'mautic.core.searchcommand.ispublished',
'label': 'mautic.core.form.available',
'tooltip': 'mautic.core.searchcommand.ispublished.description',
'icon': 'ri-check-line'
},
{
'search': 'mautic.core.searchcommand.isunpublished',
'label': 'mautic.core.form.unavailable',
'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'
}
]
}) }}
<div class="page-list">
{% endif %}
{% if items|length > 0 %}
{{ include('@MauticNotification/MobileNotification/_list.html.twig') }}
{% else %}
{% if searchValue is not empty %}
{{- include('@MauticCore/Helper/noresults.html.twig', {'tip' : 'mautic.category.noresults.tip'}) -}}
{% 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="mt-32 mb-md">
{% include '@MauticCore/Components/pictogram.html.twig' with {
'pictogram': 'mobile',
'size': '80'
} %}
</div>
{% endset %}
{{ include('@MauticCore/Components/content-block.html.twig', {
heading: 'mautic.notification.mobile.contentblock.heading',
subheading: 'mautic.notification.mobile.contentblock.subheading',
copy: 'mautic.notification.mobile.contentblock.copy',
childContainer: childContainer
}) }}
</div>
{% endif %}
{% endif %}
{% if isIndex %}
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,47 @@
{#
some stats: need more input on what type of form data to show.
delete if it is not require
#}
<div class="pa-md">
<div class="row">
<div class="col-sm-12">
{% if showVariants %}
<div class="text-right small">
<span>
{% if isVariant %}
<span data-chart="variant">{{ 'mautic.notification.variant.graph.variant'|trans }}</span>
{% else %}
<a data-chart="variant" href="javascript:void(0)">{{ 'mautic.notification.variant.graph.variant'|trans }}</a>
{% endif %}
</span>
</span> | </span>
<span>
{% if isVariant %}
<a data-chart="all" href="javascript:void(0)">{{ 'mautic.notification.variant.graph.all'|trans }}</a>
{% else %}
<span data-chart="all">{{ 'mautic.notification.variant.graph.all'|trans }}</span>
{% endif %}
</span>
</div>
{% endif %}
<div class="panel">
<div class="panel-body box-layout">
<div class="col-xs-4 va-m">
<h5 class="text-white dark-md fw-sb mb-xs">
<span class="ri-mail-line"></span>
{{ 'mautic.notification.lead.list.comparison'|trans }}
</h5>
</div>
<div class="col-xs-8 va-m" id="legend"></div>
</div>
<div class="pt-0 pl-15 pb-10 pr-15">
<div>
<canvas id="list-compare-chart" height="300"></canvas>
</div>
</div>
<div id="list-compare-chart-data" class="hide">{{ stats|json_encode|raw }}</div>
</div>
</div>
</div>
</div>
<!--/ some stats -->

View File

@@ -0,0 +1,50 @@
{#
Variables
- notification
#}
{% set notificationWrapper %}
<div class="notification-preview">
<div class="notification-preview__body animation--grow">
<div class="notification-preview__container">
<div class="notification-preview__notification">
<span class="notification-preview__before"></span>
<header class="notification-preview__header">
<div class="notification-preview__heading tt-u">{{ configGetParameter('brand_name')|default('') }}</div>
<span class="notification-preview__timestamp">{{ 'mautic.core.now'|trans }}</span>
</header>
<div class="notification-preview__content">
<span class="notification-preview__title fw-sb">{{ notification.heading }}</span>
{% if notification.mobileSettings.ios_subtitle is defined %}
<span class="notification-preview__subtitle fw-sb">{{ notification.mobileSettings.ios_subtitle }}</span>
{% endif %}
<span class="notification-preview__message">{{ notification.message }}</span>
<span class="notification-preview__more">{{ 'mautic.notification.preview.more_notifications'|trans }}</span>
</div>
</div>
</div>
</div>
<div class="notification-preview__body">
<div class="notification-preview__container">
<div class="notification-preview__notification">
<span class="notification-preview__before" style="top: -294.15px;"></span>
</div>
</div>
</div>
<div class="notification-preview__body">
<div class="notification-preview__container">
<div class="notification-preview__notification">
<span class="notification-preview__before" style="top: -310.625px;"></span>
</div>
</div>
</div>
</div>
{% endset %}
{% if notification.url %}
<a href="{{ notification.url }}" class="notification-wrapper" target="_blank">
{{ notificationWrapper }}
</a>
{% else %}
{{ notificationWrapper }}
{% endif %}

View File

@@ -0,0 +1,31 @@
{#
some stats: need more input on what type of form data to show.
delete if it is not require
#}
<div class="pa-md">
<div class="row">
<div class="col-sm-12">
<div class="panel">
<div class="panel-body box-layout">
<div class="col-xs-4 va-m">
<h5 class="text-white dark-md fw-sb mb-xs">
<span class="ri-mail-line"></span>
{{ 'mautic.notification.stats'|trans }}
</h5>
</div>
<div class="col-xs-6 va-m" id="legend"></div>
<div class="col-xs-2 va-m">
{{ include('@MauticCore/Helper/graph_dateselect.html.twig', {'callback': 'updateNotificationStatsChart'}) }}
</div>
</div>
<div class="pt-0 pl-15 pb-10 pr-15">
<div>
<canvas id="stat-chart" height="300"></canvas>
</div>
</div>
<div id="stat-chart-data" class="hide">{{ stats|json_encode|raw }}</div>
</div>
</div>
</div>
</div>
<!--/ some stats -->

View File

@@ -0,0 +1,120 @@
{#
Variables
- searchValue
- items
- totalItems
- page
- limit
- tmpl
- permissions
- model
- security
#}
{% if items|length > 0 %}
<div class="table-responsive">
<table class="table table-hover notification-list">
<thead>
<tr>
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'checkall': 'true',
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'notification',
'orderBy': 'e.name',
'text': 'mautic.core.name',
'class': 'col-notification-name',
'default': true,
}) }}
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'notification',
'orderBy': 'c.title',
'text': 'mautic.core.category',
'class': 'visible-md visible-lg col-notification-category',
}) }}
<th class="visible-sm visible-md visible-lg col-notification-stats">{{ 'mautic.core.stats'|trans }}</th>
{{ include('@MauticCore/Helper/tableheader.html.twig', {
'sessionVar': 'notification',
'orderBy': 'e.id',
'text': 'mautic.core.id',
'class': 'visible-md visible-lg col-notification-id',
}) }}
</tr>
</thead>
<tbody>
{# @var \Mautic\NotificationBundle\Entity\Notification $item #}
{% for item in items %}
{% set type = item.notificationType %}
<tr>
<td>
{{ include('@MauticCore/Helper/list_actions.html.twig', {
'item': item,
'templateButtons': {
'edit': securityHasEntityAccess(permissions['notification:notifications:editown'], permissions['notification:notifications:editother'], item.createdBy),
'delete': securityHasEntityAccess(permissions['notification:notifications:deleteown'], permissions['notification:notifications:deleteother'], item.createdBy),
},
'routeBase': 'notification',
'customButtons': [
{
'attr': {
'data-toggle': 'ajaxmodal',
'data-target': '#MauticSharedModal',
'data-header': 'mautic.notification.notification.header.preview'|trans,
'data-footer': 'false',
'href': path('mautic_notification_action', {'objectId': item.id, 'objectAction': 'preview'}),
},
'btnText': 'mautic.notification.preview'|trans,
'iconClass': 'ri-share-forward-box-fill',
},
],
}) }}
</td>
<td>
<div>
{% if 'template' == type %}
{{ include('@MauticCore/Helper/publishstatus_icon.html.twig', {'item': item, 'model': 'notification'}) }}
{% else %}
<i class="ri-fw ri-lg ri-toggle-fill text-secondary disabled"></i>
{% endif %}
<a href="{{ path('mautic_notification_action', {'objectAction': 'view', 'objectId': item.id}) }}" data-toggle="ajax">
{{ item.name }}
{% if 'list' == type %}
<span data-toggle="tooltip" title="{{ 'mautic.notification.icon_tooltip.list_notification'|trans }}"><i class="ri-fw ri-list-check"></i></span>
{% endif %}
</a>
{{ customContent('notification.name', _context) }}
</div>
</td>
<td class="visible-md visible-lg">
{{ include('@MauticCore/Modules/category--expanded.html.twig', {'category': item.category}) }}
</td>
<td class="visible-sm visible-md visible-lg col-stats">
<span class="mt-xs label label-green"
data-toggle="tooltip"
title="{{ 'mautic.channel.stat.leadcount.tooltip'|trans }}">
<a href="{{ path('mautic_contact_index', {'search': 'mautic.lead.lead.searchcommand.web_sent'|trans ~ ':' ~ item.id}) }}">
{{- 'mautic.notification.stat.sentcount'|trans({'%count%': item.getSentCount(true)}) -}}
</a>
</span>
</td>
<td class="visible-md visible-lg">{{ item.id }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="panel-footer">
{{ include('@MauticCore/Helper/pagination.html.twig', {
'totalItems': totalItems,
'page': page,
'limit': limit,
'baseUrl': path('mautic_notification_index'),
'sessionVar': 'notification',
}) }}
</div>
{% else %}
{{ include('@MauticCore/Helper/noresults.html.twig') }}
{% endif %}

View File

@@ -0,0 +1,159 @@
{#
Variables
- notification
- trackables
- logs
- permissions
- security
- entityViews
- contacts
- dateRangeForm
#}
{% extends '@MauticCore/Default/content.html.twig' %}
{% block mauticContent %}notification{% endblock %}
{% block headerTitle %}{{ notification.name }}{% endblock %}
{% block preHeader %}
{{- include('@MauticCore/Helper/page_actions.html.twig',
{
'item' : notification,
'templateButtons' : {
'close' : securityHasEntityAccess(permissions['notification:notifications:viewown'], permissions['notification:notifications:viewother'], notification.createdBy),
},
'routeBase' : 'notification',
'targetLabel' : 'mautic.notification.notifications'|trans
}
) -}}
{{ include('@MauticCore/Modules/category--inline.html.twig', {'category': notification.category}) }}
{% endblock %}
{% block actions %}
{{- include('@MauticCore/Helper/page_actions.html.twig', {
'item': notification,
'templateButtons': {
'edit': securityHasEntityAccess(permissions['notification:notifications:editown'], permissions['notification:notifications:editother'], notification.createdBy),
'delete': permissions['notification:notifications:create'],
},
'routeBase': 'notification',
}) -}}
{% endblock %}
{% block publishStatus %}
{{ include('@MauticCore/Helper/publishstatus_badge.html.twig', {'entity': notification}) }}
{% endblock %}
{% block content %}
<!-- start: box layout -->
<div class="box-layout">
<!-- left section -->
<div class="col-md-9 height-auto">
<div>
<!-- notification detail collapseable -->
<div class="collapse pr-md pl-md" id="notification-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': notification}) }}
</tbody>
</table>
</div>
</div>
</div>
<!--/ notification detail collapseable -->
<!-- notification detail collapseable toggler -->
<div class="hr-expand nm">
<span data-toggle="tooltip" title="{{ 'mautic.core.details'|trans }}">
<a href="javascript:void(0)" class="arrow text-secondary collapsed" data-toggle="collapse" data-target="#notification-details">
<span class="caret"></span>
{{ 'mautic.core.details'|trans }}
</a>
</span>
</div>
<!--/ notification detail collapseable toggler -->
<!-- some stats -->
<div class="pa-md">
<div class="row">
<div class="col-sm-12">
{% if security.isGranted('lead:leads:viewown') %}
{{ include('@MauticCore/Modules/stat--icon.html.twig', {'stats': [
{
'title': 'mautic.lead.lead.contacts.web_sent',
'value': notification.getSentCount(true),
'link': path('mautic_contact_index', {
'search': ('mautic.lead.lead.searchcommand.web_sent'|trans) ~ ':' ~ notification.id
}),
'icon': 'ri-notification-3-line'
}
]}) }}
{% endif %}
<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.core.stats'|trans }}
</h5>
</div>
<div class="col-md-9 va-m">
{{ include('@MauticCore/Helper/graph_dateselect.html.twig', {'dateRangeForm': dateRangeForm, 'class': 'pull-right'}, with_context=false) }}
</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': entityViews, 'chartType': 'line', 'chartHeight': 300}, with_context=false) }}
</div>
</div>
</div>
</div>
</div>
<!--/ stats -->
{{ customContent('details.stats.graph.below', _context) }}
<!-- tabs controls -->
<ul class="nav nav-tabs nav-tabs-contained">
<li class="active">
<a href="#clicks-container" role="tab" data-toggle="tab">
{{ 'mautic.trackable.click_counts'|trans }}
</a>
</li>
<li class="">
<a href="#contacts-container" role="tab" data-toggle="tab">
{{ 'mautic.lead.leads'|trans }}
</a>
</li>
</ul>
<!--/ tabs controls -->
</div>
<!-- start: tab-content -->
<div class="tab-content pa-md">
<div class="tab-pane active bdr-w-0" id="clicks-container">
{{ include('@MauticPage/Trackable/click_counts.html.twig', {
'trackables': trackables,
'entity': notification,
'channel': 'notification'
}) }}
</div>
<div class="tab-pane fade in bdr-w-0 page-list" id="contacts-container">
{{ contacts|purify }}
</div>
</div>
<!--/ tab-content -->
</div>
<!--/ left section -->
<!-- right section -->
<div class="col-md-3 bdr-l height-auto">
<!-- activity feed -->
{{ include('@MauticCore/Helper/recentactivity.html.twig', {'logs': logs}) }}
</div>
<!--/ right section -->
<input name="entityId" id="entityId" type="hidden" value="{{ notification.id|e }}" />
</div>
<!--/ end: box layout -->
{% endblock %}

View File

@@ -0,0 +1,63 @@
{#
Variables
- form
- notification
- forceTypeSelection (optional, bool, default=false)
This will be defined when the notification entity is being edited
#}
{% extends '@MauticCore/Default/content.html.twig' %}
{% block mauticContent %}notification{% endblock %}
{% block headerTitle %}
{% if notification.id %}
{{ 'mautic.notification.header.edit'|trans({'%name%': notification.name}) }}
{% else %}
{{ 'mautic.notification.header.new'|trans }}
{% endif %}
{% endblock %}
{% block content %}
{{ form_start(form) }}
<div class="box-layout">
<div class="col-md-9 height-auto">
<div class="row">
<div class="col-xs-12">
<div class="tab-content pa-md">
<div class="tab-pane fade in active bdr-w-0" id="notification-container">
<div class="row">
<div class="col-md-6">
{{ form_row(form.name) }}
{{ form_row(form.heading) }}
{{ form_row(form.message) }}
{{ form_row(form.url) }}
{{ form_row(form.button) }}
</div>
<div class="col-md-6">
{{ include('@MauticNotification/Notification/preview.html.twig', {
'notification': notification,
}, with_context=false) }}
</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.category) }}
{{ form_row(form.language) }}
<hr />
{% include '@MauticCore/FormTheme/Fields/_utm_tags_fields.html.twig' %}
<div class="hide">
{{ form_row(form.isPublished) }}
{{ form_row(form.publishUp) }}
{{ form_row(form.publishDown) }}
{{ form_rest(form) }}
</div>
</div>
</div>
</div>
{{ form_end(form) }}
{% endblock %}

View File

@@ -0,0 +1,99 @@
{#
Variables
- searchValue
- items
- totalItems
- page
- limit
- tmpl
- permissions
- model
- 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 %}notification{% endblock %}
{% block headerTitle %}{{ 'mautic.notification.notifications'|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,
'searchId': 'notification-search',
'action': currentRoute,
'page_actions': {
'templateButtons': {
'new': permissions['notification:notifications:create'],
},
'routeBase': 'notification',
},
'bulk_actions': {
'routeBase': 'notification',
'templateButtons': {
'delete': permissions['notification:notifications:deleteown'] or permissions['notification:notifications:deleteother'],
},
},
'quickFilters': [
{
'search': 'mautic.core.searchcommand.ispublished',
'label': 'mautic.core.form.available',
'tooltip': 'mautic.core.searchcommand.ispublished.description',
'icon': 'ri-check-line'
},
{
'search': 'mautic.core.searchcommand.isunpublished',
'label': 'mautic.core.form.unavailable',
'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'
}
]
}) }}
<div class="page-list">
{% endif %}
{% if items|length > 0 %}
{{ include('@MauticNotification/Notification/_list.html.twig') }}
{% else %}
{% if searchValue is not empty %}
{{- include('@MauticCore/Helper/noresults.html.twig', {'tip' : 'mautic.category.noresults.tip'}) -}}
{% 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="mt-32 mb-md">
{% include '@MauticCore/Components/pictogram.html.twig' with {
'pictogram': 'websites',
'size': '80'
} %}
</div>
{% endset %}
{{ include('@MauticCore/Components/content-block.html.twig', {
heading: 'mautic.notification.contentblock.heading',
subheading: 'mautic.notification.contentblock.subheading',
copy: 'mautic.notification.contentblock.copy',
childContainer: childContainer
}) }}
</div>
{% endif %}
{% endif %}
{% if isIndex %}
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,48 @@
{#
some stats: need more input on what type of form data to show.
delete if it is not require
#}
<!-- some stats -->
<div class="pa-md">
<div class="row">
<div class="col-sm-12">
{% if showVariants %}
<div class="text-right small">
<span>
{% if isVariant %}
<span data-chart="variant">{{ 'mautic.notification.variant.graph.variant'|trans }}</span>
{% else %}
<a data-chart="variant" href="javascript:void(0)">{{ 'mautic.notification.variant.graph.variant'|trans }}</a>
{% endif %}
</span>
</span> | </span>
<span>
{% if isVariant %}
<a data-chart="all" href="javascript:void(0)">{{ 'mautic.notification.variant.graph.all'|trans }}</a>
{% else %}
<span data-chart="all">{{ 'mautic.notification.variant.graph.all'|trans }}</span>
{% endif %}
</span>
</div>
{% endif %}
<div class="panel">
<div class="panel-body box-layout">
<div class="col-xs-4 va-m">
<h5 class="text-white dark-md fw-sb mb-xs">
<span class="ri-mail-line"></span>
{{ 'mautic.notification.lead.list.comparison'|trans }}
</h5>
</div>
<div class="col-xs-8 va-m" id="legend"></div>
</div>
<div class="pt-0 pl-15 pb-10 pr-15">
<div>
<canvas id="list-compare-chart" height="300"></canvas>
</div>
</div>
<div id="list-compare-chart-data" class="hide">{{ stats|json_encode|raw }}</div>
</div>
</div>
</div>
</div>
<!--/ some stats -->

View File

@@ -0,0 +1,35 @@
{#
Variables
- notification (\Mautic\NotificationBundle\Entity\Notification)
#}
<label>Preview</label>
<div id="notification-preview" class="panel panel-default">
<div class="panel-body">
<div class="row">
<div class="icon height-auto text-center">
<span class="ri-notification-3-fill fs-48"></span>
</div>
<div class="text height-auto">
<h4>
{%- if notification.heading -%}
{{- notification.heading -}}
{%- else -%}
Your notification header
{%- endif -%}
</h4>
<p>
{%- if notification.message %}
{{- notification.message -}}
{%- else -%}
The message body of your notification
{%- endif -%}
</p>
<span>{{ app.request.server.get('HTTP_HOST') }}</span>
</div>
</div>
{% if notification.url and notification.button %}
<hr>
<a href="{{ notification.url }}">{{ notification.button }}</a>
{% endif %}
</div>
</div>

View File

@@ -0,0 +1,32 @@
{#
some stats: need more input on what type of form data to show.
delete if it is not require
#}
<!-- 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-xs-4 va-m">
<h5 class="text-white dark-md fw-sb mb-xs">
<span class="ri-mail-line"></span>
{{ 'mautic.notification.stats'|trans }}
</h5>
</div>
<div class="col-xs-6 va-m" id="legend"></div>
<div class="col-xs-2 va-m">
{{ include('@MauticCore/Helper/graph_dateselect.html.twig', {'callback': 'updateNotificationStatsChart'}) }}
</div>
</div>
<div class="pt-0 pl-15 pb-10 pr-15">
<div>
<canvas id="stat-chart" height="300"></canvas>
</div>
</div>
<div id="stat-chart-data" class="hide">{{ stats|json_encode|raw }}</div>
</div>
</div>
</div>
</div>
<!--/ some stats -->

View File

@@ -0,0 +1,214 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Mautic</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="icon" type="image/x-icon" href="{{ getOverridableUrl('images/favicon.ico') }}" />
<link rel="icon" sizes="192x192" href="{{ getOverridableUrl('images/favicon.ico') }}">
<link rel="apple-touch-icon" href="{{ getOverridableUrl('images/apple-touch-icon.png') }}" />
{{ outputStyles() }}
<script src="/app/bundles/NotificationBundle/Assets/js/popup/usparser.min.js" type="text/javascript"></script>
</head>
<body>
<!-- Directions -->
<!-- overlay -->
<div id="black-wrapper">
</div>
<div id="white-wrapper">
</div>
<div id="mobile">
<div id="mobile-top-section">
<div id="mobile-top-section-wrapper">
<div id="mobile-top-section-content">
<div class="title domainName">This website</div>
<p id="mobile-directions">wants to show notifications:</p>
<div style="display: none;" id="mobile-notification">
<img id="mobile-notification-icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDdBOEVEMjU3RTgwMTFFNUIzMjFCOUQ0QjUzN0Q0NDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDdBOEVEMjY3RTgwMTFFNUIzMjFCOUQ0QjUzN0Q0NDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDODdGODRDMDdEMTMxMUU1QjMyMUI5RDRCNTM3RDQ0NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEN0E4RUQyNDdFODAxMUU1QjMyMUI5RDRCNTM3RDQ0NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pttyb1cAAACySURBVHja7N2xDUMhDEBBO0rJ33++SNkAJKqET1YwTYp7hUV9smtyzvmKiCtUqecG/OzHg0Wp7w9ucCg3bN5hAAECBAhQAAECBCiAAAECFECAAAEKIECAAAUQIECAAggQIEABBAgQoAACBAhQZ4CZSe4EcK1FzgkDBAhQAAECBAhQAAECBCiAAAECFECAAAEKIECAAAUQIECAAggQIEABBPivgA1Dufbc4x2+w6jWbwEGAJZEES0DZiYyAAAAAElFTkSuQmCC">
<p id="mobile-notification-title" class="truncatable long desktop message">Example Notification</p>
<p id="mobile-notification-message" class="truncatable short desktop message">Notifications will appear on your device</p>
<p id="mobile-notification-url" class="truncatable short desktop message">{{ siteUrl }}</p>
</div>
<div id="desktop-notification">
<img id="desktop-notification-icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDdBOEVEMjU3RTgwMTFFNUIzMjFCOUQ0QjUzN0Q0NDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDdBOEVEMjY3RTgwMTFFNUIzMjFCOUQ0QjUzN0Q0NDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDODdGODRDMDdEMTMxMUU1QjMyMUI5RDRCNTM3RDQ0NiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpEN0E4RUQyNDdFODAxMUU1QjMyMUI5RDRCNTM3RDQ0NiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pttyb1cAAACySURBVHja7N2xDUMhDEBBO0rJ33++SNkAJKqET1YwTYp7hUV9smtyzvmKiCtUqecG/OzHg0Wp7w9ucCg3bN5hAAECBAhQAAECBCiAAAECFECAAAEKIECAAAUQIECAAggQIEABBAgQoAACBAhQZ4CZSe4EcK1FzgkDBAhQAAECBAhQAAECBCiAAAECFECAAAEKIECAAAUQIECAAggQIEABBPivgA1Dufbc4x2+w6jWbwEGAJZEES0DZiYyAAAAAElFTkSuQmCC">
<p id="x">x</p>
<p id="desktop-notification-title" class="truncatable mobile message">This is an example notification</p>
<p id="desktop-notification-message" class="truncatable mobile message">Notifications will appear on your desktop</p>
<p id="desktop-notification-url" class="truncatable mobile message">{{ siteUrl }}</p>
</div>
<p id="mobile-opt-out" class="truncatable opt-out message">(you can unsubscribe anytime in your browser settings)</p>
</div>
</div>
</div>
</div>
<div id="error-box">
<div id="error-message-padding">
<!-- if on ios -->
<div class="error" id="ios">
<p> Web Push Notifications are not supported by iOS. </p>
</div>
<!-- if not on chrome (Desktop) -->
<div class="error" id="not-chrome-desktop">
<p> Web Push Notifications are not supported by your browser. Please install
<a class="default-link" href="https://www.google.com/chrome/browser/desktop" target="_blank">Chrome</a> to get
notifications. </p>
</div>
<!-- if not on chrome (Android) -->
<div class="error" id="not-chrome-Android">
<p> Please install Chrome web browser to get notifications. </p>
<p><a class="default-link" href="https://play.google.com/store/apps/details?id=com.android.chrome">Tap here</a> to
download from the Google Play Store.</p>
</div>
<!-- not have latest version of chrome (desktop) -->
<div class="error" id="outdated-chrome-desktop">
<p> Please update your Chrome web browser to get notifications. </p>
</div>
<!-- not have latest version of chrome (mobile) -->
<div class="error" id="outdated-chrome-mobile">
<p> Please update your Chrome web browser to get notifications. </p>
<p><a class="default-link" href="https://play.google.com/store/apps/details?id=com.android.chrome">Tap here</a> to
download from the Google Play Store.</p>
</div>
<!-- if notifications are disabled (desktop)-->
<div class="error" id="disabled-notifications-desktop">
<p> Notifications are currently disabled.</p>
<p>Please re-enable them by clicking on the lock icon in the top left of this window. </p>
</div>
<!-- if notifications are disabled (mobile) -->
<div class="error" id="disabled-notifications-mobile">
<p> Notifications are currently disabled.</p>
<p>Please re-enable them by tapping on the lock icon on the top left. </p>
</div>
<!-- if notifications are already enabled -->
<div class="error" id="notifications-already-enabled">
<p> Notifications are already enabled, you may close this window. </p>
<p style="font-size: 12px">If you would like to unsubscribe from all notifications from
<span class="domainName">{{ siteUrl }}</span> click on the lock icon to the left of the address. </p>
</div>
</div>
</div>
<script>
/* returns true if device is mobile or tablet */
function detectmob() {
return navigator.userAgent.match(/Android|webOS|iPhone|iPad|iPod|BlackBerry|Windows Phone/i) != null;
}
/* show mobile example notification on mobile, desktop notification on desktop */
if (detectmob()) {
document.getElementById("desktop-notification").style.display = 'none';
} else {
document.getElementById("mobile-notification").style.display = "none";
}
/* ERROR MESSAGES */
/* instantiate parser */
var parser = new UAParser();
var isHttpsPrompt = false;
// get the UA string result
var result = parser.getResult();
// get user agent info
var browser = result.browser.name;
var browser_version = result.browser.version;
var os = result.os.name;
var engine = result.engine.name;
if (OneSignal.isPushNotificationsSupported());
else if (os == "iOS")
showError("ios");
else if (browser != "Chrome") {
if (os == "Android")
showError("not-chrome-Android");
else
showError("not-chrome-desktop");
} // TODO: Show generic error if SDK reports push notifications not supported.
else { // They are on Chrome
if (parseInt(browser_version.substring(0, 2)) < 42) // Check Chrome version
showError(detectmob() ? "outdated-chrome-mobile" : "outdated-chrome-desktop");
else if (isHttpsPrompt) {
if (!isPushEnabled) {
if (isPermissionBlocked)
showError(detectmob() ? "disabled-notifications-mobile" : "disabled-notifications-desktop");
} else
showError("notifications-already-enabled");
} else { // HTTP
if (Notification.permission == "denied") // Check if the Notification permission is disabled.
showError(detectmob() ? "disabled-notifications-mobile" : "disabled-notifications-desktop");
else if (Notification.permission == "granted") {
navigator.serviceWorker.ready.then(function (event) {
if (event) {
OneSignal.getIdsAvailable(function (ids) {
if (ids.registrationId != null) {
OneSignal._getSubscription(function (isSet) {
if (isSet)
showError("notifications-already-enabled");
});
}
});
}
});
}
}
}
if (!isHttpsPrompt) {
if (Notification.permission == "denied") // Check if the Notification permission is disabled.
showError(detectmob() ? "disabled-notifications-mobile" : "disabled-notifications-desktop");
else if (Notification.permission == "granted") {
OneSignal._initOptions = {};
(OneSignal.isPushNotificationsEnabled(function (enabled) {
if (enabled) {
showError("notifications-already-enabled");
}
}));
}
} else {
if (isPermissionBlocked) // Check if the Notification permission is disabled.
showError(detectmob() ? "disabled-notifications-mobile" : "disabled-notifications-desktop");
else if (isPushEnabled) {
showError("notifications-already-enabled");
}
}
function showError(error) {
// put a white overlay over all existing content
// this also disables all functionality
document.getElementById("white-wrapper").style.zIndex = "10";
document.getElementById("white-wrapper").style.opacity = ".75";
document.getElementById("error-box").style.opacity = "1";
document.getElementById("error-box").style.display = "block";
document.getElementById(error).style.display = "block";
}
</script>
</body></html>

View File

@@ -0,0 +1,16 @@
{% if showMore is defined %}
<a href="{{ url('mautic_mobile_notification_index', {'search': searchString}) }}" data-toggle="ajax">
<span>{{ 'mautic.core.search.more'|trans({'%count%': remaining}) }}</span>
</a>
{% else %}
<a href="{{ url('mautic_mobile_notification_action', {'objectAction': 'edit', 'objectId': item.id}) }}" data-toggle="ajax">
<span class="fw-sb">{{ item.name }}</span>
<span class="ml-4 mr-sm">#{{ item.id }}</span>
{{- include('@MauticCore/Helper/publishstatus_badge.html.twig', {
'entity': item,
'status': 'active',
'simplified': 'true'
}) -}}
</a>
<div class="clearfix"></div>
{% endif %}

View File

@@ -0,0 +1,16 @@
{% if showMore is defined %}
<a href="{{ url('mautic_notification_index', {'search': searchString}) }}" data-toggle="ajax">
<span>{{ 'mautic.core.search.more'|trans({'%count%': remaining}) }}</span>
</a>
{% else %}
<a href="{{ url('mautic_notification_action', {'objectAction': 'view', 'objectId': item.id}) }}" data-toggle="ajax">
<span class="fw-sb">{{ item.name }}</span>
<span class="ml-4 mr-sm">#{{ item.id }}</span>
{{- include('@MauticCore/Helper/publishstatus_badge.html.twig', {
'entity': item,
'status': 'active',
'simplified': 'true'
}) -}}
</a>
<div class="clearfix"></div>
{% endif %}

View File

@@ -0,0 +1,19 @@
{#
Variables
- event
#}
{%- set data = event.extra.log.metadata -%}
{%- if data.failed is not defined -%}
<dl class="dl-horizontal">
<dt>{{ 'mautic.notification.timeline.status'|trans }}</dt>
<dd>{{ data.status|trans }}</dd>
<dt>{{ 'mautic.notification.timeline.type'|trans }}</dt>
<dd>{{ data.type|trans }}</dd>
</dl>
<div class="small">
<hr />
<strong>{{ data.heading }}</strong>
<br />
{{ data.content }}
</div>
{%- endif -%}