public
nobgit
read
NobMail
Based on mailcow: dockerized
Languages
Repository composition by tracked source files.
PHP
49%
JavaScript
35%
HTML
9%
CSS
4%
Shell
2%
Python
1%
Lua
0%
Perl
0%
Ruby
0%
SCSS
0%
Create file
Wiki Documentation
Clone
https://nobgit.com/orgs/nobgit/nobmail.git
ssh://[email protected]:2222/orgs/nobgit/nobmail.git
Commit
Merge remote-tracking branch 'origin/feature/bootstrap5' into staging
41d56a86
data/Dockerfiles/dockerapi/Dockerfile | 11 +-
data/Dockerfiles/dockerapi/docker-entrypoint.sh | 9 +
data/Dockerfiles/dockerapi/dockerapi.py | 854 +-
data/Dockerfiles/rspamd/Dockerfile | 1 +
data/Dockerfiles/rspamd/set_worker_password.sh | 12 +
data/web/admin.php | 3 +-
data/web/css/build/001-bootstrap.min.css | 11 -
data/web/css/build/002-breakpoint.min.css | 2 +-
data/web/css/build/003-bootstrap-select.css | 487 +
data/web/css/build/003-bootstrap-select.min.css | 6 -
data/web/css/build/006-footable.bootstrap.min.css | 323 -
data/web/css/build/007-languages.min.css | 2 +-
.../{009-animate.min.css => 008-animate.min.css} | 20 +-
...xtarea.min.css => 009-numberedtextarea.min.css} | 0
...ry.jqplot.min.css => 010-jquery.jqplot.min.css} | 0
data/web/css/build/011-datatables.css | 693 +
data/web/css/build/012-Chart.min.css | 1 -
...bootstrap-icons.css => 012-bootstrap-icons.css} | 281 +-
.../css/build/{008-mailcow.css => 013-mailcow.css} | 136 +-
data/web/css/build/014-responsive.css | 220 +-
data/web/css/build/015-datatables.css | 80 +
data/web/css/site/admin.css | 1 -
data/web/css/site/debug.css | 1 -
data/web/css/site/edit.css | 1 -
data/web/css/site/mailbox.css | 1 -
data/web/css/site/quarantine.css | 1 -
data/web/css/site/user.css | 1 -
data/web/css/themes/lumen-bootstrap.css | 11560 ++++++++++++
data/web/css/themes/mailcow-darkmode.css | 360 +
data/web/debug.php | 9 +
data/web/edit.php | 104 +-
data/web/fonts/bootstrap-icons.woff | Bin 111976 -> 137124 bytes
data/web/fonts/bootstrap-icons.woff2 | Bin 83304 -> 102536 bytes
.../img/{rspamd_logo.png => rspamd_logo_dark.png} | Bin
data/web/img/rspamd_logo_light.png | Bin 0 -> 7567 bytes
data/web/inc/ajax/dns_diagnostics.php | 2 +-
data/web/inc/functions.customize.inc.php | 29 +
data/web/inc/functions.docker.inc.php | 46 +
data/web/inc/functions.inc.php | 9 +-
data/web/inc/functions.mailbox.inc.php | 585 +-
data/web/inc/header.inc.php | 2 +-
data/web/inc/init_db.inc.php | 107 +-
data/web/inc/prerequisites.inc.php | 43 +-
data/web/inc/vars.inc.php | 10 +-
data/web/index.php | 2 +-
data/web/js/build/000-jquery-3.6.0.min.js | 2 +
data/web/js/build/000-jquery.min.js | 4 -
data/web/js/build/001-bootstrap.bundle.min.js | 7 +
data/web/js/build/001-bootstrap.min.js | 7 -
.../build/{003-slider.min.js => 002-slider.min.js} | 0
data/web/js/build/003-bootstrap-select.js | 3603 ++++
data/web/js/build/004-bootstrap-select.min.js | 8 -
data/web/js/build/004-moment.min.js | 7 +
data/web/js/build/005-datatables.js | 18694 +++++++++++++++++++
data/web/js/build/006-datetime-moment.js | 70 +
data/web/js/build/006-notifications.min.js | 1 -
data/web/js/build/007-notifications.min.js | 1 +
data/web/js/build/008-Chart.min.js | 7 -
data/web/js/build/008-Chartjs-plugin-datalabels.js | 7 -
.../{007-formcache.min.js => 008-formcache.min.js} | 0
data/web/js/build/009-chart.js | 13269 +++++++++++++
data/web/js/build/010-chartjs-plugin-datalabels.js | 7 +
...textarea.min.js => 011-numberedtextarea.min.js} | 0
data/web/js/build/011-u2f-api.js | 778 -
.../js/build/{010-sha1.min.js => 012-sha1.min.js} | 0
data/web/js/build/{012-api.js => 013-api.js} | 23 +-
data/web/js/build/013-bootstrap-tabcollapse.js | 239 -
data/web/js/build/013-footable.min.js | 10 -
data/web/js/build/014-markdown-it.min.js | 3 +
.../js/build/{014-mailcow.js => 015-mailcow.js} | 161 +-
data/web/js/site/admin.js | 660 +-
data/web/js/site/debug.js | 1576 +-
data/web/js/site/edit.js | 162 +-
data/web/js/site/index.js | 2 +
data/web/js/site/mailbox.js | 2553 ++-
data/web/js/site/qhandler.js | 10 +-
data/web/js/site/quarantine.js | 183 +-
data/web/js/site/queue.js | 123 +
data/web/js/site/user.js | 513 +-
data/web/json_api.php | 138 +-
data/web/lang/lang.ca-es.json | 22 +-
data/web/lang/lang.cs-cz.json | 45 +-
data/web/lang/lang.da-dk.json | 42 +-
data/web/lang/lang.de-de.json | 100 +-
data/web/lang/lang.en-gb.json | 102 +-
data/web/lang/lang.es-es.json | 33 +-
data/web/lang/lang.fi-fi.json | 39 +-
data/web/lang/lang.fr-fr.json | 45 +-
data/web/lang/lang.hu-hu.json | 19 +-
data/web/lang/lang.it-it.json | 43 +-
data/web/lang/lang.ko-kr.json | 43 +-
data/web/lang/lang.lv-lv.json | 23 +-
data/web/lang/lang.nl-nl.json | 43 +-
data/web/lang/lang.pl-pl.json | 22 +-
data/web/lang/lang.pt-pt.json | 24 +-
data/web/lang/lang.ro-ro.json | 45 +-
data/web/lang/lang.ru-ru.json | 45 +-
data/web/lang/lang.sk-sk.json | 45 +-
data/web/lang/lang.sv-se.json | 45 +-
data/web/lang/lang.uk-ua.json | 34 +-
data/web/lang/lang.zh-cn.json | 36 +-
data/web/lang/lang.zh-tw.json | 13 +
data/web/mailbox.php | 2 +
data/web/quarantine.php | 1 +
data/web/queue.php | 26 +
data/web/templates/admin.twig | 114 +-
data/web/templates/admin/tab-config-admins.twig | 385 +-
data/web/templates/admin/tab-config-customize.twig | 76 +-
data/web/templates/admin/tab-config-dkim.twig | 135 +-
data/web/templates/admin/tab-config-f2b.twig | 57 +-
data/web/templates/admin/tab-config-fwdhosts.twig | 40 +-
data/web/templates/admin/tab-config-oauth2.twig | 34 +-
.../admin/tab-config-password-policy.twig | 27 +-
.../web/templates/admin/tab-config-quarantine.twig | 62 +-
data/web/templates/admin/tab-config-quota.twig | 28 +-
data/web/templates/admin/tab-config-rsettings.twig | 36 +-
data/web/templates/admin/tab-config-rspamd.twig | 41 +-
.../templates/admin/tab-globalfilter-regex.twig | 33 +-
data/web/templates/admin/tab-ldap.twig | 13 +-
data/web/templates/admin/tab-mailq.twig | 44 -
data/web/templates/admin/tab-routing.twig | 94 +-
data/web/templates/admin/tab-sys-mails.twig | 49 +-
data/web/templates/base.twig | 128 +-
data/web/templates/debug.twig | 684 +-
data/web/templates/domainadmin.twig | 36 +-
data/web/templates/edit.twig | 12 +-
data/web/templates/edit/admin.twig | 20 +-
data/web/templates/edit/alias.twig | 22 +-
data/web/templates/edit/aliasdomain.twig | 36 +-
data/web/templates/edit/app-passwd.twig | 18 +-
data/web/templates/edit/bcc.twig | 14 +-
data/web/templates/edit/domain-templates.twig | 136 +
data/web/templates/edit/domain.twig | 123 +-
data/web/templates/edit/domainadmin.twig | 40 +-
data/web/templates/edit/filter.twig | 16 +-
data/web/templates/edit/mailbox-templates.twig | 169 +
data/web/templates/edit/mailbox.twig | 283 +-
data/web/templates/edit/oauth2client.twig | 14 +-
data/web/templates/edit/recipient_map.twig | 14 +-
data/web/templates/edit/relayhost.twig | 18 +-
data/web/templates/edit/resource.twig | 16 +-
data/web/templates/edit/syncjob.twig | 72 +-
data/web/templates/edit/tls_policy_map.twig | 16 +-
data/web/templates/edit/transport.twig | 22 +-
data/web/templates/fido2.twig | 2 +-
data/web/templates/index.twig | 87 +-
data/web/templates/mailbox.twig | 86 +-
data/web/templates/mailbox/page-size.twig | 6 -
data/web/templates/mailbox/tab-bcc.twig | 155 +-
data/web/templates/mailbox/tab-domain-aliases.twig | 72 +-
data/web/templates/mailbox/tab-domains.twig | 83 +-
data/web/templates/mailbox/tab-filters.twig | 157 +-
.../templates/mailbox/tab-mailbox-defaults.twig | 10 -
data/web/templates/mailbox/tab-mailboxes.twig | 322 +-
data/web/templates/mailbox/tab-mbox-aliases.twig | 94 +-
data/web/templates/mailbox/tab-resources.twig | 81 +-
data/web/templates/mailbox/tab-syncjobs.twig | 78 +-
.../templates/mailbox/tab-templates-domains.twig | 51 +
data/web/templates/mailbox/tab-templates-mbox.twig | 51 +
data/web/templates/mailbox/tab-tls-policy.twig | 74 +-
data/web/templates/modals/admin.twig | 144 +-
data/web/templates/modals/footer.twig | 180 +-
data/web/templates/modals/mailbox.twig | 908 +-
data/web/templates/modals/quarantine.twig | 44 +-
data/web/templates/modals/queue.twig | 14 +
data/web/templates/modals/user.twig | 174 +-
data/web/templates/oauth/authorize.twig | 10 +-
data/web/templates/qhandler.twig | 35 +-
data/web/templates/quarantine.twig | 86 +-
data/web/templates/queue.twig | 61 +
data/web/templates/tfa_keys.twig | 8 +-
data/web/templates/user.twig | 63 +-
data/web/templates/user/AppPasswds.twig | 68 +-
data/web/templates/user/Pushover.twig | 140 +-
data/web/templates/user/SpamAliases.twig | 75 +-
data/web/templates/user/Spamfilter.twig | 154 +-
data/web/templates/user/Syncjobs.twig | 66 +-
data/web/templates/user/tab-user-auth.twig | 108 +-
data/web/templates/user/tab-user-details.twig | 33 +-
data/web/templates/user/tab-user-settings.twig | 87 +-
data/web/templates/user_domainadmin_common.twig | 1 +
data/web/user.php | 1 +
docker-compose.yml | 7 +-
183 files changed, 60010 insertions(+), 6834 deletions(-)
create mode 100755 data/Dockerfiles/dockerapi/docker-entrypoint.sh
create mode 100755 data/Dockerfiles/rspamd/set_worker_password.sh
delete mode 100644 data/web/css/build/001-bootstrap.min.css
create mode 100644 data/web/css/build/003-bootstrap-select.css
delete mode 100644 data/web/css/build/003-bootstrap-select.min.css
delete mode 100644 data/web/css/build/006-footable.bootstrap.min.css
rename data/web/css/build/{009-animate.min.css => 008-animate.min.css} (99%)
rename data/web/css/build/{010-numberedtextarea.min.css => 009-numberedtextarea.min.css} (100%)
rename data/web/css/build/{011-jquery.jqplot.min.css => 010-jquery.jqplot.min.css} (100%)
create mode 100644 data/web/css/build/011-datatables.css
delete mode 100644 data/web/css/build/012-Chart.min.css
rename data/web/css/build/{013-bootstrap-icons.css => 012-bootstrap-icons.css} (83%)
rename data/web/css/build/{008-mailcow.css => 013-mailcow.css} (71%)
create mode 100644 data/web/css/build/015-datatables.css
create mode 100644 data/web/css/themes/lumen-bootstrap.css
create mode 100644 data/web/css/themes/mailcow-darkmode.css
rename data/web/img/{rspamd_logo.png => rspamd_logo_dark.png} (100%)
create mode 100644 data/web/img/rspamd_logo_light.png
create mode 100644 data/web/js/build/000-jquery-3.6.0.min.js
delete mode 100644 data/web/js/build/000-jquery.min.js
create mode 100644 data/web/js/build/001-bootstrap.bundle.min.js
delete mode 100644 data/web/js/build/001-bootstrap.min.js
rename data/web/js/build/{003-slider.min.js => 002-slider.min.js} (100%)
create mode 100644 data/web/js/build/003-bootstrap-select.js
delete mode 100644 data/web/js/build/004-bootstrap-select.min.js
create mode 100644 data/web/js/build/004-moment.min.js
create mode 100644 data/web/js/build/005-datatables.js
create mode 100644 data/web/js/build/006-datetime-moment.js
delete mode 100644 data/web/js/build/006-notifications.min.js
create mode 100644 data/web/js/build/007-notifications.min.js
delete mode 100644 data/web/js/build/008-Chart.min.js
delete mode 100644 data/web/js/build/008-Chartjs-plugin-datalabels.js
rename data/web/js/build/{007-formcache.min.js => 008-formcache.min.js} (100%)
create mode 100644 data/web/js/build/009-chart.js
create mode 100644 data/web/js/build/010-chartjs-plugin-datalabels.js
rename data/web/js/build/{009-numberedtextarea.min.js => 011-numberedtextarea.min.js} (100%)
delete mode 100644 data/web/js/build/011-u2f-api.js
rename data/web/js/build/{010-sha1.min.js => 012-sha1.min.js} (100%)
rename data/web/js/build/{012-api.js => 013-api.js} (91%)
delete mode 100644 data/web/js/build/013-bootstrap-tabcollapse.js
delete mode 100644 data/web/js/build/013-footable.min.js
create mode 100644 data/web/js/build/014-markdown-it.min.js
rename data/web/js/build/{014-mailcow.js => 015-mailcow.js} (66%)
create mode 100644 data/web/js/site/queue.js
create mode 100644 data/web/queue.php
delete mode 100644 data/web/templates/admin/tab-mailq.twig
create mode 100644 data/web/templates/edit/domain-templates.twig
create mode 100644 data/web/templates/edit/mailbox-templates.twig
delete mode 100644 data/web/templates/mailbox/page-size.twig
delete mode 100644 data/web/templates/mailbox/tab-mailbox-defaults.twig
create mode 100644 data/web/templates/mailbox/tab-templates-domains.twig
create mode 100644 data/web/templates/mailbox/tab-templates-mbox.twig
create mode 100644 data/web/templates/modals/queue.twig
create mode 100644 data/web/templates/queue.twig
Diff
diff --cc data/web/templates/edit/mailbox.twig
index 7f5bc26e,73f75ab5..ce01a659
--- a/data/web/templates/edit/mailbox.twig
+++ b/data/web/templates/edit/mailbox.twig
@@@ -271,44 -270,33 +270,33 @@@
<input type="hidden" value="0" name="active">
<div class="row">
<div class="col-sm-1">
- <p class="help-block"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p>
+ <p class="text-muted"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p>
</div>
<div class="col-sm-10">
- <p class="help-block">{{ lang.user.pushover_info|format(mailbox)|raw }}</p>
- <p class="help-block">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}, <code>{MSG_ID}</code></p>
- <div class="form-group">
- <div class="row">
- <div class="col-sm-6">
- <div class="form-group">
- <label for="token">API Token/Key (Application)</label>
- <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
- </div>
- </div>
- <div class="col-sm-6">
- <div class="form-group">
- <label for="key">User/Group Key</label>
- <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
- </div>
- </div>
- <div class="col-sm-6">
- <div class="form-group">
- <label for="title">{{ lang.edit.pushover_title }}</label>
- <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
- </div>
- </div>
- <div class="col-sm-6">
- <div class="form-group">
- <label for="text">{{ lang.edit.pushover_text }}</label>
- <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
- </div>
- </div>
- <div class="col-sm-12">
- <div class="form-group">
- <label for="text">{{ lang.edit.pushover_sender_array|raw }}</label>
- <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="[email protected], [email protected]">
- </div>
- </div>
- <div class="col-sm-12">
+ <p class="text-muted">{{ lang.user.pushover_info|format(mailbox)|raw }}</p>
- <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code></p>
++ <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}, <code>{MSG_ID}</code></p>
+ <div class="row">
+ <div class="col-sm-6 mb-2">
+ <label for="token">API Token/Key (Application)</label>
+ <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
+ </div>
+ <div class="col-sm-6 mb-2">
+ <label for="key">User/Group Key</label>
+ <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
+ </div>
+ <div class="col-sm-6 mb-4">
+ <label for="title">{{ lang.edit.pushover_title }}</label>
+ <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
+ </div>
+ <div class="col-sm-6 mb-4">
+ <label for="text">{{ lang.edit.pushover_text }}</label>
+ <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
+ </div>
+ <div class="col-sm-12 mb-4">
+ <label for="text">{{ lang.edit.pushover_sender_array|raw }}</label>
+ <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="[email protected], [email protected]">
+ </div>
+ <div class="col-sm-12 mb-2">
<div class="form-group">
<label for="sound">{{ lang.edit.pushover_sound }}</label><br>
<select name="sound" class="form-control">
diff --cc data/web/templates/user/Pushover.twig
index 8a0a07d4,cf40c888..d3304dbe
--- a/data/web/templates/user/Pushover.twig
+++ b/data/web/templates/user/Pushover.twig
@@@ -1,48 -1,55 +1,55 @@@
- <div role="tabpanel" class="tab-pane" id="Pushover">
- <form data-id="pushover" class="form well" method="post">
- <input type="hidden" value="0" name="evaluate_x_prio">
- <input type="hidden" value="0" name="only_x_prio">
- <input type="hidden" value="0" name="active">
- <div class="row">
- <div class="col-sm-1">
- <p class="help-block"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p>
- </div>
- <div class="col-sm-10">
- <p class="help-block">{{ lang.user.pushover_info|format(mailcow_cc_username)|raw }}</p>
- <p class="help-block">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code>, <code>{MSG_ID}</code></p>
- <div class="form-group">
- <div class="row">
- <div class="col-sm-6">
- <div class="form-group">
- <label for="token">API Token/Key (Application)</label>
- <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
+ <div role="tabpanel" class="tab-pane fade" id="Pushover" role="tabpanel" aria-labelledby="Pushover">
+ <div class="card mb-4">
+ <div class="card-header d-flex fs-5">
+ <button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-Pushover" data-bs-toggle="collapse" aria-controls="collapse-tab-Pushover">
+ Pushover API
+ </button>
+ <span class="d-none d-md-block">Pushover API
+ </div>
+ <div id="collapse-tab-Pushover" class="card-body collapse" data-bs-parent="#user-content">
+ <form data-id="pushover" class="form well" method="post">
+ <input type="hidden" value="0" name="evaluate_x_prio">
+ <input type="hidden" value="0" name="only_x_prio">
+ <input type="hidden" value="0" name="active">
+ <div class="row">
+ <div class="col-sm-1">
+ <p class="text-muted"><a href="https://pushover.net" target="_blank"><img src="data:image/png;base64,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" class="img img-fluid"></a></p>
+ </div>
+ <div class="col-sm-10">
+ <p class="text-muted">{{ lang.user.pushover_info|format(mailcow_cc_username)|raw }}</p>
- <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code></p>
++ <p class="text-muted">{{ lang.edit.pushover_vars|raw }}: <code>{SUBJECT}</code>, <code>{SENDER}</code>, <code>{SENDER_ADDRESS}</code>, <code>{SENDER_NAME}</code>, <code>{TO_NAME}</code>, <code>{TO_ADDRESS}</code>, <code>{MSG_ID}</code></p>
+ <div class="row">
+ <div class="col-sm-6 mb-2">
+ <div class="form-group">
+ <label for="token">API Token/Key (Application)</label>
+ <input type="text" class="form-control" name="token" maxlength="30" value="{{ pushover_data.token }}" required>
+ </div>
</div>
- </div>
- <div class="col-sm-6">
- <div class="form-group">
- <label for="key">User/Group Key</label>
- <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
+ <div class="col-sm-6 mb-2">
+ <div class="form-group">
+ <label for="key">User/Group Key</label>
+ <input type="text" class="form-control" name="key" maxlength="30" value="{{ pushover_data.key }}" required>
+ </div>
</div>
- </div>
- <div class="col-sm-6">
- <div class="form-group">
- <label for="title">{{ lang.user.pushover_title }}</label>
- <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
+ <div class="col-sm-6 mb-2">
+ <div class="form-group">
+ <label for="title">{{ lang.user.pushover_title }}</label>
+ <input type="text" class="form-control" name="title" value="{{ pushover_data.title }}" placeholder="Mail">
+ </div>
</div>
- </div>
- <div class="col-sm-6">
- <div class="form-group">
- <label for="text">{{ lang.user.pushover_text }}</label>
- <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
+ <div class="col-sm-6 mb-2">
+ <div class="form-group">
+ <label for="text">{{ lang.user.pushover_text }}</label>
+ <input type="text" class="form-control" name="text" value="{{ pushover_data.text }}" placeholder="You've got mail 📧">
+ </div>
</div>
- </div>
- <div class="col-sm-12">
- <div class="form-group">
- <label for="text">{{ lang.user.pushover_sender_array|raw }}</label>
- <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="[email protected], [email protected]">
+ <div class="col-sm-12 mb-4">
+ <div class="form-group">
+ <label for="text">{{ lang.user.pushover_sender_array|raw }}</label>
+ <input type="text" class="form-control" name="senders" value="{{ pushover_data.senders }}" placeholder="[email protected], [email protected]">
+ </div>
</div>
- </div>
- <div class="col-sm-12">
+ <div class="col-sm-12 mb-2">
<div class="form-group">
<label for="sound">{{ lang.edit.pushover_sound }}</label><br>
<select name="sound" class="form-control">