'use strict'; 'require baseclass'; 'require dom'; 'require rpc'; 'require uci'; var callUpnpGetStatus, callUpnpDeleteRule, handleDelRule; callUpnpGetStatus = rpc.declare({ object: 'luci.upnp', method: 'get_status', expect: { } }); callUpnpDeleteRule = rpc.declare({ object: 'luci.upnp', method: 'delete_rule', params: [ 'token' ], expect: { result : "OK" }, }); handleDelRule = function(num, ev) { dom.parent(ev.currentTarget, '.tr').style.opacity = 0.5; ev.currentTarget.classList.add('spinning'); ev.currentTarget.disabled = true; ev.currentTarget.blur(); callUpnpDeleteRule(num); }; return baseclass.extend({ title: _('Active Port Forwards'), load: function() { return Promise.all([ callUpnpGetStatus(), ]); }, render: function(data) { var table = E('table', { 'class': 'table', 'id': 'upnp_status_table' }, [ E('tr', { 'class': 'tr table-titles' }, [ E('th', { 'class': 'th' }, _('Protocol')), E('th', { 'class': 'th' }, _('External Port')), E('th', { 'class': 'th' }, _('Client Address')), E('th', { 'class': 'th' }, _('Host')), E('th', { 'class': 'th' }, _('Client Port')), E('th', { 'class': 'th' }, _('Description')), E('th', { 'class': 'th cbi-section-actions' }, '') ]) ]); var rules = Array.isArray(data[0].rules) ? data[0].rules : []; var rows = rules.map(function(rule) { return [ rule.proto, rule.extport, rule.intaddr, rule.host_hint || _('Unknown'), rule.intport, rule.descr, E('button', { 'class': 'btn cbi-button-remove', 'click': L.bind(handleDelRule, this, rule.num) }, [ _('Delete') ]) ]; }); cbi_update_table(table, rows, E('em', _('There are no active port forwards.'))); return table; } });