Initial commit: CloudOps infrastructure platform
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
{% extends '@MauticCore/Default/content.html.twig' %}
|
||||
|
||||
{% block headerTitle %}{{ 'mautic.dashboard.import'|trans }}{% endblock %}
|
||||
|
||||
{% block mauticContent %}dashboardImport{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
{% if dashboards %}
|
||||
<div class="col-sm-6">
|
||||
<div class="ml-sm mt-sm pa-sm">
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading">
|
||||
<div class="panel-title">{{ 'mautic.dashboard.predefined'|trans }}</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="list-group">
|
||||
{% for dashboard, config in dashboards %}
|
||||
<div class="list-group-item {{ (dashboard == preview) ? 'active' : '' }}">
|
||||
<h4 class="list-group-item-heading">{{ config.name|purify }}</h4>
|
||||
{% if config.description is not empty %}<p class="small">{{ config.description|purify }}</p>{% endif %}
|
||||
<p class="list-group-item-heading">
|
||||
<a href="{{ path('mautic_dashboard_action', {'objectAction': 'import', 'preview': dashboard}) }}">
|
||||
{{ 'mautic.dashboard.preview'|trans }}
|
||||
</a>·
|
||||
<a href="{{ path('mautic_dashboard_action', {'objectAction': 'applyDashboardFile', 'file': config.type~'.'~dashboard}) }}">
|
||||
{{ 'mautic.core.form.apply'|trans }}
|
||||
</a>{% if 'user' == config.type %}·
|
||||
<a href="{{ path('mautic_dashboard_action', {'objectAction': 'deleteDashboardFile', 'file': config.type~'.'~dashboard}) }}" data-toggle="confirmation" data-message="{{ 'mautic.dashboard.delete_layout'|trans|e }}" data-confirm-text="{{ 'mautic.core.form.delete'|trans|e }}" data-confirm-callback="executeAction" data-cancel-text="{{ 'mautic.core.form.cancel'|trans|e }}">
|
||||
{{ 'mautic.core.form.delete'|trans }}
|
||||
</a>{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="col-sm-6">
|
||||
<div class="mr-sm mt-sm pa-sm">
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading">
|
||||
<div class="panel-title">{{ 'mautic.dashboard.import.start.instructions'|trans }}</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{{ form_start(form) }}
|
||||
<div class="input-group well mt-lg">
|
||||
{{ form_widget(form.file) }}
|
||||
<span class="input-group-btn">
|
||||
{{ form_widget(form.start) }}
|
||||
</span>
|
||||
</div>
|
||||
{{ form_end(form) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% if widgets %}
|
||||
<div class="col-md-12">
|
||||
<h2>{{ 'mautic.dashboard.widgets.preview'|trans }}</h2>
|
||||
</div>
|
||||
<div id="dashboard-widgets" class="dashboard-widgets cards">
|
||||
{% for widget in widgets %}
|
||||
<div class="card-flex widget" data-widget-id="{{ widget.id }}" style="width: {{ widget.width|default('100') }}%; height: {{ widget.height|default('300') }}px;">
|
||||
{{ include('@MauticDashboard/Widget/detail.html.twig', {widget}) }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,120 @@
|
||||
{% extends '@MauticCore/Default/content.html.twig' %}
|
||||
|
||||
{% block headerTitle %}{{ 'mautic.dashboard.header.index'|trans }}{% endblock %}
|
||||
|
||||
{% block mauticContent %}dashboard{% endblock %}
|
||||
|
||||
{% block actions %}
|
||||
{{ include('@MauticCore/Helper/page_actions.html.twig', {
|
||||
'routeBase': 'dashboard',
|
||||
'langVar': 'dashboard',
|
||||
'customButtons': [
|
||||
{
|
||||
'attr': {
|
||||
'class': 'btn btn-primary btn-nospin',
|
||||
'data-toggle': 'ajaxmodal',
|
||||
'data-target': '#MauticSharedModal',
|
||||
'href': path('mautic_dashboard_action', {'objectAction': 'new'}),
|
||||
'data-header': 'mautic.dashboard.widget.add'|trans,
|
||||
},
|
||||
'iconClass': 'ri-add-fill',
|
||||
'btnText': 'mautic.dashboard.widget.add',
|
||||
'primary': true,
|
||||
},
|
||||
{
|
||||
'attr': {
|
||||
'class': 'btn btn-ghost btn-nospin',
|
||||
'href': 'javascript:void(0)',
|
||||
'onclick': "Mautic.saveDashboardLayout('"~'mautic.dashboard.confirmation_layout_name'|trans~"');",
|
||||
'data-toggle': '',
|
||||
},
|
||||
'iconClass': 'ri-save-line',
|
||||
'btnText': 'mautic.dashboard.save_as_predefined',
|
||||
},
|
||||
{
|
||||
'attr': {
|
||||
'class': 'btn btn-ghost btn-nospin',
|
||||
'href': 'javascript:void(0)',
|
||||
'onclick': "Mautic.exportDashboardLayout('"~'mautic.dashboard.confirmation_layout_name'|trans~"', '"~path('mautic_dashboard_action', {'objectAction': 'export'})~"');",
|
||||
'data-toggle': '',
|
||||
},
|
||||
'iconClass': 'ri-export-line',
|
||||
'btnText': 'mautic.dashboard.export.widgets',
|
||||
},
|
||||
{
|
||||
'attr': {
|
||||
'class': 'btn btn-ghost',
|
||||
'href': path('mautic_dashboard_action', {'objectAction': 'import'}),
|
||||
'data-header': 'mautic.dashboard.widget.import'|trans,
|
||||
},
|
||||
'iconClass': 'ri-import-line',
|
||||
'btnText': 'mautic.dashboard.widget.import',
|
||||
},
|
||||
],
|
||||
}) }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% if true == phpVersion['isOutdated'] %}
|
||||
<div class="pt-md pl-md col-md-12">
|
||||
<div class="pt-md pl-md alert alert-warning">
|
||||
<h3>{{ 'mautic.dashboard.phpversionwarning.title'|trans }}</h3>
|
||||
<p>{{ 'mautic.dashboard.phpversionwarning.body'|trans({'%phpversion%': phpVersion['version']})|purify }}</p>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row pt-md ml-0">
|
||||
<div class="col-sm-12">
|
||||
<div class="d-flex fd-row fw-nowrap gap-sm ai-center jc-space-between">
|
||||
{{ include('@MauticCore/Helper/graph_dateselect.html.twig', {'dateRangeForm': dateRangeForm}) }}
|
||||
<div class="dropdown">
|
||||
<a href="#" class="btn btn-ghost btn-sm btn-nospin" data-toggle="dropdown" aria-expanded="false">
|
||||
{{ 'mautic.core.quick_filters'|trans }}
|
||||
<i class="ri-arrow-down-s-line"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="#" onclick="Mautic.setDateRange('today'); event.preventDefault();">{{ 'mautic.dashboard.date.today'|trans }}</a></li>
|
||||
<li><a href="#" onclick="Mautic.setDateRange('yesterday'); event.preventDefault();">{{ 'mautic.dashboard.date.yesterday'|trans }}</a></li>
|
||||
<li><a href="#" onclick="Mautic.setDateRange(7); event.preventDefault();">{{ 'mautic.dashboard.date.last_7_days'|trans }}</a></li>
|
||||
<li><a href="#" onclick="Mautic.setDateRange(30); event.preventDefault();">{{ 'mautic.dashboard.date.last_30_days'|trans }}</a></li>
|
||||
<li><a href="#" onclick="Mautic.setDateRange(90); event.preventDefault();">{{ 'mautic.dashboard.date.last_90_days'|trans }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if widgets|length > 0 %}
|
||||
<div id="dashboard-widgets" class="dashboard-widgets cards">
|
||||
{% for widget in widgets %}
|
||||
<div class="card-flex widget" data-widget-id="{{ widget.id }}" style="width: {{ widget.width|default(100) }}%; height: {{ widget.height|default(300) }}px">
|
||||
<div class="spinner"><i class="ri-loader-3-line ri-spin"></i></div>
|
||||
{{ include('@MauticDashboard/Dashboard/widget.html.twig', {'widget': widget}) }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div id="cloned-widgets" class="dashboard-widgets cards"></div>
|
||||
{% else %}
|
||||
<div class="well well col-md-6 col-md-offset-3 mt-md">
|
||||
<div class="row">
|
||||
<div class="mautibot-image col-xs-3 text-center">
|
||||
<img class="img-responsive" style="max-height: 125px; margin-left: auto; margin-right: auto;" src="{{ mautibotGetImage('wave') }}" />
|
||||
</div>
|
||||
<div class="col-xs-9">
|
||||
<h4><i class="ri-double-quotes-l"></i> {{ 'mautic.dashboard.nowidgets.tip.header'|trans }} <i class="ri-double-quotes-r"></i></h4>
|
||||
<p class="mt-md">{{ 'mautic.dashboard.nowidgets.tip'|trans }}</p>
|
||||
{% include '@MauticCore/Helper/button.html.twig' with {
|
||||
buttons: [
|
||||
{
|
||||
label: 'mautic.dashboard.apply_default',
|
||||
variant: 'success',
|
||||
href: path('mautic_dashboard_action', {'objectAction': 'applyDashboardFile', 'file': 'default.json'})
|
||||
}
|
||||
]
|
||||
} %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,36 @@
|
||||
{% set system_user = 'mautic.core.system'|trans %}
|
||||
|
||||
{% if logs is defined and logs is iterable %}
|
||||
<div class="pt-md pr-md pb-md pl-md">
|
||||
<ul class="media-list media-list-feed">
|
||||
{% for log in logs %}
|
||||
<li class="media">
|
||||
<div class="media-object pull-left">
|
||||
<span class="figure featured {% if 'create' == log.action %}bg-success{% endif %}">
|
||||
<span class="fa {{ icons[log.bundle]|default('') }}"></span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="media-body">
|
||||
{% if log.userId is not defined or log.userId == 0 %}
|
||||
{{ system_user }}
|
||||
{% else %}
|
||||
<a href="{{ path('mautic_user_action', {'objectAction': 'edit', 'objectId': log.userId}) }}" data-toggle="ajax">
|
||||
{{ log.userName }}
|
||||
</a>
|
||||
{% endif %}
|
||||
{{ ('mautic.dashboard.'~log.action~'.past.tense')|trans }}
|
||||
|
||||
{% if log.route is defined and log.route is not empty and log.userId != 0 %}
|
||||
<a href="{{ log.route }}" data-toggle="ajax">
|
||||
{{ log.objectName }}
|
||||
</a>
|
||||
{% elseif log.objectName is defined %}
|
||||
{{ log.objectName }}
|
||||
{% endif %}
|
||||
<p class="fs-12 dark-sm"><small> {{ dateToFull(log.dateAdded) }}</small></p>
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -0,0 +1,45 @@
|
||||
{% if upcomingEmails %}
|
||||
<ul class="list-group mb-0 bdr-w-0">
|
||||
{% for email in upcomingEmails %}
|
||||
<li class="mb-md">
|
||||
<div class="box-layout">
|
||||
{% if icons.email is defined and icons.email is not empty %}
|
||||
<div class="col-md-1 va-m">
|
||||
<h3><span class="fa {{ icons.email }} fw-sb text-success"></span></h3>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="col-md-8 va-m">
|
||||
<h5 class="fw-sb text-primary">
|
||||
<a href="{{ path('mautic_campaign_action', {'objectAction': 'view', 'objectId': email.campaign_id}) }}" data-toggle="ajax">
|
||||
{{ email.campaign_name }}
|
||||
</a>
|
||||
</h5>
|
||||
<span class="text-white dark-sm">
|
||||
{{ email.event_name }}
|
||||
{{'mautic.core.send.email.to'|trans|lower}}
|
||||
{% include '@MauticCore/Helper/button.html.twig' with {
|
||||
buttons: [
|
||||
{
|
||||
label: email.lead_name ?: ('mautic.lead.lead'|trans ~ ' #' ~ email.lead_id),
|
||||
variant: 'tertiary',
|
||||
size: 'xs',
|
||||
href: path('mautic_contact_action', {'objectAction': 'view', 'objectId': email.lead_id}),
|
||||
attributes: {
|
||||
'data-toggle': 'ajax',
|
||||
'class': 'pr-sm pl-sm fs-12 ml-3'
|
||||
}
|
||||
}
|
||||
]
|
||||
} %}
|
||||
</span>
|
||||
</div>
|
||||
<div class="col-md-4 va-m text-right small">
|
||||
{{ dateToFull(email.trigger_date) }}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<div class="alert alert-warning" role="alert">{{ 'mautic.note.no.upcoming.emails'|trans }}</div>
|
||||
{% endif %}
|
||||
@@ -0,0 +1 @@
|
||||
{{ include('@MauticDashboard/Widget/detail.html.twig', {'widget': widget}) }}
|
||||
@@ -0,0 +1,59 @@
|
||||
<div class="tile" style="height: {{ widget.height|default('310') - 10 }}px;">
|
||||
<div class="card-header d-flex jc-space-between ai-center">
|
||||
<h4 class="fw-sb">{{ widget.name|purify }}</h4>
|
||||
{% if widget.id %}
|
||||
<div class="dropdown">
|
||||
<a class="btn btn-ghost btn--icon-only btn-xs dropdown-toggle" data-toggle="dropdown" href="#" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="ri-more-2-fill"></i>
|
||||
</a>
|
||||
<ul class="dropdown-menu dropdown-menu-right">
|
||||
<li class="small fw-sb text-secondary ma-md ellipsis">
|
||||
{% if widget.isCached %}
|
||||
<i class="ri-history-line mr-xs"></i>
|
||||
{{ 'mautic.dashboard.widget.data.loaded.from.cache'|trans }}
|
||||
{% else %}
|
||||
<i class="ri-flashlight-line mr-xs"></i>
|
||||
{{ 'mautic.dashboard.widget.data.loaded.from.database'|trans }}
|
||||
{% endif %}
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url('mautic_dashboard_action', {'objectAction': 'edit', 'objectId': widget.id}) }}"
|
||||
data-toggle="ajaxmodal"
|
||||
data-target="#MauticSharedModal"
|
||||
data-header="{{ 'mautic.dashboard.widget.header.edit'|trans }}">
|
||||
<span>
|
||||
<i class="ri-edit-line"></i>
|
||||
{{'mautic.core.form.edit'|trans}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url('mautic_dashboard_action', {'objectAction': 'delete', 'objectId': widget.id}) }}"
|
||||
data-header="{{ 'mautic.dashboard.widget.header.delete'|trans }}"
|
||||
class="remove-widget danger">
|
||||
<span>
|
||||
<i class="ri-close-line"></i>
|
||||
{{'mautic.core.remove'|trans}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<hr class="bdr-b">
|
||||
<div class="card-body d-flex fd-column fg-1">
|
||||
{% if widget.errorMessage %}
|
||||
<div class="alert alert-danger" role="alert">
|
||||
{{ widget.errorMessage|trans }}
|
||||
</div>
|
||||
{% elseif widget.template %}
|
||||
<!-- start: {{ widget.template }} -->
|
||||
{{ include(widget.template, widget.templateData) }}
|
||||
<!-- end: {{ widget.template }} -->
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="widget-overlay d-flex ai-center jc-center">
|
||||
<i class="ri-drag-drop-fill ri-4x text-interactive"></i>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,25 @@
|
||||
{{ form_start(form) }}
|
||||
<div class="row form-group">
|
||||
<div class="col-xs-6">
|
||||
{{ form_label(form.name) }}
|
||||
{{ form_widget(form.name) }}
|
||||
<div class="has-error">{{ form_errors(form.name) }}</div>
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
{{ form_label(form.type) }}
|
||||
{{ form_widget(form.type) }}
|
||||
<div class="has-error">{{ form_errors(form.type) }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row form-group">
|
||||
<div class="col-xs-6">
|
||||
{{ form_label(form.width) }}
|
||||
{{ form_widget(form.width) }}
|
||||
</div>
|
||||
<div class="col-xs-6">
|
||||
{{ form_label(form.height) }}
|
||||
{{ form_widget(form.height) }}
|
||||
</div>
|
||||
</div>
|
||||
{{ form_row(form.buttons) }}
|
||||
{{ form_end(form) }}
|
||||
Reference in New Issue
Block a user