feat: auto-enrich data_filter code fields with valueField/textField/params/dataurl from model codes
When data_filter declares uitype='code' for a search field, xls2crud now automatically looks up the matching code definition in models/*.json codes array and populates valueField, textField, params (dbname/table/tblvalue/ tbltext), and dataurl. This prevents UiCode crash (Cannot read properties of undefined reading 'length') in InlineForm search forms.
This commit is contained in:
parent
70b6997fca
commit
5295a1ce8f
Binary file not shown.
Binary file not shown.
BIN
xls2ddl/__pycache__/xls2ui.cpython-312.pyc
Normal file
BIN
xls2ddl/__pycache__/xls2ui.cpython-312.pyc
Normal file
Binary file not shown.
@ -14,9 +14,13 @@ data_browser_tmpl = """
|
|||||||
"submit_label":"搜索",
|
"submit_label":"搜索",
|
||||||
"submit_css":"primary",
|
"submit_css":"primary",
|
||||||
"fields":[
|
"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 %}
|
{"name":"{{f.field}}","uitype":"{{f.uitype}}","placeholder":"{{f.title}}","cwidth":15}{% if not loop.last %},{% endif %}
|
||||||
{% endfor %}
|
{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"binds":[{
|
"binds":[{
|
||||||
|
|||||||
@ -255,9 +255,57 @@ def filter_backslash(s):
|
|||||||
ls = s.split('\\/')
|
ls = s.split('\\/')
|
||||||
return '/'.join(ls)
|
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):
|
def build_data_browser(pat: str, desc: dict):
|
||||||
desc = desc.copy()
|
desc = desc.copy()
|
||||||
desc.fieldliststr = json.dumps(field_list(desc), ensure_ascii=False, indent=4)
|
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([])
|
e = MyTemplateEngine([])
|
||||||
s = e.renders(data_browser_tmpl, desc)
|
s = e.renders(data_browser_tmpl, desc)
|
||||||
with codecs.open(os.path.join(pat, f'index.ui'), 'w', "utf-8") as f:
|
with codecs.open(os.path.join(pat, f'index.ui'), 'w', "utf-8") as f:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user