snapshot: preserve builder deletion and onboarding ux improvements
This commit is contained in:
@@ -610,16 +610,33 @@ def _build_onboarding_sections(blocks: list[dict], field_pages: dict[str, str],
|
||||
section_key = 'abschluss'
|
||||
grouped[section_key].append(block)
|
||||
visible_keys = visible_section_keys or set(section_order)
|
||||
return [
|
||||
{
|
||||
'key': key,
|
||||
'title': section_titles.get(key, ONBOARDING_SECTION_META.get(key, {}).get('title', key)),
|
||||
'subtitle': ONBOARDING_SECTION_META.get(key, {}).get('subtitle', ''),
|
||||
'blocks': grouped[key],
|
||||
}
|
||||
for key in section_order
|
||||
if key in visible_keys
|
||||
]
|
||||
sections = []
|
||||
custom_section_keys = {item['key'] for item in section_defs if item.get('is_custom')}
|
||||
for key in section_order:
|
||||
if key not in visible_keys:
|
||||
continue
|
||||
blocks_for_section = grouped[key]
|
||||
has_custom_checkbox_fields = False
|
||||
for block in blocks_for_section:
|
||||
candidate_fields = [block['field']] if block['kind'] == 'field' else (block.get('fields') or [])
|
||||
for bound_field in candidate_fields:
|
||||
widget_type = getattr(getattr(bound_field.field, 'widget', None), 'input_type', '')
|
||||
if bound_field.name.startswith('custom__') and widget_type == 'checkbox':
|
||||
has_custom_checkbox_fields = True
|
||||
break
|
||||
if has_custom_checkbox_fields:
|
||||
break
|
||||
sections.append(
|
||||
{
|
||||
'key': key,
|
||||
'title': section_titles.get(key, ONBOARDING_SECTION_META.get(key, {}).get('title', key)),
|
||||
'subtitle': ONBOARDING_SECTION_META.get(key, {}).get('subtitle', ''),
|
||||
'blocks': blocks_for_section,
|
||||
'is_custom': key in custom_section_keys,
|
||||
'has_custom_checkbox_fields': has_custom_checkbox_fields,
|
||||
}
|
||||
)
|
||||
return sections
|
||||
|
||||
|
||||
OFFBOARDING_SECTION_META = {
|
||||
@@ -2182,6 +2199,7 @@ def form_builder_page(request):
|
||||
if request.method == 'POST':
|
||||
delete_option_id = request.POST.get('delete_option_id', '').strip()
|
||||
delete_custom_field_id = request.POST.get('delete_custom_field_id', '').strip()
|
||||
delete_custom_section_id = request.POST.get('delete_custom_section_id', '').strip()
|
||||
if delete_option_id:
|
||||
option = FormOption.objects.filter(id=delete_option_id).first()
|
||||
if not option:
|
||||
@@ -2205,6 +2223,34 @@ def form_builder_page(request):
|
||||
_audit(request, 'form_custom_field_deleted', target_type='form_custom_field', target_id=deleted_id, target_label=deleted_label)
|
||||
messages.success(request, 'Benutzerdefiniertes Feld wurde gelöscht.')
|
||||
return redirect(f"/admin-tools/form-builder/?form_type={form_type}&option_category={option_category}&panel=builder-content&subpanel=custom-fields#builder-content")
|
||||
if delete_custom_section_id:
|
||||
custom_section = FormCustomSectionConfig.objects.filter(id=delete_custom_section_id, form_type=form_type).first()
|
||||
if not custom_section:
|
||||
messages.error(request, 'Benutzerdefinierter Abschnitt nicht gefunden.')
|
||||
else:
|
||||
deleted_label = custom_section.title
|
||||
deleted_id = custom_section.id
|
||||
section_key = custom_section.section_key
|
||||
custom_fields = list(FormCustomFieldConfig.objects.filter(form_type=form_type, section_key=section_key))
|
||||
deleted_field_count = len(custom_fields)
|
||||
if custom_fields:
|
||||
field_keys = [item.field_key for item in custom_fields]
|
||||
FormConditionalRuleConfig.objects.filter(
|
||||
form_type=form_type,
|
||||
target_key__in=[f'custom__{field_key}' for field_key in field_keys],
|
||||
).delete()
|
||||
FormCustomFieldConfig.objects.filter(id__in=[item.id for item in custom_fields]).delete()
|
||||
custom_section.delete()
|
||||
_audit(
|
||||
request,
|
||||
'form_custom_section_deleted',
|
||||
target_type='form_custom_section',
|
||||
target_id=deleted_id,
|
||||
target_label=deleted_label,
|
||||
details={'section_key': section_key, 'deleted_field_count': deleted_field_count},
|
||||
)
|
||||
messages.success(request, 'Benutzerdefinierter Abschnitt wurde gelöscht.')
|
||||
return redirect(f"/admin-tools/form-builder/?form_type={form_type}&option_category={option_category}&panel=builder-content&subpanel=custom-sections#builder-content")
|
||||
|
||||
action = request.POST.get('builder_action', '')
|
||||
if action == 'add_option':
|
||||
|
||||
Reference in New Issue
Block a user