feat: implement customizable filter names and update management interfaces
This commit is contained in:
@@ -71,6 +71,25 @@
|
||||
<small>Upload ersetzt das bisherige Logo. Wenn kein neues Logo gewählt wird, bleibt das aktuelle erhalten.</small>
|
||||
</div>
|
||||
|
||||
<hr style="margin: 24px 0; border: 0; border-top: 1px solid #e5e7eb;">
|
||||
<h3 style="font-size: 1.1rem; margin-bottom: 16px; color: #111827;">Globales Filter-Wording</h3>
|
||||
<p style="font-size: 0.9rem; color: #6b7280; margin-bottom: 16px;">Hier kannst du die globalen Bezeichnungen für die drei Haupt-Kategorien (Filter) der Anwendung ändern.</p>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="filter_name_1">Name Filter 1</label>
|
||||
<input type="text" id="filter_name_1" name="filter_name_1" value="{{ filter_names.get('1', 'Fach/Kategorie') }}" placeholder="z. B. Fach/Kategorie">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="filter_name_2">Name Filter 2</label>
|
||||
<input type="text" id="filter_name_2" name="filter_name_2" value="{{ filter_names.get('2', 'System/Bereich') }}" placeholder="z. B. System/Bereich">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="filter_name_3">Name Filter 3</label>
|
||||
<input type="text" id="filter_name_3" name="filter_name_3" value="{{ filter_names.get('3', 'Typ/Art') }}" placeholder="z. B. Typ/Art">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions-row">
|
||||
<button type="submit" class="btn btn-primary">Schulstammdaten speichern</button>
|
||||
<a href="{{ url_for('home_admin') }}" class="btn btn-secondary">Zurück zur Admin-Übersicht</a>
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
}
|
||||
|
||||
/* iPad/Tablet responsive adjustments */
|
||||
@media (max-width: 1024px) {
|
||||
@media (max-width: 768px) {
|
||||
.navbar .container-fluid {
|
||||
gap: 6px;
|
||||
padding-left: max(env(safe-area-inset-left, 0), 10px);
|
||||
|
||||
@@ -760,11 +760,14 @@
|
||||
if (!mainItemsLoadingIndicator) {
|
||||
mainItemsLoadingIndicator = document.createElement('div');
|
||||
mainItemsLoadingIndicator.id = 'main-items-loading-indicator';
|
||||
mainItemsLoadingIndicator.className = 'items-loading-indicator';
|
||||
mainItemsLoadingIndicator.className = 'items-loading-indicator empty-frames-placeholder';
|
||||
mainItemsLoadingIndicator.innerHTML = `
|
||||
<div class="loading-track"><div class="loading-fill"></div></div>
|
||||
<div class="loading-label">Weitere Objekte werden vorbereitet...</div>
|
||||
<div class="empty-frame p-3 mx-2" style="flex: 1; height: 100px; border-radius: 12px; background: rgba(255,255,255,0.02); min-width: 250px;"></div>
|
||||
<div class="empty-frame p-3 mx-2" style="flex: 1; height: 100px; border-radius: 12px; background: rgba(255,255,255,0.02); min-width: 250px; display: none;" class="d-none d-md-block"></div>
|
||||
<div class="empty-frame p-3 mx-2" style="flex: 1; height: 100px; border-radius: 12px; background: rgba(255,255,255,0.02); min-width: 250px; display: none;" class="d-none d-lg-block"></div>
|
||||
`;
|
||||
mainItemsLoadingIndicator.style.display = 'flex';
|
||||
mainItemsLoadingIndicator.style.width = '100%';
|
||||
}
|
||||
|
||||
itemsContainer.appendChild(mainItemsLoadingIndicator);
|
||||
@@ -1200,6 +1203,7 @@
|
||||
card.innerHTML = card.dataset.savedHtml;
|
||||
card.dataset.deloaded = 'false';
|
||||
card.classList.remove('is-deloaded');
|
||||
card.classList.remove('empty-frame');
|
||||
const favBtn = card.querySelector('.bookmark-btn');
|
||||
if (favBtn) {
|
||||
favBtn.addEventListener('click', (ev) => {
|
||||
@@ -1227,12 +1231,13 @@
|
||||
card.innerHTML = '';
|
||||
card.dataset.deloaded = 'true';
|
||||
card.classList.add('is-deloaded');
|
||||
card.classList.add('empty-frame');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}, {
|
||||
rootMargin: isMobileLayout ? '1500px 0px 1500px 0px' : '0px 2500px 0px 2500px'
|
||||
rootMargin: '30000px 30000px 30000px 30000px'
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -3383,11 +3383,14 @@ document.addEventListener('DOMContentLoaded', ()=>{
|
||||
if (!mainAdminItemsLoadingIndicator) {
|
||||
mainAdminItemsLoadingIndicator = document.createElement('div');
|
||||
mainAdminItemsLoadingIndicator.id = 'main-admin-items-loading-indicator';
|
||||
mainAdminItemsLoadingIndicator.className = 'items-loading-indicator';
|
||||
mainAdminItemsLoadingIndicator.className = 'items-loading-indicator empty-frames-placeholder';
|
||||
mainAdminItemsLoadingIndicator.innerHTML = `
|
||||
<div class="loading-track"><div class="loading-fill"></div></div>
|
||||
<div class="loading-label">Weitere Objekte werden vorbereitet...</div>
|
||||
<div class="empty-frame p-3 mx-2" style="flex: 1; height: 100px; border-radius: 12px; background: rgba(255,255,255,0.02); min-width: 250px;"></div>
|
||||
<div class="empty-frame p-3 mx-2" style="flex: 1; height: 100px; border-radius: 12px; background: rgba(255,255,255,0.02); min-width: 250px; display: none;" class="d-none d-md-block"></div>
|
||||
<div class="empty-frame p-3 mx-2" style="flex: 1; height: 100px; border-radius: 12px; background: rgba(255,255,255,0.02); min-width: 250px; display: none;" class="d-none d-lg-block"></div>
|
||||
`;
|
||||
mainAdminItemsLoadingIndicator.style.display = 'flex';
|
||||
mainAdminItemsLoadingIndicator.style.width = '100%';
|
||||
}
|
||||
|
||||
itemsContainer.appendChild(mainAdminItemsLoadingIndicator);
|
||||
@@ -3812,6 +3815,7 @@ document.addEventListener('DOMContentLoaded', ()=>{
|
||||
card.innerHTML = card.dataset.savedHtml;
|
||||
card.dataset.deloaded = 'false';
|
||||
card.classList.remove('is-deloaded');
|
||||
card.classList.remove('empty-frame');
|
||||
const favBtn = card.querySelector('.bookmark-btn');
|
||||
if (favBtn) {
|
||||
favBtn.addEventListener('click', (ev) => {
|
||||
@@ -3840,12 +3844,13 @@ document.addEventListener('DOMContentLoaded', ()=>{
|
||||
card.innerHTML = '';
|
||||
card.dataset.deloaded = 'true';
|
||||
card.classList.add('is-deloaded');
|
||||
card.classList.add('empty-frame');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}, {
|
||||
rootMargin: isMobileLayout ? '1500px 0px 1500px 0px' : '0px 2500px 0px 2500px'
|
||||
rootMargin: '30000px 30000px 30000px 30000px'
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<div class="col-md-4">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h2 class="card-title h5 mb-0">Fach/Kategorie (Filter 1)</h2>
|
||||
<h2 class="card-title h5 mb-0">{{ filter_names.get('1', 'Fach/Kategorie') }} (Filter 1)</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ url_for('add_filter_value', filter_num=1) }}" class="mb-4">
|
||||
@@ -67,7 +67,7 @@
|
||||
<div class="col-md-4">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h2 class="card-title h5 mb-0">System/Bereich (Filter 2)</h2>
|
||||
<h2 class="card-title h5 mb-0">{{ filter_names.get('2', 'System/Bereich') }} (Filter 2)</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ url_for('add_filter_value', filter_num=2) }}" class="mb-4">
|
||||
@@ -115,7 +115,7 @@
|
||||
<div class="col-md-4">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h2 class="card-title h5 mb-0">Typ/Art (Filter 3)</h2>
|
||||
<h2 class="card-title h5 mb-0">{{ filter_names.get('3', 'Typ/Art') }} (Filter 3)</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ url_for('add_filter_value', filter_num=3) }}" class="mb-4">
|
||||
|
||||
Reference in New Issue
Block a user