/** * @file param.js * @brief 定值管理页面 — 多定值区展开 + 内联输入框 */ Router.register('#param', function(c) { var signals = SignalStore.get('param'); var rows = ''; if (signals.length === 0) { rows = '' + I18n.t('signal.no_data') + ''; } else { signals.forEach(function(s, idx) { var zones = s.setting_zone_list || []; var zoneHtml = ''; zones.forEach(function(z) { zoneHtml += '
' + '#' + esc(z.id) + '' + '' + esc(z.val) + '' + '' + '' + '
'; }); rows += '' + '' + (idx + 1) + '' + '' + esc(s.saddr) + '' + '' + esc(s.desc || '') + '' + '' + esc(s.type || '?') + '' + '' + (zoneHtml || '\u2014') + '' + '' + ''; }); } c.innerHTML = '
' + '
PARAM — ' + signals.length + ' signals' + '' + '
' + '
' + '' + '' + rows + '' + '
#' + I18n.t('signal.saddr') + '' + I18n.t('signal.desc') + '' + I18n.t('signal.type') + '' + I18n.t('signal.zone') + '' + I18n.t('signal.action') + '
'; }); /* Param event delegation */ document.addEventListener('click', function(e) { var btn = e.target.closest('[data-action="param-set-go"]'); if (!btn) return; var saddr = btn.getAttribute('data-saddr'); var zone = btn.getAttribute('data-zone') || '0'; var row = btn.closest('tr'); var inp = row ? row.querySelector('[data-action="param-set"][data-zone="' + zone + '"]') : null; var val = inp ? inp.value.trim() : ''; if (!val) { toast(I18n.t('toast.val_required'), 'error'); return; } WsClient.send({ saddr: saddr, signal_type: 'param', curd: 'set', signal_data: val, setting_zone: zone }); /* 立即更新本地 SignalStore + DOM */ var arr2 = SignalStore.get('param'); for (var k2 = 0; k2 < arr2.length; k2++) { if (arr2[k2].saddr === saddr && arr2[k2].setting_zone_list) { for (var z = 0; z < arr2[k2].setting_zone_list.length; z++) { if (arr2[k2].setting_zone_list[z].id === zone) { arr2[k2].setting_zone_list[z].val = val; break; } } break; } } var zc = row.querySelector('.param-zone-val[data-zone="' + zone + '"]'); if (zc) { zc.textContent = val; zc.style.transition = 'color 0.3s'; zc.style.color = '#2ed573'; setTimeout(function(){zc.style.color='';}, 800); } inp.value = ''; }); /* Enter key on param inline input */ document.addEventListener('keydown', function(e) { if (e.key === 'Enter' && e.target.classList.contains('param-zone-input')) { e.preventDefault(); var inp = e.target; var row = inp.closest('tr'); var zone = inp.getAttribute('data-zone'); var btn = row ? row.querySelector('[data-action="param-set-go"][data-zone="' + zone + '"]') : null; if (btn) btn.click(); } });