feat: add edit functionality for predefined filter values in filter management
This commit is contained in:
+35
@@ -8657,6 +8657,41 @@ def remove_filter_value(filter_num, value):
|
|||||||
|
|
||||||
return redirect(url_for('manage_filters'))
|
return redirect(url_for('manage_filters'))
|
||||||
|
|
||||||
|
@app.route('/edit_filter_value/<int:filter_num>/<string:old_value>', methods=['POST'])
|
||||||
|
def edit_filter_value(filter_num, old_value):
|
||||||
|
"""
|
||||||
|
Edit a predefined value from the specified filter.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
filter_num (int): Filter number (1, 2 or 3)
|
||||||
|
old_value (str): Value to edit
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
flask.Response: Redirect to filter management page
|
||||||
|
"""
|
||||||
|
if 'username' not in session or not us.check_admin(session['username']):
|
||||||
|
return jsonify({'success': False, 'error': 'Not authorized'}), 403
|
||||||
|
|
||||||
|
new_value = sanitize_form_value(request.form.get('new_value'))
|
||||||
|
|
||||||
|
if not new_value:
|
||||||
|
flash('Bitte geben Sie einen neuen Wert ein', 'error')
|
||||||
|
return redirect(url_for('manage_filters'))
|
||||||
|
|
||||||
|
if new_value == FILTER_SELECT_ALL_TOKEN:
|
||||||
|
flash('Dieser Wert ist reserviert und kann nicht als Filterwert gespeichert werden.', 'error')
|
||||||
|
return redirect(url_for('manage_filters'))
|
||||||
|
|
||||||
|
# Update the value from the filter
|
||||||
|
success = it.edit_predefined_filter_value(filter_num, old_value, new_value)
|
||||||
|
|
||||||
|
if success:
|
||||||
|
flash(f'Wert "{old_value}" wurde in "{new_value}" bei Filter {filter_num} geändert', 'success')
|
||||||
|
else:
|
||||||
|
flash(f'Fehler beim Ändern des Wertes oder Wert existiert bereits in Filter {filter_num}', 'error')
|
||||||
|
|
||||||
|
return redirect(url_for('manage_filters'))
|
||||||
|
|
||||||
@app.route('/get_predefined_filter_values/<int:filter_num>')
|
@app.route('/get_predefined_filter_values/<int:filter_num>')
|
||||||
def get_predefined_filter_values(filter_num):
|
def get_predefined_filter_values(filter_num):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -794,6 +794,52 @@ def remove_predefined_filter_value(filter_num, value):
|
|||||||
return result.modified_count > 0
|
return result.modified_count > 0
|
||||||
|
|
||||||
|
|
||||||
|
def edit_predefined_filter_value(filter_num, old_value, new_value):
|
||||||
|
"""
|
||||||
|
Edit a predefined value from a filter and update all matching items.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
filter_num (int): Filter number (1 for Unterrichtsfach, 2 for Jahrgangsstufe)
|
||||||
|
old_value (str): Value to replace
|
||||||
|
new_value (str): New value
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if value was updated, False otherwise
|
||||||
|
"""
|
||||||
|
client = MongoClient(cfg.MONGODB_HOST, cfg.MONGODB_PORT)
|
||||||
|
db = client[cfg.MONGODB_DB]
|
||||||
|
filter_presets = db['filter_presets']
|
||||||
|
|
||||||
|
# Check if the new value already exists
|
||||||
|
existing = filter_presets.find_one({
|
||||||
|
'filter_num': filter_num,
|
||||||
|
'values': new_value
|
||||||
|
})
|
||||||
|
|
||||||
|
if existing and old_value != new_value:
|
||||||
|
client.close()
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Update the value in the filter
|
||||||
|
result = filter_presets.update_one(
|
||||||
|
{'filter_num': filter_num, 'values': old_value},
|
||||||
|
{'$set': {'values.$': new_value}}
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.modified_count > 0:
|
||||||
|
items = db['items']
|
||||||
|
filter_field = 'Filter' if filter_num == 1 else f'Filter{filter_num}'
|
||||||
|
|
||||||
|
# Also update all items that use this filter
|
||||||
|
items.update_many(
|
||||||
|
{filter_field: old_value},
|
||||||
|
{'$set': {filter_field: new_value}}
|
||||||
|
)
|
||||||
|
|
||||||
|
client.close()
|
||||||
|
return result.modified_count > 0
|
||||||
|
|
||||||
|
|
||||||
# === LOCATION MANAGEMENT ===
|
# === LOCATION MANAGEMENT ===
|
||||||
|
|
||||||
def get_predefined_locations():
|
def get_predefined_locations():
|
||||||
|
|||||||
@@ -33,8 +33,11 @@
|
|||||||
{% if filter1_values %}
|
{% if filter1_values %}
|
||||||
<div class="list-group">
|
<div class="list-group">
|
||||||
{% for value in filter1_values %}
|
{% for value in filter1_values %}
|
||||||
<div class="list-group-item d-flex justify-content-between align-items-center">
|
<div class="list-group-item">
|
||||||
{{ value }}
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||||
|
<span>{{ value }}</span>
|
||||||
|
<div>
|
||||||
|
<button type="button" class="btn btn-sm btn-secondary me-1" onclick="toggleEdit('edit-1-{{ loop.index }}')">Bearbeiten</button>
|
||||||
<form method="POST" action="{{ url_for('remove_filter_value', filter_num=1, value=value) }}" class="d-inline">
|
<form method="POST" action="{{ url_for('remove_filter_value', filter_num=1, value=value) }}" class="d-inline">
|
||||||
<button type="submit" class="btn btn-sm btn-danger"
|
<button type="submit" class="btn btn-sm btn-danger"
|
||||||
onclick="return confirm('Sind Sie sicher, dass Sie den Wert \"' + '{{ value }}'.replace(/'/g, '\\\'') + '\" löschen möchten?');">
|
onclick="return confirm('Sind Sie sicher, dass Sie den Wert \"' + '{{ value }}'.replace(/'/g, '\\\'') + '\" löschen möchten?');">
|
||||||
@@ -42,6 +45,15 @@
|
|||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<form id="edit-1-{{ loop.index }}" method="POST" action="{{ url_for('edit_filter_value', filter_num=1, old_value=value) }}" style="display: none;" class="mt-2">
|
||||||
|
<div class="input-group input-group-sm">
|
||||||
|
<input type="text" name="new_value" class="form-control" value="{{ value }}" required>
|
||||||
|
<button type="submit" class="btn btn-primary" onclick="return confirm('Tipp: Das Ändern des Namens aktualisiert auch alle Einträge in der Datenbank, die diesen Filter verwenden. Fortfahren?');">Speichern</button>
|
||||||
|
<button type="button" class="btn btn-secondary" onclick="toggleEdit('edit-1-{{ loop.index }}')">Abbrechen</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -69,8 +81,11 @@
|
|||||||
{% if filter2_values %}
|
{% if filter2_values %}
|
||||||
<div class="list-group">
|
<div class="list-group">
|
||||||
{% for value in filter2_values %}
|
{% for value in filter2_values %}
|
||||||
<div class="list-group-item d-flex justify-content-between align-items-center">
|
<div class="list-group-item">
|
||||||
{{ value }}
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||||
|
<span>{{ value }}</span>
|
||||||
|
<div>
|
||||||
|
<button type="button" class="btn btn-sm btn-secondary me-1" onclick="toggleEdit('edit-2-{{ loop.index }}')">Bearbeiten</button>
|
||||||
<form method="POST" action="{{ url_for('remove_filter_value', filter_num=2, value=value) }}" class="d-inline">
|
<form method="POST" action="{{ url_for('remove_filter_value', filter_num=2, value=value) }}" class="d-inline">
|
||||||
<button type="submit" class="btn btn-sm btn-danger"
|
<button type="submit" class="btn btn-sm btn-danger"
|
||||||
onclick="return confirm('Sind Sie sicher, dass Sie den Wert \"' + '{{ value }}'.replace(/'/g, '\\\'') + '\" löschen möchten?');">
|
onclick="return confirm('Sind Sie sicher, dass Sie den Wert \"' + '{{ value }}'.replace(/'/g, '\\\'') + '\" löschen möchten?');">
|
||||||
@@ -78,6 +93,15 @@
|
|||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<form id="edit-2-{{ loop.index }}" method="POST" action="{{ url_for('edit_filter_value', filter_num=2, old_value=value) }}" style="display: none;" class="mt-2">
|
||||||
|
<div class="input-group input-group-sm">
|
||||||
|
<input type="text" name="new_value" class="form-control" value="{{ value }}" required>
|
||||||
|
<button type="submit" class="btn btn-primary" onclick="return confirm('Tipp: Das Ändern des Namens aktualisiert auch alle Einträge in der Datenbank, die diesen Filter verwenden. Fortfahren?');">Speichern</button>
|
||||||
|
<button type="button" class="btn btn-secondary" onclick="toggleEdit('edit-2-{{ loop.index }}')">Abbrechen</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -105,8 +129,11 @@
|
|||||||
{% if filter3_values %}
|
{% if filter3_values %}
|
||||||
<div class="list-group">
|
<div class="list-group">
|
||||||
{% for value in filter3_values %}
|
{% for value in filter3_values %}
|
||||||
<div class="list-group-item d-flex justify-content-between align-items-center">
|
<div class="list-group-item">
|
||||||
{{ value }}
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||||
|
<span>{{ value }}</span>
|
||||||
|
<div>
|
||||||
|
<button type="button" class="btn btn-sm btn-secondary me-1" onclick="toggleEdit('edit-3-{{ loop.index }}')">Bearbeiten</button>
|
||||||
<form method="POST" action="{{ url_for('remove_filter_value', filter_num=3, value=value) }}" class="d-inline">
|
<form method="POST" action="{{ url_for('remove_filter_value', filter_num=3, value=value) }}" class="d-inline">
|
||||||
<button type="submit" class="btn btn-sm btn-danger"
|
<button type="submit" class="btn btn-sm btn-danger"
|
||||||
onclick="return confirm('Sind Sie sicher, dass Sie den Wert \"' + '{{ value }}'.replace(/'/g, '\\\'') + '\" löschen möchten?');">
|
onclick="return confirm('Sind Sie sicher, dass Sie den Wert \"' + '{{ value }}'.replace(/'/g, '\\\'') + '\" löschen möchten?');">
|
||||||
@@ -114,6 +141,15 @@
|
|||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<form id="edit-3-{{ loop.index }}" method="POST" action="{{ url_for('edit_filter_value', filter_num=3, old_value=value) }}" style="display: none;" class="mt-2">
|
||||||
|
<div class="input-group input-group-sm">
|
||||||
|
<input type="text" name="new_value" class="form-control" value="{{ value }}" required>
|
||||||
|
<button type="submit" class="btn btn-primary" onclick="return confirm('Tipp: Das Ändern des Namens aktualisiert auch alle Einträge in der Datenbank, die diesen Filter verwenden. Fortfahren?');">Speichern</button>
|
||||||
|
<button type="button" class="btn btn-secondary" onclick="toggleEdit('edit-3-{{ loop.index }}')">Abbrechen</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
@@ -133,4 +169,15 @@
|
|||||||
<a href="{{ url_for('home_admin') }}" class="btn btn-secondary">Zurück zur Admin-Übersicht</a>
|
<a href="{{ url_for('home_admin') }}" class="btn btn-secondary">Zurück zur Admin-Übersicht</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function toggleEdit(id) {
|
||||||
|
const el = document.getElementById(id);
|
||||||
|
if (el.style.display === 'none') {
|
||||||
|
el.style.display = 'block';
|
||||||
|
} else {
|
||||||
|
el.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user