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,23 @@
{% block _config_smsconfig_widget %}
<h4 class="fw-sb mt-48 mb-xs">{{ 'mautic.config.tab.smsconfig'|trans }}</h4>
<div class="text-muted small pb-md">{{ 'mautic.core.config.header.smsconfig.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">
{% if form.sms_transport.vars.choices|length %}
{{ form_row(form.sms_transport) }}
{% else %}
{{ 'mautic.sms.config.smsconfig'|trans }}
{% endif %}
</div>
<hr>
<div class="col-xs-12">
{{ form_row(form.sms_disable_trackable_urls) }}
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

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

View File

@@ -0,0 +1,230 @@
{% if not isEmbedded %}
{% extends '@MauticCore/Default/content.html.twig' %}
{% endif %}
{% block mauticContent %}sms{% endblock %}
{% block headerTitle %}{{sms.getName()}}{% endblock %}
{% block preHeader %}
{{- include('@MauticCore/Helper/page_actions.html.twig',
{
'item' : sms,
'templateButtons' : {
'close' : securityHasEntityAccess(
permissions['sms:smses:viewown'],
permissions['sms:smses:viewother'],
sms.getCreatedBy()
),
},
'routeBase' : 'sms',
'targetLabel': 'mautic.sms.smses'|trans
}
) -}}
{{ include('@MauticCore/Modules/category--inline.html.twig', {'category': sms.category}) }}
{{ include('@MauticProject/Modules/projects.html.twig', {'item': sms}) }}
{% endblock %}
{% block actions %}
{% set customButtons = [] %}
{{- include('@MauticCore/Helper/page_actions.html.twig',
{
'item' : sms,
'customButtons' : customButtons is defined ? customButtons : [],
'templateButtons' : {
'edit' : securityHasEntityAccess(
permissions['sms:smses:editown'],
permissions['sms:smses:editother'],
sms.getCreatedBy()
),
'clone' : permissions['sms:smses:create'],
'delete' : securityHasEntityAccess(
permissions['sms:smses:deleteown'],
permissions['sms:smses:deleteother'],
sms.getCreatedBy()
),
},
'routeBase' : 'sms',
}
) -}}
{% endblock %}
{% block publishStatus %}
{{- include('@MauticCore/Helper/publishstatus_badge.html.twig', {
'entity': sms,
'status': sms.getPublishUp() is not null ? 'sending' : 'available'
}) -}}
<div class="label__divider"></div>
{% set tags = [
{
color: 'warm-gray',
label: smsType == 'list'
? 'mautic.sms.type.list.header'
: (smsType == 'template' ? 'mautic.sms.type.template.header' : type)
}
] %}
{# Translation tags #}
{% set tags = tags
|merge(sms.isTranslation and not sms.isTranslation(true)
? [{ color: 'warm-gray', label: 'mautic.core.icon_tooltip.translation' }]
: [])
|merge(sms.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 smsType = sms.getSmsType() %}
{% if smsType is empty %}
{% set smsType = 'template' %}
{% endif %}
{% set translationContent = include('@MauticCore/Translation/index.html.twig',
{
'activeEntity' : sms,
'translations' : translations,
'model' : 'sms',
'actionRoute' : 'mautic_sms_action',
}
) %}
{% set showTranslations = translationContent|trim is not empty %}
{% block content %}
<!-- start: box layout -->
<div class="box-layout">
<!-- left section -->
<div class="col-md-7 col-lg-9 height-auto">
<div>
<!-- page detail header -->
<!-- sms detail collapseable toggler -->
<div class="collapse pr-md pl-md" id="sms-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' : sms}) -}}
{% if sms.getSmsType() == 'list' %}
<tr>
<td width="20%"><span class="fw-b textTitle">{{ 'mautic.lead.lead.lists'|trans }}</span></td>
<td>
{% set segments = sms.getLists %}
{% set segmentNames = segments.toArray|map(segment => segment.getName) %}
{{ segmentNames|join(', ') }}
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</div>
</div>
<!--/ sms detail collapseable toggler -->
<div>
<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="#sms-details">
<span class="caret"></span> {{ 'mautic.core.details'|trans }}
</a>
</span>
</div>
<!-- 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.sms_sent',
'value': sms.sentCount,
'link': path('mautic_contact_index', {
'search': ('mautic.lead.lead.searchcommand.sms_sent'|trans) ~ ':' ~ sms.id
}),
'icon': 'ri-message-2-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 -->
{{ 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>
{% 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' : sms,
'channel' : 'sms'
}) -}}
</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>
<!-- end: tab-content -->
</div>
<!--/ left section -->
<!-- right section -->
<div class="col-md-5 col-lg-3 height-auto">
<!-- activity feed -->
<div class="mb-48" style="zoom: 0.8;">{{ include('@MauticSms/Sms/preview.html.twig') }}</div>
{{- include('@MauticCore/Helper/recentactivity.html.twig', {'logs' : logs}) -}}
</div>
<!--/ right section -->
<input name="entityId" id="entityId" type="hidden" value="{{ sms.getId() }}" />
</div>
<!--/ end: box layout -->
{% endblock %}

View File

@@ -0,0 +1,83 @@
{% extends '@MauticCore/FormTheme/form_simple.html.twig' %}
{% form_theme form with [
'@MauticSms/FormTheme/SmsSendList/smssend_list_row.html.twig'
] %}
{% block mauticContent %}sms{% endblock %}
{# @var sms \Mautic\SmsBundle\Entity\Sms #}
{% set type = sms.getSmsType() %}
{% set isExisting = sms.getId() %}
{% set translationBase = 'mautic.sms' %}
{% set mauticContent = 'sms' %}
{% block primaryFormContent %}
<div class="row">
<div class="col-md-6">
{{ form_row(form.name) }}
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="characters-count">
<label class="control-label" for="" data-toggle="tooltip" data-container="body" data-placement="top" title="" data-original-title="{{ 'mautic.sms.form.nbcharacter.infobox'|trans }}">
{{ 'mautic.sms.form.nbcharacter.counter'|trans }}
<span size="sm" class="label label-gray" id="sms_nb_char">0</span>
</label>
</div>
{{ form_row(form.message) }}
<i class="text-secondary">{{ 'mautic.sms.token.dropdown.hint'|trans|purify }}</i>
</div>
</div>
{% endblock %}
{% block rightFormContent %}
{{ form_row(form.category) }}
{{ form_row(form.projects) }}
{{ form_row(form.language) }}
{{ form_row(form.translationParentSelector) }}
{{ form_row(form.isPublished, {
'attr': {
'data-none': 'mautic.core.form.sending_paused',
'data-start': 'mautic.core.form.sending_on_scheduled_start',
'data-both': 'mautic.core.form.sending_during_scheduled_period',
'data-end': 'mautic.core.form.available_until_scheduled_end'
}
}) }}
<div id="leadList"{% if 'template' == type %} class="hide"{% endif %}>
{{ form_row(form.lists) }}
{{ form_row(form.publishUp, {'label': 'mautic.core.form.sending.start_at'}) }}
{{ form_row(form.publishDown, {'label': 'mautic.core.form.sending.stop_at'}) }}
</div>
<div class="hide">
{{ form_rest(form) }}
</div>
{% if (updateSelect is not defined or updateSelect is empty) and not isExisting and not formContainsErrors(form) or type is empty %}
{{- include('@MauticCore/Helper/form_selecttype.html.twig',
{
'item' : sms,
'mauticLang' : {
'newListSms' : 'mautic.sms.type.list.header',
'newTemplateSms' : 'mautic.sms.type.template.header',
},
'typePrefix' : 'sms',
'cancelUrl' : 'mautic_sms_index',
'header' : 'mautic.sms.type.header',
'typeOneHeader' : 'mautic.sms.type.template.header',
'typeOnePictogram': 'process--automation',
'typeOneTag' : 'mautic.sms.type.template.tag',
'typeOneDifferences' : ['mautic.sms.type.template.differences.1st', 'mautic.sms.type.template.differences.2nd', 'mautic.sms.type.template.differences.3rd', 'mautic.sms.type.template.differences.4th', 'mautic.sms.type.template.differences.5th'],
'typeOneOnClick' : "Mautic.selectSmsType('template');",
'typeTwoHeader' : 'mautic.sms.type.list.header',
'typeTwoTag' : 'mautic.sms.type.list.tag',
'typeTwoPictogram': 'chart--pie',
'typeTwoDifferences' : ['mautic.sms.type.list.differences.1st', 'mautic.sms.type.list.differences.2nd', 'mautic.sms.type.list.differences.3rd', 'mautic.sms.type.list.differences.4th', 'mautic.sms.type.list.differences.5th'],
'typeTwoOnClick' : "Mautic.selectSmsType('list');",
}
) -}}
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,26 @@
{% extends '@MauticCore/Default/content.html.twig' %}
{% block mauticContent %}sms{% endblock %}
{% block headerTitle %}{{ 'mautic.sms.smses'|trans }}{% endblock %}
{% block actions %}
{{- include('@MauticCore/Helper/page_actions.html.twig',
{
'templateButtons' : {
'new' : permissions['sms:smses:create'],
},
'routeBase' : 'sms',
}
) -}}
{% endblock %}
{% block content %}
<div id="page-list-wrapper" class="panel panel-default">
{{- include('@MauticCore/Helper/list_toolbar.html.twig', {
'searchValue' : searchValue,
'searchId' : 'sms-search',
'action' : currentRoute,
}) -}}
<div class="page-list">
{{ block('listResults') }}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,218 @@
{% set isIndex = tmpl == 'index' ? true : false %}
{% set tmpl = 'list' %}
{% extends isIndex ? '@MauticCore/Default/content.html.twig' : '@MauticCore/Default/raw_output.html.twig' %}
{% block mauticContent %}sms{% endblock %}
{% block headerTitle %}{{ 'mautic.sms.smses'|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': 'sms-search',
'action': currentRoute,
'page_actions': {
'templateButtons': {
'new': permissions['sms:smses:create']
},
'routeBase': 'sms'
},
'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">
{{ block('listResults') }}
</div>
</div>
{{ include('@MauticCore/Modules/protip.html.twig', {
tip: random(['mautic.protip.sms.concise', 'mautic.protip.sms.timesensitive', 'mautic.protip.sms.compliance'])
}) }}
{% else %}
{{ block('listResults') }}
{% endif %}
{% endblock %}
{% block listResults %}
{% if items|length > 0 %}
<div class="table-responsive">
<table class="table table-hover sms-list">
<thead>
<tr>
{{- include(
'@MauticCore/Helper/tableheader.html.twig',
{
'checkall' : 'true',
'routeBase' : 'sms',
'templateButtons' : {
'delete' : permissions['sms:smses:deleteown'] or permissions['sms:smses:deleteother'],
}
}
) -}}
{{- include(
'@MauticCore/Helper/tableheader.html.twig',
{
'sessionVar' : 'sms',
'orderBy' : 'e.name',
'text' : 'mautic.core.name',
'class' : 'col-sms-name',
'default' : true,
}
) -}}
{{- include(
'@MauticCore/Helper/tableheader.html.twig',
{
'sessionVar' : 'sms',
'orderBy' : 'c.title',
'text' : 'mautic.core.category',
'class' : 'visible-md visible-lg col-sms-category',
}
) -}}
<th class="visible-sm visible-md visible-lg col-sms-stats">{{ 'mautic.core.stats'|trans }}</th>
{{- include(
'@MauticCore/Helper/tableheader.html.twig',
{
'sessionVar' : 'sms',
'orderBy' : 'e.id',
'text' : 'mautic.core.id',
'class' : 'visible-md visible-lg col-sms-id',
}
) -}}
</tr>
</thead>
<tbody>
{# @var item \Mautic\SmsBundle\Entity\Sms #}
{% for item in items %}
{% set type = item.getSmsType() %}
<tr>
<td>
{% set edit = securityHasEntityAccess(
permissions['sms:smses:editown'],
permissions['sms:smses:editother'],
item.getCreatedBy()
) %}
{% set customButtons = [
{
'attr' : {
'data-toggle' : 'ajaxmodal',
'data-target' : '#MauticSharedModal',
'data-header' : 'mautic.sms.smses.header.preview'|trans,
'data-footer' : 'false',
'href' : path('mautic_sms_action', { 'objectId' : item.getId(), 'objectAction' : 'preview' }),
},
'btnText' : 'mautic.sms.preview'|trans,
'iconClass' : 'ri-share-forward-box-fill',
}
] %}
{{- include(
'@MauticCore/Helper/list_actions.html.twig',
{
'item' : item,
'templateButtons' : {
'edit' : edit,
'clone' : permissions['sms:smses:create'],
'delete' : securityHasEntityAccess(
permissions['sms:smses:deleteown'],
permissions['sms:smses:deleteother'],
item.getCreatedBy()
),
},
'routeBase' : 'sms',
'customButtons' : customButtons,
}
) -}}
</td>
<td>
<div>
{{- include('@MauticCore/Helper/publishstatus_icon.html.twig',
{
'item' : item,
'model' : 'sms',
}
) -}}
<a href="{{ path('mautic_sms_action', {'objectAction' : 'view', 'objectId' : item.getId()}) }}" data-toggle="ajax">
{{ item.getName() }}
{% 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 %}
{% if 'list' == type %}
<span data-toggle="tooltip" title="{{ 'mautic.sms.icon_tooltip.list_sms'|trans }}">
<i class="ri-pie-chart-line fs-14"></i>
</span>
{% endif %}
</a>
{{ include('@MauticProject/Modules/projects.html.twig') }}
</div>
</td>
<td class="visible-md visible-lg">
{{ include('@MauticCore/Modules/category--expanded.html.twig', {'category': item.getCategory()}) }}
</td>
{{- include('@MauticSms/Sms/list_stats.html.twig', { 'item' : item }) -}}
<td class="visible-md visible-lg">{{ item.getId() }}</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_sms_index'),
'sessionVar' : 'sms',
}) -}}
</div>
{% elseif not configured %}
{{- include('@MauticCore/Helper/noresults.html.twig', { 'header' : 'mautic.sms.disabled', 'message' : 'mautic.sms.enable.in.configuration' }) -}}
{% 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--chat',
'size': '80'
} %}
</div>
{% endset %}
{% include '@MauticCore/Components/content-block.html.twig' with {
heading: 'mautic.sms.contentblock.heading',
subheading: 'mautic.sms.contentblock.subheading',
copy: 'mautic.sms.contentblock.copy',
childContainer: childContainer
} %}
</div>
{% endif %}
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,23 @@
<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.sms.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>

View File

@@ -0,0 +1,23 @@
{# @var item \Mautic\SmsBundle\Entity\Sms #}
{% set type = item.getSmsType() %}
<td class="visible-sm visible-md visible-lg col-stats" data-stats="{{ item.getId() }}">
{% if 'list' == type %}
<span size="sm" class="mt-xs label label-gray clickable-stat{{ item.getPendingCount() > 0 and 'list' == item.getSmsType() ? '' : ' hide' }}"
id="pending-{{ item.getId() }}"
data-toggle="tooltip"
title="{{ 'mautic.channel.stat.leadcount.tooltip'|trans }}">
<a href="{{ path('mautic_contact_index', { 'search' : 'mautic.lead.lead.searchcommand.sms_pending'|trans ~ ':' ~ item.getId() }) }}">
{{ 'mautic.sms.stat.leadcount'|trans({'%count%' : item.getPendingCount()}) }}
</a>
</span>
{% endif %}
<span class="mt-xs label label-green"
id="sent-count-{{ item.getId() }}"
data-toggle="tooltip"
title="{{ 'mautic.channel.stat.leadcount.tooltip'|trans }}">
<a href="{{ path('mautic_contact_index',{'search' : 'mautic.lead.lead.searchcommand.sms_sent'|trans ~ ':' ~ item.getId()}) }}">
{{ 'mautic.sms.stat.sentcount'|trans({'%count%' : item.getSentCount(true)}) }}
</a>
</span>
</td>

View File

@@ -0,0 +1,88 @@
{# sms @var \Mautic\SmsBundle\Entity\Sms #}
<div class="d-flex jc-center pa-md">
<div class="phone-preview animation--slide-in-right">
<div class="phone-preview__silence-switch phone-preview__button--outer"></div>
<div class="phone-preview__volume-rocker--top phone-preview__button--outer"></div>
<div class="phone-preview__volume-rocker--bottom phone-preview__button--outer"></div>
<div class="phone-preview__power-button phone-preview__button--outer"></div>
<div class="phone-preview__top-section">
<div class="phone-preview__top-bar">
<div class="phone-preview__time">12:00</div>
<div class="phone-preview__notch">
<div class="phone-preview__speaker">
<div class="phone-preview__front-camera"></div>
</div>
</div>
<div class="phone-preview__status-icons">
<i class="ri-signal-tower-line"></i>
<i class="ri-wifi-fill"></i>
<i class="ri-battery-fill"></i>
</div>
</div>
<i class="phone-preview__back-arrow phone-preview__back-arrow--left"></i>
<div class="phone-preview__user-avatar">
<i class="ri-account-circle-fill"></i>
</div>
<div class="phone-preview__user-name">{{ configGetParameter('brand_name') }}</div>
</div>
<div class="phone-preview__messages">
<div class="phone-preview__message phone-preview__message--from">
<span class="phone-preview__message-content">{{ sms.getMessage() }}</span>
</div>
<div class="phone-preview__message phone-preview__message--to">{{ 'mautic.sms.preview.demo.message'|trans }}</div>
</div>
<div class="phone-preview__keyboard">
<div class="phone-preview__keyboard-input">
<div class="phone-preview__input-addon">
<i class="ri-camera-fill"></i>
</div>
<div class="phone-preview__cursor">
<i class="ri-arrow-up-circle-fill phone-preview__send-button"></i>
</div>
<input type="text" class="phone-preview__input-field" placeholder="{{ 'mautic.sms.preview.input.placeholder'|trans }}" maxlength="1000"/>
</div>
<div class="phone-preview__keypad">
<div class="phone-preview__key-row">
{% for letter in ['Q','W','E','R','T','Y','U','I','O','P'] %}
<div class="phone-preview__key--white phone-preview__key--clickable">{{ letter }}</div>
{% endfor %}
</div>
<div class="phone-preview__key-spacer"></div>
<div class="phone-preview__key-row">
{% for letter in ['A','S','D','F','G','H','J','K','L'] %}
<div class="phone-preview__key--white phone-preview__key--clickable">{{ letter }}</div>
{% endfor %}
</div>
<div class="phone-preview__key-spacer"></div>
<div class="phone-preview__key-row">
<div class="phone-preview__key--white phone-preview__key--shift">&#8679;</div>
{% for letter in ['Z','X','C','V','B','N','M'] %}
<div class="phone-preview__key--white phone-preview__key--clickable">{{ letter }}</div>
{% endfor %}
<div class="phone-preview__key--grey phone-preview__key--backspace">
<i class="ri-delete-back-2-fill"></i>
</div>
</div>
<div class="phone-preview__key-spacer"></div>
<div class="phone-preview__key-row">
<div class="phone-preview__key--grey">123</div>
<div class="phone-preview__key--grey phone-preview__key--emoji">
<i class="ri-emoji-sticker-line"></i>
</div>
<div class="phone-preview__key--space">space</div>
<div class="phone-preview__key--grey phone-preview__key--return">return</div>
</div>
</div>
<div class="phone-preview__bottom-symbols">
<i class="ri-global-fill phone-preview__symbol--globe"></i>
<i class="ri-mic-fill phone-preview__symbol--mic"></i>
</div>
<div class="phone-preview__home-button"></div>
</div>
</div>
</div>

View File

@@ -0,0 +1,26 @@
<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.sms.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.htm.twig', {'mescallbacksage' : 'updateSmsStatsChart'}) -}}
</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>

View File

@@ -0,0 +1,22 @@
{% if showMore is defined %}
<a href="{{ url('mautic_sms_index', {'search': searchString}) }}" data-toggle="ajax">
<span>{{ 'mautic.core.search.more'|trans({'%count%': remaining}) }}</span>
</a>
</div>
{% else %}
<a href="{{ url('mautic_sms_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>
<span class="pull-right" data-toggle="tooltip" title="{{ 'mautic.sms.stat.sentcount.label'|trans }}"
data-placement="left">
<i class="ri-send-plane-line"></i>
{{ item.sentCount }}
</span>
<div class="clearfix"></div>
{% endif %}

View File

@@ -0,0 +1,56 @@
{% set item = event.extra.stat is defined ? event.extra.stat : false %}
{% if (item) %}
{% set type = event.extra.type is defined ? event.extra.type : null %}
<p>
{% if item.isFailed is defined and item.isFailed is not empty and 'failed' == type %}
{% set details = item.details|json_decode|raw %}
{% set errors = '' %}
{% if details.failed is defined %}
{% set failedDetails = details.failed %}
{% if failedDetails is not iterable %}
{% set failedDetails = [failedDetails] %}
{% endif %}
{% set errors = failedDetails|join('<br />') %}
{% endif %}
<span class="text-danger mt-0 mb-10"><i class="ri-alert-line"></i>
{% if errors is defined and errors is not empty %}
{{ errors }}
{% else %}
{{ 'mautic.sms.timeline.event.failed'|trans }}
{% endif %}
</span>
{% endif %}
{% if item.list_name is defined and item.list_name is not empty and 'failed' != type %}
<br />{{ 'mautic.sms.timeline.event.list'|trans({ '%list%' : item.list_name }) }}
{% endif %}
</p>
{% endif %}
{% if errors is defined %}
<p class="text-danger mt-0 mb-10">
<i class="ri-alert-line"></i> {{ 'mautic.campaign.event.last_error'|trans ~ ': ' ~ errors }}
</p>
{% else %}
<dl class="dl-horizontal">
<dt>{{ 'mautic.sms.timeline.status'|trans }}</dt>
<dd>
{% if item.is_failed is defined and item.is_failed is not empty %}
{{ 'mautic.email.stat.failed'|trans }}
{% else %}
{{ 'mautic.email.send'|trans }}
{% endif %}
</dd>
<dt>{{ 'mautic.sms.timeline.type'|trans }}</dt>
<dd>{{ item.type|trans }}</dd>
</dl>
{% endif %}
{% if item.message is defined and item.message is not empty %}
<div class="small">
<hr />
<strong>{{ 'mautic.sms.timeline.content.heading'|trans }}</strong>
<br />
{{ item.message }}
</div>
{% endif %}