OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

edit-email.php

9 KB
<?php $this->layout('layouts/admin', [
    'page_title'         => $page_title,
    'current_admin_page' => 'assets-handover',
    'breadcrumbs'        => [
        ['label' => 'Übergabe-Einstellungen', 'url' => '/admin/assets/handover-settings'],
        ['label' => 'E-Mail bearbeiten'],
    ],
    'page_actions'       => '<a href="/admin/assets/handover-settings" class="btn btn-default"><i class="fas fa-arrow-left"></i> Zur&uuml;ck</a>',
]); ?>

<?php
$tpl    = $template ?? [];
$isHandout = str_contains($tpl['template_key'] ?? '', 'handout');
$flash  = $this->flash();

$variables = $isHandout ? [
    'person_name'            => 'Name des Mitarbeiters',
    'asset_inventory_number' => 'Inventarnummer',
    'asset_serial_number'    => 'Seriennummer',
    'asset_manufacturer'     => 'Hersteller',
    'asset_model'            => 'Modell / Typ',
    'handout_date'           => 'Ausgabedatum',
] : [
    'person_name'            => 'Name des Mitarbeiters',
    'asset_inventory_number' => 'Inventarnummer',
    'asset_serial_number'    => 'Seriennummer',
    'asset_manufacturer'     => 'Hersteller',
    'asset_model'            => 'Modell / Typ',
    'return_date'            => 'Rückgabedatum',
];

$sampleValues = $isHandout ? [
    'person_name'            => 'Max Mustermann',
    'asset_inventory_number' => 'INV-TEST-001',
    'asset_serial_number'    => 'SN123456789',
    'asset_manufacturer'     => 'Dell',
    'asset_model'            => 'Latitude 5540',
    'handout_date'           => date('d.m.Y H:i'),
] : [
    'person_name'            => 'Max Mustermann',
    'asset_inventory_number' => 'INV-TEST-001',
    'asset_serial_number'    => 'SN123456789',
    'asset_manufacturer'     => 'Dell',
    'asset_model'            => 'Latitude 5540',
    'return_date'            => date('d.m.Y H:i'),
];
?>

<?php if (!empty($flash['success'])): ?>
<div class="alert alert-success"><?= $this->e($flash['success']) ?></div>
<?php endif; ?>
<?php if (!empty($flash['error'])): ?>
<div class="alert alert-danger"><?= $this->e($flash['error']) ?></div>
<?php endif; ?>

<!-- Vorlage-Info -->
<div class="card card-outline card-primary mb-3">
    <div class="card-header">
        <h3 class="card-title">
            <i class="fas fa-envelope"></i>
            <?= $this->e($tpl['name'] ?? '') ?>
            <code class="tpl-key-badge"><?= $this->e($tpl['template_key'] ?? '') ?></code>
        </h3>
        <p class="text-muted small mb-0">
            <?= $this->te('Diese E-Mail wird direkt an den Mitarbeiter gesendet (extern, kein Login erforderlich). Im Anhang befindet sich die generierte PDF-Best&auml;tigung.') ?>
        </p>
    </div>
</div>

<!-- Platzhalter -->
<div class="card card-outline card-primary mb-3">
    <div class="card-header">
        <h3 class="card-title"><i class="fas fa-code"></i> <?= $this->te('Verf&uuml;gbare Platzhalter') ?></h3>
    </div>
    <div class="card-body">
        <div class="var-chips">
            <?php foreach ($variables as $key => $desc): ?>
            <button type="button" class="var-chip" onclick="insertVariable('{{<?= $key ?>'+'}}')">
                <code>{{<?= $key ?>}}</code>
                <span class="var-desc"><?= $this->e($desc) ?></span>
            </button>
            <?php endforeach; ?>
        </div>
    </div>
</div>

<form action="/admin/assets/handover-settings/email/<?= urlencode($tpl['template_key'] ?? '') ?>/update"
      method="POST" id="templateForm">
    <input type="hidden" name="_csrf" value="<?= $this->csrf() ?>">

    <div class="card card-outline card-primary mb-3">
        <div class="card-header">
            <h3 class="card-title"><i class="fas fa-envelope-open-text"></i> <?= $this->te('E-Mail-Inhalt') ?></h3>
        </div>
        <div class="card-body">
            <div class="form-group">
                <label for="subject_template"><?= $this->te('Betreff') ?></label>
                <input type="text" id="subject_template" name="subject_template" class="form-control"
                       value="<?= $this->e($tpl['subject_template'] ?? '') ?>" required maxlength="500">
                <small class="form-text text-muted"><?= $this->te('Platzhalter k&ouml;nnen auch im Betreff verwendet werden.') ?></small>
            </div>

            <div class="form-group">
                <label for="body_html"><?= $this->te('E-Mail-Text (HTML)') ?></label>
                <textarea id="body_html" name="body_html" rows="15" class="form-control"><?= $this->e($tpl['body_html'] ?? '') ?></textarea>
            </div>

            <div class="form-group mb-0">
                <label style="display:flex;align-items:center;gap:0.5rem;cursor:pointer;font-weight:400;">
                    <input type="checkbox" name="is_enabled" value="1"
                           <?= !empty($tpl['is_enabled']) ? 'checked' : '' ?>>
                    <strong><?= $this->te('E-Mail-Versand aktiviert') ?></strong>
                </label>
                <small class="form-text text-muted"><?= $this->te('Wenn deaktiviert, wird keine E-Mail gesendet (PDF wird trotzdem generiert).') ?></small>
            </div>
        </div>
    </div>

    <!-- Vorschau -->
    <div class="card card-outline card-primary mb-3">
        <div class="card-header">
            <h3 class="card-title"><i class="fas fa-eye"></i> <?= $this->te('Vorschau') ?></h3>
        </div>
        <div class="card-body">
            <div id="emailPreview" class="email-preview-frame"></div>
        </div>
    </div>

    <div class="form-actions">
        <button type="submit" class="btn btn-primary"><i class="fas fa-save"></i> <?= $this->te('Speichern') ?></button>
        <a href="/admin/assets/handover-settings" class="btn btn-default"><?= $this->te('Abbrechen') ?></a>
    </div>
</form>

<style>
.tpl-key-badge { font-size:.7rem; background:var(--gray-100); padding:.2rem .5rem; border-radius:.25rem; color:var(--gray-500); font-weight:400; }
.var-chips { display:flex; flex-wrap:wrap; gap:.5rem; }
.var-chip { display:flex; align-items:center; gap:.5rem; padding:.35rem .75rem; background:var(--gray-50); border:1px solid var(--gray-200); border-radius:.375rem; cursor:pointer; transition:all .15s; font-size:.8rem; }
.var-chip:hover { background:var(--blue-50); border-color:var(--blue-300); }
.var-chip code { font-weight:600; color:var(--blue-600); font-size:.75rem; }
.var-desc { color:var(--gray-500); font-size:.75rem; }
.email-preview-frame { border:1px solid var(--gray-200); border-radius:.375rem; padding:1.5rem; min-height:150px; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif; font-size:.9rem; line-height:1.6; color:var(--gray-800); background:var(--color-bg); }
</style>

<script>
var sampleValues = <?= json_encode($sampleValues) ?>;

function insertVariable(varStr) {
    if (typeof tinymce !== 'undefined' && tinymce.activeEditor) {
        tinymce.activeEditor.insertContent(varStr);
    } else if (window._fallbackEditor) {
        window._fallbackEditor.focus();
        document.execCommand('insertHTML', false, varStr);
    }
}

function updatePreview() {
    var previewEl = document.getElementById('emailPreview');
    if (!previewEl) return;
    var content = '';
    if (typeof tinymce !== 'undefined' && tinymce.activeEditor) {
        content = tinymce.activeEditor.getContent();
    } else if (window._fallbackEditor) {
        content = window._fallbackEditor.getContent();
    }
    for (var key in sampleValues) {
        content = content.replace(
            new RegExp('\\{\\{' + key + '\\}\\}', 'g'),
            '<span style="background:#dbeafe;padding:0 3px;border-radius:2px;">' + sampleValues[key] + '</span>'
        );
    }
    previewEl.innerHTML = content;
}
</script>

<?php if (TINYMCE_INSTALLED): ?>
<script src="<?= $this->asset('/assets/tinymce/tinymce.min.js') ?>"></script>
<script>
tinymce.init({
    selector: '#body_html',
    language: 'de',
    language_url: '/assets/tinymce/langs/de.js',
    height: 420,
    menubar: false,
    plugins: 'link lists code table fullscreen',
    toolbar: 'undo redo | bold italic underline | bullist numlist | link table | forecolor backcolor | code fullscreen',
    content_style: 'body { font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; font-size: 14px; color: #1f2937; line-height: 1.6; }',
    promotion: false,
    branding: false,
    license_key: 'gpl',
    setup: function(editor) {
        editor.on('Change KeyUp', updatePreview);
        editor.on('init', updatePreview);
    }
});
</script>
<?php else: ?>
<link rel="stylesheet" href="<?= $this->asset('/assets/css/wysiwyg.css') ?>">
<script src="<?= $this->asset('/assets/js/wysiwyg.js') ?>"></script>
<script>
(function() {
    var ta   = document.getElementById('body_html');
    var wrap = document.createElement('div');
    wrap.className = 'wysiwyg-editor-container';
    ta.parentNode.insertBefore(wrap, ta);
    wrap.appendChild(ta);
    window._fallbackEditor = new OpenNIT.WysiwygEditor(wrap, {
        uploadUrl: '/upload/image',
        csrfToken: document.querySelector('input[name="_csrf"]')?.value || '',
        onChange: updatePreview
    });
    updatePreview();
}());
</script>
<?php endif; ?>