diff --git a/xls2ddl/__pycache__/tmpls.cpython-312.pyc b/xls2ddl/__pycache__/tmpls.cpython-312.pyc index 9b46479..200496c 100644 Binary files a/xls2ddl/__pycache__/tmpls.cpython-312.pyc and b/xls2ddl/__pycache__/tmpls.cpython-312.pyc differ diff --git a/xls2ddl/__pycache__/xls2crud.cpython-312.pyc b/xls2ddl/__pycache__/xls2crud.cpython-312.pyc index 1bc03c3..0d59258 100644 Binary files a/xls2ddl/__pycache__/xls2crud.cpython-312.pyc and b/xls2ddl/__pycache__/xls2crud.cpython-312.pyc differ diff --git a/xls2ddl/__pycache__/xls2ui.cpython-312.pyc b/xls2ddl/__pycache__/xls2ui.cpython-312.pyc new file mode 100644 index 0000000..c5a455b Binary files /dev/null and b/xls2ddl/__pycache__/xls2ui.cpython-312.pyc differ diff --git a/xls2ddl/tmpls.py b/xls2ddl/tmpls.py index c0601d4..a1bf7d2 100644 --- a/xls2ddl/tmpls.py +++ b/xls2ddl/tmpls.py @@ -14,9 +14,13 @@ data_browser_tmpl = """ "submit_label":"搜索", "submit_css":"primary", "fields":[ -{% for f in data_filter.fields %} +{%- for f in data_filter.fields %} +{%- if f.uitype == 'code' %} + {{json.dumps(filter_fields[loop.index0], ensure_ascii=False)}}{% if not loop.last %},{% endif %} +{%- else %} {"name":"{{f.field}}","uitype":"{{f.uitype}}","placeholder":"{{f.title}}","cwidth":15}{% if not loop.last %},{% endif %} -{% endfor %} +{%- endif %} +{%- endfor %} ] }, "binds":[{ diff --git a/xls2ddl/xls2crud.py b/xls2ddl/xls2crud.py index 37bd184..c673e4f 100644 --- a/xls2ddl/xls2crud.py +++ b/xls2ddl/xls2crud.py @@ -255,9 +255,57 @@ def filter_backslash(s): ls = s.split('\\/') return '/'.join(ls) +def build_filter_field_list(desc) -> list: + """Build enriched filter field list for InlineForm search form. + When a data_filter field has uitype='code', auto-populate + valueField/textField/params/dataurl from the model's codes definition.""" + if not desc.data_filter or not desc.data_filter.get('fields'): + return [] + codes_map = {} + if desc.codes: + for c in desc.codes: + cfield = c.field if isinstance(c, dict) else getattr(c, 'field', None) + if cfield: + codes_map[cfield] = c + modulename = getattr(desc, 'modulename', '') + result = [] + for f in desc.data_filter.fields: + field_name = f.field if isinstance(f, dict) else getattr(f, 'field', '') + field_title = f.title if isinstance(f, dict) else getattr(f, 'title', '') + field_uitype = f.uitype if isinstance(f, dict) else getattr(f, 'uitype', 'str') + field_def = { + 'name': field_name, + 'uitype': field_uitype, + 'placeholder': field_title, + 'cwidth': 15 + } + if field_uitype == 'code' and field_name in codes_map: + c = codes_map[field_name] + ctable = c.table if isinstance(c, dict) else getattr(c, 'table', '') + cvaluefield = c.valuefield if isinstance(c, dict) else getattr(c, 'valuefield', '') + ctextfield = c.textfield if isinstance(c, dict) else getattr(c, 'textfield', '') + ccond = (c.cond if isinstance(c, dict) else getattr(c, 'cond', None)) + field_def['valueField'] = field_name + field_def['textField'] = field_name + '_text' + field_def['params'] = { + 'dbname': "{{get_module_dbname('" + modulename + "')}}", + 'table': ctable, + 'tblvalue': cvaluefield, + 'tbltext': ctextfield, + 'valueField': field_name, + 'textField': field_name + '_text' + } + if ccond: + field_def['params']['cond'] = ccond + field_def['dataurl'] = "{{entire_url('/appbase/get_code.dspy')}}" + result.append(field_def) + return result + def build_data_browser(pat: str, desc: dict): desc = desc.copy() desc.fieldliststr = json.dumps(field_list(desc), ensure_ascii=False, indent=4) + desc.filter_fields = build_filter_field_list(desc) + desc.filterfieldstr = json.dumps(desc.filter_fields, ensure_ascii=False, indent=4) e = MyTemplateEngine([]) s = e.renders(data_browser_tmpl, desc) with codecs.open(os.path.join(pat, f'index.ui'), 'w', "utf-8") as f: