/**
* @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 = ''
+ ''
+ '
'
+ '| # | ' + I18n.t('signal.saddr') + ' | ' + I18n.t('signal.desc') + ' | ' + I18n.t('signal.type') + ' | ' + I18n.t('signal.zone') + ' | ' + I18n.t('signal.action') + ' |
'
+ '' + rows + ''
+ '
';
});
/* 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();
}
});