373 lines
15 KiB
Smarty
373 lines
15 KiB
Smarty
{extends file="admin/layout.tpl"}
|
|
|
|
{block name="title"}Override-Verwaltung{/block}
|
|
|
|
{block name="content"}
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h3 class="card-title">
|
|
<i class="fas fa-code"></i> Override-Verwaltung
|
|
</h3>
|
|
<div class="card-tools">
|
|
<a href="/admin/override/create" class="btn btn-primary btn-sm">
|
|
<i class="fas fa-plus"></i> Neuer Override
|
|
</a>
|
|
<a href="/admin/override/statistics" class="btn btn-info btn-sm">
|
|
<i class="fas fa-chart-bar"></i> Statistiken
|
|
</a>
|
|
<a href="/admin/override/settings" class="btn btn-secondary btn-sm">
|
|
<i class="fas fa-cog"></i> Einstellungen
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card-body">
|
|
<!-- Statistiken -->
|
|
<div class="row mb-4">
|
|
<div class="col-lg-3 col-6">
|
|
<div class="small-box bg-info">
|
|
<div class="inner">
|
|
<h3>{$statistics.total}</h3>
|
|
<p>Gesamt Overrides</p>
|
|
</div>
|
|
<div class="icon">
|
|
<i class="fas fa-code"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-3 col-6">
|
|
<div class="small-box bg-success">
|
|
<div class="inner">
|
|
<h3>{$statistics.class}</h3>
|
|
<p>Class Overrides</p>
|
|
</div>
|
|
<div class="icon">
|
|
<i class="fas fa-cube"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-3 col-6">
|
|
<div class="small-box bg-warning">
|
|
<div class="inner">
|
|
<h3>{$statistics.template}</h3>
|
|
<p>Template Overrides</p>
|
|
</div>
|
|
<div class="icon">
|
|
<i class="fas fa-file-alt"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-3 col-6">
|
|
<div class="small-box bg-danger">
|
|
<div class="inner">
|
|
<h3>{$statistics.controller}</h3>
|
|
<p>Controller Overrides</p>
|
|
</div>
|
|
<div class="icon">
|
|
<i class="fas fa-cogs"></i>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Override-Tabelle -->
|
|
<div class="table-responsive">
|
|
<table class="table table-striped table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>ID</th>
|
|
<th>Typ</th>
|
|
<th>Original</th>
|
|
<th>Override-Pfad</th>
|
|
<th>Modul</th>
|
|
<th>Status</th>
|
|
<th>Erstellt</th>
|
|
<th>Aktionen</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{if $overrides}
|
|
{foreach from=$overrides item=override}
|
|
<tr>
|
|
<td>{$override.id}</td>
|
|
<td>
|
|
<span class="badge badge-{if $override.type == 'class'}info{elseif $override.type == 'template'}warning{else}danger{/if}">
|
|
{$override.type|ucfirst}
|
|
</span>
|
|
</td>
|
|
<td>
|
|
<code>{$override.original_path}</code>
|
|
</td>
|
|
<td>
|
|
<code>{$override.override_path}</code>
|
|
</td>
|
|
<td>
|
|
<span class="badge badge-secondary">{$override.module_name}</span>
|
|
</td>
|
|
<td>
|
|
{if $override.active}
|
|
<span class="badge badge-success">Aktiv</span>
|
|
{else}
|
|
<span class="badge badge-secondary">Inaktiv</span>
|
|
{/if}
|
|
</td>
|
|
<td>{$override.created_at|date_format:'%d.%m.%Y %H:%M'}</td>
|
|
<td>
|
|
<div class="btn-group btn-group-sm">
|
|
<a href="/admin/override/edit/{$override.id}" class="btn btn-primary" title="Bearbeiten">
|
|
<i class="fas fa-edit"></i>
|
|
</a>
|
|
|
|
<a href="/admin/override/validate/{$override.id}" class="btn btn-info" title="Validieren">
|
|
<i class="fas fa-check"></i>
|
|
</a>
|
|
|
|
<a href="/admin/override/backup/{$override.id}" class="btn btn-warning" title="Backup erstellen">
|
|
<i class="fas fa-save"></i>
|
|
</a>
|
|
|
|
{if $override.active}
|
|
<a href="/admin/override/toggle/{$override.id}" class="btn btn-secondary" title="Deaktivieren">
|
|
<i class="fas fa-pause"></i>
|
|
</a>
|
|
{else}
|
|
<a href="/admin/override/toggle/{$override.id}" class="btn btn-success" title="Aktivieren">
|
|
<i class="fas fa-play"></i>
|
|
</a>
|
|
{/if}
|
|
|
|
<a href="/admin/override/delete/{$override.id}" class="btn btn-danger" title="Löschen"
|
|
onclick="return confirm('Override wirklich löschen?')">
|
|
<i class="fas fa-trash"></i>
|
|
</a>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{/foreach}
|
|
{else}
|
|
<tr>
|
|
<td colspan="8" class="text-center">
|
|
<div class="alert alert-info">
|
|
<i class="fas fa-info-circle"></i> Keine Overrides gefunden
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{/if}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Override-Details Modal -->
|
|
<div class="modal fade" id="overrideDetailsModal" tabindex="-1">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Override-Details</h5>
|
|
<button type="button" class="close" data-dismiss="modal">
|
|
<span>×</span>
|
|
</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div id="overrideDetailsContent">
|
|
<!-- Wird via AJAX geladen -->
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-dismiss="modal">Schließen</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Override-Validierung Modal -->
|
|
<div class="modal fade" id="overrideValidationModal" tabindex="-1">
|
|
<div class="modal-dialog modal-xl">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Override-Validierung</h5>
|
|
<button type="button" class="close" data-dismiss="modal">
|
|
<span>×</span>
|
|
</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div id="overrideValidationContent">
|
|
<!-- Wird via AJAX geladen -->
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-dismiss="modal">Schließen</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{/block}
|
|
|
|
{block name="scripts"}
|
|
<script>
|
|
$(document).ready(function() {
|
|
// Override-Details anzeigen
|
|
$('.btn-details').click(function(e) {
|
|
e.preventDefault();
|
|
var overrideId = $(this).data('id');
|
|
|
|
$.get('/admin/override/details/' + overrideId, function(data) {
|
|
$('#overrideDetailsContent').html(data);
|
|
$('#overrideDetailsModal').modal('show');
|
|
});
|
|
});
|
|
|
|
// Override-Validierung anzeigen
|
|
$('.btn-validate').click(function(e) {
|
|
e.preventDefault();
|
|
var overrideId = $(this).data('id');
|
|
|
|
$.get('/admin/override/validate/' + overrideId, function(data) {
|
|
$('#overrideValidationContent').html(data);
|
|
$('#overrideValidationModal').modal('show');
|
|
});
|
|
});
|
|
|
|
// Override-Status ändern
|
|
$('.btn-toggle').click(function(e) {
|
|
e.preventDefault();
|
|
var overrideId = $(this).data('id');
|
|
var currentStatus = $(this).data('status');
|
|
|
|
$.post('/admin/override/toggle/' + overrideId, function(response) {
|
|
if (response.success) {
|
|
location.reload();
|
|
} else {
|
|
alert('Fehler beim Ändern des Status');
|
|
}
|
|
});
|
|
});
|
|
|
|
// Override-Backup erstellen
|
|
$('.btn-backup').click(function(e) {
|
|
e.preventDefault();
|
|
var overrideId = $(this).data('id');
|
|
|
|
if (confirm('Backup für diesen Override erstellen?')) {
|
|
$.post('/admin/override/backup/' + overrideId, function(response) {
|
|
if (response.success) {
|
|
alert('Backup erfolgreich erstellt');
|
|
} else {
|
|
alert('Fehler beim Erstellen des Backups');
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
// Override löschen
|
|
$('.btn-delete').click(function(e) {
|
|
e.preventDefault();
|
|
var overrideId = $(this).data('id');
|
|
|
|
if (confirm('Override wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.')) {
|
|
$.post('/admin/override/delete/' + overrideId, function(response) {
|
|
if (response.success) {
|
|
location.reload();
|
|
} else {
|
|
alert('Fehler beim Löschen des Overrides');
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
// Suchfunktion
|
|
$('#overrideSearch').on('keyup', function() {
|
|
var value = $(this).val().toLowerCase();
|
|
$('table tbody tr').filter(function() {
|
|
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1);
|
|
});
|
|
});
|
|
|
|
// Filter nach Typ
|
|
$('#overrideTypeFilter').change(function() {
|
|
var type = $(this).val();
|
|
if (type) {
|
|
$('table tbody tr').hide();
|
|
$('table tbody tr').each(function() {
|
|
if ($(this).find('td:nth-child(2)').text().toLowerCase().indexOf(type) > -1) {
|
|
$(this).show();
|
|
}
|
|
});
|
|
} else {
|
|
$('table tbody tr').show();
|
|
}
|
|
});
|
|
|
|
// Filter nach Status
|
|
$('#overrideStatusFilter').change(function() {
|
|
var status = $(this).val();
|
|
if (status !== '') {
|
|
$('table tbody tr').hide();
|
|
$('table tbody tr').each(function() {
|
|
var rowStatus = $(this).find('td:nth-child(6)').text().toLowerCase();
|
|
if (rowStatus.indexOf(status) > -1) {
|
|
$(this).show();
|
|
}
|
|
});
|
|
} else {
|
|
$('table tbody tr').show();
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
{/block}
|
|
|
|
{block name="styles"}
|
|
<style>
|
|
.override-table {
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.override-table code {
|
|
font-size: 0.8rem;
|
|
background-color: #f8f9fa;
|
|
padding: 2px 4px;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.badge {
|
|
font-size: 0.75rem;
|
|
}
|
|
|
|
.btn-group-sm .btn {
|
|
padding: 0.25rem 0.5rem;
|
|
font-size: 0.875rem;
|
|
}
|
|
|
|
.small-box {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.small-box .inner {
|
|
padding: 10px;
|
|
}
|
|
|
|
.small-box .icon {
|
|
color: rgba(0, 0, 0, 0.15);
|
|
z-index: 0;
|
|
}
|
|
|
|
.modal-xl {
|
|
max-width: 90%;
|
|
}
|
|
|
|
.alert {
|
|
margin-bottom: 0;
|
|
}
|
|
</style>
|
|
{/block} |