diff --git a/docker/routlin-dash/app/view_page.py b/docker/routlin-dash/app/view_page.py index 77da58d..99b541e 100644 --- a/docker/routlin-dash/app/view_page.py +++ b/docker/routlin-dash/app/view_page.py @@ -1797,6 +1797,72 @@ def _render_editable_list(item, tokens): ) +_STANDARD_INPUT_TYPES = {'text', 'password', 'number', 'checkbox', 'select', 'textarea'} + + +def _js_str(value): + return json.dumps(str(value)) + + +def _get_worker_id(datasource): + for prefix in ('config:', 'live:'): + if datasource.startswith(prefix): + return datasource[len(prefix):] + return '' + + +def _render_table_worker_script(item, expanded_ra_fields): + """Emit a \n' + ) + # Unrecognized non-standard types: emit a safe no-op worker + return f'\n' + + def _render_table(item, tokens, inherited_req=None): level = _client_level() columns = item.get('columns', []) @@ -1820,6 +1886,12 @@ def _render_table(item, tokens, inherited_req=None): if row_actions: thead += '' + expanded_ra_fields = { + i: _expand_fields(ra.get('fields', []), tokens) + for i, ra in enumerate(row_actions) + if ra.get('method', 'post').lower() == 'inline_edit' + } + if not rows: colspan = len(columns) + (1 if row_actions else 0) tbody = f'{empty}' @@ -1845,7 +1917,7 @@ def _render_table(item, tokens, inherited_req=None): ) if row_actions: btns = '' - for ra in row_actions: + for ra_i, ra in enumerate(row_actions): req = ra.get('client_requirement', inherited_req) if not _passes(req, level): continue @@ -1869,29 +1941,39 @@ def _render_table(item, tokens, inherited_req=None): row_json = e(json.dumps(row)) btns += ( f'' ) elif method == 'inline_edit': - fields_json = e(json.dumps(_expand_fields(ra.get('fields', []), tokens))) + expanded = expanded_ra_fields.get(ra_i, []) + fields_json = e(json.dumps(expanded)) row_json = e(json.dumps(row)) + worker_id = _get_worker_id(item.get('datasource', '')) + has_nonstandard = any( + f.get('input_type', 'text') not in _STANDARD_INPUT_TYPES + for f in expanded + ) + worker_attr = f' data-worker-id="{e(worker_id)}"' if has_nonstandard and worker_id else '' btns += ( - f'' + f' data-action="{action}" data-fields="{fields_json}"{worker_attr}>{text}' ) else: btns += f'{text}' cells += f'{btns}' tbody += f'{cells}' + worker_script = _render_table_worker_script(item, expanded_ra_fields) return ( f'{toolbar_html}' '
' '' f'{thead}' f'{tbody}' - '
' + f'{worker_script}' )