import json from flask import url_for def render_form(form_json, module_id, aufmass_id=None): fields = json.loads(form_json) if isinstance(form_json, str) else form_json parts = [] berechnen_url = url_for("custom_modules.berechnen", module_id=module_id) if aufmass_id: berechnen_url += f'?aufmass_id={aufmass_id}' parts.append(f'
') in_group = False for f in fields: ftype = f.get('type', 'text') name = f.get('name', f.get('id', '')) label = f.get('label', '') placeholder = f.get('placeholder', '') default = f.get('default', '') required = f.get('required', False) cond = f.get('conditional_show') col_size = f.get('columns', '12') cond_attrs = '' if cond and cond.get('field') and cond.get('value'): cond_attrs = f' data-cond-field="{cond["field"]}" data-cond-value="{cond["value"]}" style="display:none"' if ftype == 'group_start': if in_group: parts.append('') collapsible = f.get('collapsible', False) title = f.get('title', 'Gruppe') parts.append(f'
') parts.append(f'
{title}
') parts.append('
') in_group = True continue if ftype == 'group_end': if in_group: parts.append('
') parts.append('
') in_group = False continue if ftype == 'separator': parts.append(f'') continue if ftype == 'label': parts.append(f'{_esc(f.get("text", ""))}

') continue req_mark = ' *' if required else '' field_html = '' if ftype == 'text': field_html = f'' elif ftype == 'number': inputmode = f.get('inputmode', 'decimal') min_attr = f' min="{f.get("min")}"' if f.get('min') != '' else '' max_attr = f' max="{f.get("max")}"' if f.get('max') != '' else '' step_attr = f' step="{f.get("step")}"' if f.get('step') and f.get('step') != 'any' else '' field_html = f'' elif ftype == 'checkbox': checked = 'checked' if default else '' field_html = f'' elif ftype == 'dropdown': opts = f.get('options', []) options_html = '' for o in opts: val = o.get('value', '') lbl = o.get('label', val) sel = 'selected' if default == val else '' options_html += f'' field_html = f'
' elif ftype == 'radio': opts = f.get('options', []) radio_html = '' for o in opts: val = o.get('value', '') lbl = o.get('label', val) checked = 'checked' if default == val else '' radio_html += f'' field_html = radio_html if field_html: if col_size != '12' and in_group: parts.append(f'
{field_html}
') else: parts.append(f'
{field_html}
') if in_group: parts.append('') parts.append(f'') parts.append('') cond_js = ''' ''' parts.append(cond_js) return '\n'.join(parts) def _esc(s): return str(s).replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"')