Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 18f096b3f2 | |||
| 4b895a52ab | |||
| 3a504afe37 | |||
| fb2ba86140 | |||
| 72e8a8cf5d | |||
| a158d16f62 | |||
| b8347b80f2 | |||
| 31356e7178 | |||
| 0409813cbe |
+10
-4
@@ -2301,7 +2301,12 @@ def _upload_student_cards_excel():
|
|||||||
row_errors.append('Vorname und Nachname fehlen')
|
row_errors.append('Vorname und Nachname fehlen')
|
||||||
|
|
||||||
if not ausweis_id and student_name:
|
if not ausweis_id and student_name:
|
||||||
ausweis_id = generate_ausweis_id(existing_ids)
|
ausweis_id = generate_ausweis_id()
|
||||||
|
if ausweis_id in existing_ids:
|
||||||
|
row_errors.append(f'Automatisch erzeugte Ausweis-ID {ausweis_id} existiert bereits')
|
||||||
|
else:
|
||||||
|
while ausweis_id in existing_ids:
|
||||||
|
ausweis_id = generate_ausweis_id()
|
||||||
validation_warnings.append((row_number, f'Ausweis-ID wurde automatisch erzeugt: {ausweis_id}'))
|
validation_warnings.append((row_number, f'Ausweis-ID wurde automatisch erzeugt: {ausweis_id}'))
|
||||||
existing_ids.add(ausweis_id.upper())
|
existing_ids.add(ausweis_id.upper())
|
||||||
elif ausweis_id and not rollover_mode:
|
elif ausweis_id and not rollover_mode:
|
||||||
@@ -4850,7 +4855,8 @@ def student_cards_admin():
|
|||||||
if ausweis_id:
|
if ausweis_id:
|
||||||
existing = student_cards.find_one({'AusweisId': ausweis_id})
|
existing = student_cards.find_one({'AusweisId': ausweis_id})
|
||||||
else:
|
else:
|
||||||
ausweis_id = generate_ausweis_id()
|
generated_ausweis_id = generate_ausweis_id()
|
||||||
|
ausweis_id = generated_ausweis_id
|
||||||
existing = False
|
existing = False
|
||||||
if not ausweis_ident:
|
if not ausweis_ident:
|
||||||
ausweis_ident = ausweis_id
|
ausweis_ident = ausweis_id
|
||||||
@@ -4890,10 +4896,10 @@ def student_cards_admin():
|
|||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
'student_cards_admin.html',
|
'student_cards_admin.html',
|
||||||
student_cards=all_cards, # Hier all_cards übergeben
|
student_cards=all_cards,
|
||||||
edit_mode=edit_mode,
|
edit_mode=edit_mode,
|
||||||
form_data=form_data,
|
form_data=form_data,
|
||||||
available_classes=available_classes, # Enthält nun die lesbaren Klassen
|
available_classes=available_classes,
|
||||||
config=cfg.get_school_info(),
|
config=cfg.get_school_info(),
|
||||||
email_service_enabled=cfg.MODULES.is_enabled('mail')
|
email_service_enabled=cfg.MODULES.is_enabled('mail')
|
||||||
)
|
)
|
||||||
|
|||||||
+23
-19
@@ -1135,12 +1135,7 @@
|
|||||||
<a class="nav-link quick-link-pill {% if current_path == url_for('terminplaner.configure') %}nav-active{% endif %}" href="{{ url_for('terminplaner.configure') }}" data-tutorial-tip="Neuen Terminplan erstellen und an Ihr Team versenden.">Neue Planung</a>
|
<a class="nav-link quick-link-pill {% if current_path == url_for('terminplaner.configure') %}nav-active{% endif %}" href="{{ url_for('terminplaner.configure') }}" data-tutorial-tip="Neuen Terminplan erstellen und an Ihr Team versenden.">Neue Planung</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="nav-item" data-nav-fixed="true">
|
|
||||||
<button type="button" class="btn btn-link nav-link px-3" data-theme-toggle aria-label="Dark Mode umschalten" aria-pressed="false" title="Theme umschalten">
|
|
||||||
<span class="theme-icon-light" style="display: none;">☀️</span>
|
|
||||||
<span class="theme-icon-dark" style="display: none;">🌙</span>
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item dropdown ms-lg-auto">
|
<li class="nav-item dropdown ms-lg-auto">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="termMoreDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false" title="Weitere Optionen">Mehr Optionen</a>
|
<a class="nav-link dropdown-toggle" href="#" id="termMoreDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false" title="Weitere Optionen">Mehr Optionen</a>
|
||||||
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="termMoreDropdown">
|
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="termMoreDropdown">
|
||||||
@@ -1199,6 +1194,13 @@
|
|||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="{{ url_for('change_password') }}">Passwort ändern</a></li>
|
<li><a class="dropdown-item" href="{{ url_for('change_password') }}">Passwort ändern</a></li>
|
||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
|
<li class="dropdown-item" data-nav-fixed="true">
|
||||||
|
<button type="button" class="btn btn-link nav-link px-3" data-theme-toggle aria-label="Dark Mode umschalten" aria-pressed="false" title="Theme umschalten">
|
||||||
|
<span class="theme-icon-light" style="display: none;">☀️</span>
|
||||||
|
<span class="theme-icon-dark" style="display: none;">🌙</span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="{{ url_for('logout') }}">Logout</a></li>
|
<li><a class="dropdown-item" href="{{ url_for('logout') }}">Logout</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -1228,12 +1230,6 @@
|
|||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="nav-item" data-nav-fixed="true">
|
|
||||||
<button type="button" class="btn btn-link nav-link px-3" data-theme-toggle aria-label="Dark Mode umschalten" aria-pressed="false" title="Theme umschalten">
|
|
||||||
<span class="theme-icon-light" style="display: none;">☀️</span>
|
|
||||||
<span class="theme-icon-dark" style="display: none;">🌙</span>
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item dropdown ms-lg-auto">
|
<li class="nav-item dropdown ms-lg-auto">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="invMoreDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false" title="Weitere Optionen">
|
<a class="nav-link dropdown-toggle" href="#" id="invMoreDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false" title="Weitere Optionen">
|
||||||
@@ -1321,6 +1317,13 @@
|
|||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="{{ url_for('change_password') }}">Passwort ändern</a></li>
|
<li><a class="dropdown-item" href="{{ url_for('change_password') }}">Passwort ändern</a></li>
|
||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
|
<li class="dropdown-item" data-nav-fixed="true">
|
||||||
|
<button type="button" class="btn btn-link nav-link px-3" data-theme-toggle aria-label="Dark Mode umschalten" aria-pressed="false" title="Theme umschalten">
|
||||||
|
<span class="theme-icon-light" style="display: none;">☀️</span>
|
||||||
|
<span class="theme-icon-dark" style="display: none;">🌙</span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="{{ url_for('logout') }}">Logout</a></li>
|
<li><a class="dropdown-item" href="{{ url_for('logout') }}">Logout</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -1342,7 +1345,7 @@
|
|||||||
<ul class="navbar-nav me-auto mb-2 mb-lg-0" id="libraryNavList">
|
<ul class="navbar-nav me-auto mb-2 mb-lg-0" id="libraryNavList">
|
||||||
{% if current_permissions.pages.get('library_view', False) %}
|
{% if current_permissions.pages.get('library_view', False) %}
|
||||||
<li class="nav-item" data-nav-fixed="true">
|
<li class="nav-item" data-nav-fixed="true">
|
||||||
<a class="nav-link {% if current_path == url_for('library_view') %}nav-active{% endif %}" href="{{ url_for('library_view') }}" data-tutorial-tip="Die Bibliothek zeigt Ihnen alle Medien und verfügbaren Bücher.">Medien/Ausleihe</a>
|
<a class="nav-link {% if current_path == url_for('library_view') %}nav-active{% endif %}" href="{{ url_for('library_view') }}" data-tutorial-tip="Die Bibliothek zeigt Ihnen alle Medien und verfügbaren Bücher.">Ausleihe/Rückgabe</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if 'username' in session %}
|
{% if 'username' in session %}
|
||||||
@@ -1359,12 +1362,6 @@
|
|||||||
<a class="nav-link nav-priority-link {% if current_path == url_for('library_admin') %}nav-active{% endif %}" href="{{ url_for('library_admin') }}" data-tutorial-tip="Neue Bibliotheksmedien können hier aufgenommen werden.">📖 Hochladen</a>
|
<a class="nav-link nav-priority-link {% if current_path == url_for('library_admin') %}nav-active{% endif %}" href="{{ url_for('library_admin') }}" data-tutorial-tip="Neue Bibliotheksmedien können hier aufgenommen werden.">📖 Hochladen</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<li class="nav-item" data-nav-fixed="true">
|
|
||||||
<button type="button" class="btn btn-link nav-link px-3" data-theme-toggle aria-label="Dark Mode umschalten" aria-pressed="false" title="Theme umschalten">
|
|
||||||
<span class="theme-icon-light" style="display: none;">☀️</span>
|
|
||||||
<span class="theme-icon-dark" style="display: none;">🌙</span>
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<li class="nav-item dropdown ms-lg-auto">
|
<li class="nav-item dropdown ms-lg-auto">
|
||||||
<a class="nav-link dropdown-toggle" href="#" id="libMoreDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false" title="Weitere Optionen">
|
<a class="nav-link dropdown-toggle" href="#" id="libMoreDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false" title="Weitere Optionen">
|
||||||
@@ -1431,6 +1428,13 @@
|
|||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="{{ url_for('change_password') }}">Passwort ändern</a></li>
|
<li><a class="dropdown-item" href="{{ url_for('change_password') }}">Passwort ändern</a></li>
|
||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
|
<li class="dropdown-item" data-nav-fixed="true">
|
||||||
|
<button type="button" class="btn btn-link nav-link px-3" data-theme-toggle aria-label="Dark Mode umschalten" aria-pressed="false" title="Theme umschalten">
|
||||||
|
<span class="theme-icon-light" style="display: none;">☀️</span>
|
||||||
|
<span class="theme-icon-dark" style="display: none;">🌙</span>
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><a class="dropdown-item" href="{{ url_for('logout') }}">Logout</a></li>
|
<li><a class="dropdown-item" href="{{ url_for('logout') }}">Logout</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -133,6 +133,34 @@
|
|||||||
background: var(--ui-surface);
|
background: var(--ui-surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Blue edge styling for inputs and action button */
|
||||||
|
#activeStudentCard,
|
||||||
|
#manualItemCode {
|
||||||
|
border: 2px solid #3b82f6 !important;
|
||||||
|
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
#activeStudentCard:focus,
|
||||||
|
#manualItemCode:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: #2563eb !important;
|
||||||
|
box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.25) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#manualActionBtn {
|
||||||
|
background: #4f46e5 !important;
|
||||||
|
color: white !important;
|
||||||
|
border: 2px solid #3b82f6 !important;
|
||||||
|
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
|
||||||
|
transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
#manualActionBtn:hover {
|
||||||
|
background: #4338ca !important;
|
||||||
|
border-color: #2563eb !important;
|
||||||
|
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
.library-scan-status {
|
.library-scan-status {
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
font-size: 0.92em;
|
font-size: 0.92em;
|
||||||
@@ -605,7 +633,6 @@
|
|||||||
letter-spacing: 2px;
|
letter-spacing: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.detail-gallery-container {
|
.detail-gallery-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
@@ -676,7 +703,7 @@
|
|||||||
<button id="physicalScannerBtn" class="button" type="button" style="margin-left:6px;">
|
<button id="physicalScannerBtn" class="button" type="button" style="margin-left:6px;">
|
||||||
Physischer Scanner starten
|
Physischer Scanner starten
|
||||||
</button>
|
</button>
|
||||||
<button id="manualActionBtn" class="button" type="button" style="margin-left:6px; background:#4f46e5; color:white;">Code verarbeiten</button>
|
<button id="manualActionBtn" class="button" type="button" style="margin-left:6px;">Code verarbeiten</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="library-scan-reader-wrap" id="scanReaderWrap" style="display: none; margin-top: 15px;">
|
<div class="library-scan-reader-wrap" id="scanReaderWrap" style="display: none; margin-top: 15px;">
|
||||||
|
|||||||
@@ -2343,7 +2343,7 @@ document.addEventListener('DOMContentLoaded', ()=>{
|
|||||||
<div class="filter-container">
|
<div class="filter-container">
|
||||||
<div class="filter-group">
|
<div class="filter-group">
|
||||||
<div class="filter-header">
|
<div class="filter-header">
|
||||||
<label>{{ filter_names.get('2', 'Fach') }}</label>
|
<label>{{ filter_names.get('1', 'Fach') }}</label>
|
||||||
<button type="button" class="filter-toggle" onclick="toggleFilterDropdown('filter1-dropdown')">▼</button>
|
<button type="button" class="filter-toggle" onclick="toggleFilterDropdown('filter1-dropdown')">▼</button>
|
||||||
<button type="button" class="clear-filter" onclick="clearFilter(1)">Clear</button>
|
<button type="button" class="clear-filter" onclick="clearFilter(1)">Clear</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -2357,7 +2357,7 @@ document.addEventListener('DOMContentLoaded', ()=>{
|
|||||||
|
|
||||||
<div class="filter-group">
|
<div class="filter-group">
|
||||||
<div class="filter-header">
|
<div class="filter-header">
|
||||||
<label>{{ filter_names.get('1', 'Klassenstufe') }}</label>
|
<label>{{ filter_names.get('2', 'Klassenstufe') }}</label>
|
||||||
<button type="button" class="filter-toggle" onclick="toggleFilterDropdown('filter2-dropdown')">▼</button>
|
<button type="button" class="filter-toggle" onclick="toggleFilterDropdown('filter2-dropdown')">▼</button>
|
||||||
<button type="button" class="clear-filter" onclick="clearFilter(2)">Clear</button>
|
<button type="button" class="clear-filter" onclick="clearFilter(2)">Clear</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -4112,17 +4112,17 @@ document.addEventListener('DOMContentLoaded', ()=>{
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="detail-group">
|
<div class="detail-group">
|
||||||
<div class="detail-label">Unterrichtsfach:</div>
|
<div class="detail-label">{{ filter_names.get('1', 'Unterrichtsfach') }}:</div>
|
||||||
<div class="detail-value">${escapeHtml(filter1Array.join(', ') || '-')}</div>
|
<div class="detail-value">${escapeHtml(filter1Array.join(', ') || '-')}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="detail-group">
|
<div class="detail-group">
|
||||||
<div class="detail-label">Jahrgangsstufe:</div>
|
<div class="detail-label">{{ filter_names.get('2', 'Jahrgangsstufe') }}:</div>
|
||||||
<div class="detail-value">${escapeHtml(filter2Array.join(', ') || '-')}</div>
|
<div class="detail-value">${escapeHtml(filter2Array.join(', ') || '-')}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="detail-group">
|
<div class="detail-group">
|
||||||
<div class="detail-label">Schlagwort:</div>
|
<div class="detail-label">{{ filter_names.get('3', 'Schlagwort') }}:</div>
|
||||||
<div class="detail-value">${escapeHtml(filter3Array.join(', ') || '-')}</div>
|
<div class="detail-value">${escapeHtml(filter3Array.join(', ') || '-')}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user