diff options
Diffstat (limited to 'modules/luci-mod-network')
7 files changed, 89 insertions, 65 deletions
diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js b/modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js index cb453a3085..c31015a564 100644 --- a/modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js +++ b/modules/luci-mod-network/htdocs/luci-static/resources/tools/network.js @@ -627,8 +627,8 @@ return baseclass.extend({ o.value('', _('disabled')); o.value('loose', _('Loose filtering')); o.value('strict', _('Strict filtering')); - o.cfgvalue = function(section_id) { - var val = form.ListValue.prototype.cfgvalue.apply(this, [section_id]); + o.cfgvalue = function(/* ... */) { + var val = form.ListValue.prototype.cfgvalue.apply(this, arguments); switch (val || '') { case 'loose': @@ -780,6 +780,8 @@ return baseclass.extend({ return network.instantiateDevice(port) }).filter(function(dev) { return dev.getType() != 'wifi' || dev.isUp(); + }).sort(function(a, b) { + return L.naturalCompare(a.getName(), b.getName()); }); this.children = this.children.filter(function(opt) { return !opt.option.match(/^port_/) }); @@ -893,18 +895,6 @@ return baseclass.extend({ for (var port_name in seen_ports) ports.push(port_name); - ports.sort(function(a, b) { - var m1 = a.match(/^(.+?)([0-9]*)$/), - m2 = b.match(/^(.+?)([0-9]*)$/); - - if (m1[1] < m2[1]) - return -1; - else if (m1[1] > m2[1]) - return 1; - else - return +(m1[2] || 0) - +(m2[2] || 0); - }); - ss.updatePorts(ports); }, diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js index bf67785df1..5059b389b4 100644 --- a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js +++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/dhcp.js @@ -726,8 +726,17 @@ return view.extend({ else exp = '%t'.format(lease.expires); + var hint = lease.macaddr ? hosts[lease.macaddr] : null, + name = hint ? hint.name : null, + host = null; + + if (name && lease.hostname && lease.hostname != name) + host = '%s (%s)'.format(lease.hostname, name); + else if (lease.hostname) + host = lease.hostname; + return [ - lease.hostname || '?', + host || '-', lease.ipaddr, lease.macaddr, exp diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js index f436118cf9..da7cd95bdc 100644 --- a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js +++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/diagnostics.js @@ -37,7 +37,7 @@ return view.extend({ handleTraceroute: function(ev, cmd) { var exec = cmd || 'traceroute', addr = ev.currentTarget.parentNode.previousSibling.value, - args = (exec == 'traceroute') ? [ '-4', '-q', '1', '-w', '1', '-n', addr ] : [ '-q', '1', '-w', '2', '-n', addr ]; + args = (exec == 'traceroute') ? [ '-4', '-q', '1', '-w', '1', '-n', '-m', String(L.env.rpctimeout || 20), addr ] : [ '-q', '1', '-w', '2', '-n', addr ]; return this.handleCommand(exec, args); }, diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js index a26d51bc5e..b88183d51f 100644 --- a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js +++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/interfaces.js @@ -535,7 +535,7 @@ return view.extend({ var protocols = network.getProtocols(); protocols.sort(function(a, b) { - return a.getProtocol() > b.getProtocol(); + return L.naturalCompare(a.getProtocol(), b.getProtocol()); }); o = s.taboption('general', form.DummyValue, '_ifacestat_modal', _('Status')); @@ -805,7 +805,14 @@ return view.extend({ return flags.length ? flags : [ 'other-config' ]; }; so.remove = function(section_id) { - uci.set('dhcp', section_id, 'ra_flags', [ 'none' ]); + var existing = L.toArray(uci.get('dhcp', section_id, 'ra_flags')); + if (this.isActive(section_id)) { + if (existing.length != 1 || existing[0] != 'none') + uci.set('dhcp', section_id, 'ra_flags', [ 'none' ]); + } + else if (existing.length) { + uci.unset('dhcp', section_id, 'ra_flags'); + } }; so = ss.taboption('ipv6-ra', form.Value, 'ra_maxinterval', _('Max <abbr title="Router Advertisement">RA</abbr> interval'), _('Maximum time allowed between sending unsolicited <abbr title="Router Advertisement, ICMPv6 Type 134">RA</abbr>. Default is 600 seconds.')); @@ -1084,7 +1091,7 @@ return view.extend({ proto, name, device; protocols.sort(function(a, b) { - return a.getProtocol() > b.getProtocol(); + return L.naturalCompare(a.getProtocol(), b.getProtocol()); }); s2.render = function() { @@ -1158,6 +1165,9 @@ return view.extend({ protoclass.addDevice(device.formvalue('_new_')); m.children[0].addedSection = section_id; + + ui.hideModal(); + ui.showModal(null, E('p', { 'class': 'spinning' }, [ _('Loading data…') ])); }).then(L.bind(m.children[0].renderMoreOptionsModal, m.children[0], nameval)); }); }) @@ -1243,7 +1253,7 @@ return view.extend({ s.cfgsections = function() { var sections = uci.sections('network', 'device'), - section_ids = sections.sort(function(a, b) { return a.name > b.name }).map(function(s) { return s['.name'] }); + section_ids = sections.sort(function(a, b) { return L.naturalCompare(a.name, b.name) }).map(function(s) { return s['.name'] }); for (var i = 0; i < netDevs.length; i++) { if (sections.filter(function(s) { return s.name == netDevs[i].getName() }).length) @@ -1440,7 +1450,7 @@ return view.extend({ mac = dev ? dev.getMAC() : null; return val ? E('strong', { - 'data-tooltip': _('The value is overridden by configuration. Original: %s').format(mac || _('unknown')) + 'data-tooltip': _('The value is overridden by configuration.') }, [ val.toUpperCase() ]) : (mac || '-'); }; @@ -1452,7 +1462,7 @@ return view.extend({ mtu = dev ? dev.getMTU() : null; return val ? E('strong', { - 'data-tooltip': _('The value is overridden by configuration. Original: %s').format(mtu || _('unknown')) + 'data-tooltip': _('The value is overridden by configuration.') }, [ val ]) : (mtu || '-').toString(); }; diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js index c20574dbff..da1330aec8 100644 --- a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js +++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/routes.js @@ -38,11 +38,11 @@ return view.extend({ s.tab('general', _('General Settings')); s.tab('advanced', _('Advanced Settings')); - o = s.taboption('general', widgets.NetworkSelect, 'interface', _('Interface')); + o = s.taboption('general', widgets.NetworkSelect, 'interface', _('Interface'), _('Specifies the logical interface name of the parent (or master) interface this route belongs to')); o.loopback = true; o.nocreate = true; - o = s.taboption('general', form.ListValue, 'type', _('Route type')); + o = s.taboption('general', form.ListValue, 'type', _('Route type'), _('Specifies the route type to be created')); o.modalonly = true; o.value('', 'unicast'); o.value('local'); @@ -53,7 +53,7 @@ return view.extend({ o.value('blackhole'); o.value('anycast'); - o = s.taboption('general', form.Value, 'target', _('Target')); + o = s.taboption('general', form.Value, 'target', _('Target'), _('Network address')); o.rmempty = false; o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; @@ -72,23 +72,23 @@ return view.extend({ uci.unset('network', section_id, 'netmask'); } - o = s.taboption('general', form.Value, 'gateway', _('Gateway')); + o = s.taboption('general', form.Value, 'gateway', _('Gateway'), _('Specifies the network gateway. If omitted, the gateway from the parent interface is taken if any, otherwise creates a link scope route. If set to 0.0.0.0 no gateway will be specified for the route')); o.datatype = (family == 6) ? 'ip6addr("nomask")' : 'ip4addr("nomask")'; o.placeholder = (family == 6) ? 'fe80::1' : '192.168.0.1'; - o = s.taboption('advanced', form.Value, 'metric', _('Metric')); + o = s.taboption('advanced', form.Value, 'metric', _('Metric'), _('Specifies the route metric to use')); o.datatype = 'uinteger'; o.placeholder = 0; o.textvalue = function(section_id) { return this.cfgvalue(section_id) || 0; }; - o = s.taboption('advanced', form.Value, 'mtu', _('MTU')); + o = s.taboption('advanced', form.Value, 'mtu', _('MTU'), _('Defines a specific MTU for this route')); o.modalonly = true; o.datatype = 'and(uinteger,range(64,9000))'; o.placeholder = 1500; - o = s.taboption('advanced', form.Value, 'table', _('Table')); + o = s.taboption('advanced', form.Value, 'table', _('Table'), _('The rule target is a table lookup ID: a numeric table index ranging from 0 to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special aliases local (255), main (254) and default (253) are also valid')); o.datatype = 'or(uinteger, string)'; for (var i = 0; i < rtTables.length; i++) o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][1], rtTables[i][0])); @@ -96,9 +96,9 @@ return view.extend({ return this.cfgvalue(section_id) || 'main'; }; - o = s.taboption('advanced', form.Value, 'source', _('Source')); + o = s.taboption('advanced', form.Value, 'source', _('Source'), _('Specifies the preferred source address when sending to destinations covered by the target')); o.modalonly = true; - o.datatype = (family == 6) ? 'ip6addr("nomask")' : 'ip4addr("nomask")'; + o.datatype = (family == 6) ? 'ip6addr' : 'ip4addr'; o.placeholder = E('em', _('auto')); for (var i = 0; i < netDevs.length; i++) { var addrs = (family == 6) ? netDevs[i].getIP6Addrs() : netDevs[i].getIPAddrs(); @@ -106,7 +106,7 @@ return view.extend({ o.value(addrs[j].split('/')[0]); } - o = s.taboption('advanced', form.Flag, 'onlink', _('On-link')); + o = s.taboption('advanced', form.Flag, 'onlink', _('On-link'), _('When enabled, gateway is on-link even if the gateway does not match any interface prefix')); o.modalonly = true; o.default = o.disabled; @@ -126,14 +126,14 @@ return view.extend({ s.tab('general', _('General Settings')); s.tab('advanced', _('Advanced Settings')); - o = s.taboption('general', form.Value, 'priority', _('Priority')); + o = s.taboption('general', form.Value, 'priority', _('Priority'), _('Specifies the ordering of the IP rules')); o.datatype = 'uinteger'; o.placeholder = 30000; o.textvalue = function(section_id) { return this.cfgvalue(section_id) || E('em', _('auto')); }; - o = s.taboption('general', form.ListValue, 'action', _('Rule type')); + o = s.taboption('general', form.ListValue, 'action', _('Rule type'), _('Specifies the rule target routing action')); o.modalonly = true; o.value('', 'unicast'); o.value('unreachable'); @@ -141,54 +141,59 @@ return view.extend({ o.value('blackhole'); o.value('throw'); - o = s.taboption('general', widgets.NetworkSelect, 'in', _('Incoming interface')); + o = s.taboption('general', widgets.NetworkSelect, 'in', _('Incoming interface'), _('Specifies the incoming logical interface name')); o.loopback = true; o.nocreate = true; - o = s.taboption('general', form.Value, 'src', _('Source')); + o = s.taboption('general', form.Value, 'src', _('Source'), _('Specifies the source subnet to match (CIDR notation)')); o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; o.textvalue = function(section_id) { return this.cfgvalue(section_id) || E('em', _('any')); }; - o = s.taboption('general', widgets.NetworkSelect, 'out', _('Outgoing interface')); + o = s.taboption('general', widgets.NetworkSelect, 'out', _('Outgoing interface'), _('Specifies the outgoing logical interface name')); o.loopback = true; o.nocreate = true; - o = s.taboption('general', form.Value, 'dest', _('Destination')); + o = s.taboption('general', form.Value, 'dest', _('Destination'), _('Specifies the destination subnet to match (CIDR notation)')); o.datatype = (family == 6) ? 'cidr6' : 'cidr4'; o.placeholder = (family == 6) ? '::/0' : '0.0.0.0/0'; o.textvalue = function(section_id) { return this.cfgvalue(section_id) || E('em', _('any')); }; - o = s.taboption('general', form.Value, 'lookup', _('Table')); + o = s.taboption('general', form.Value, 'lookup', _('Table'), _('The rule target is a table lookup ID: a numeric table index ranging from 0 to 65535 or symbol alias declared in /etc/iproute2/rt_tables. Special aliases local (255), main (254) and default (253) are also valid')); o.datatype = 'or(uinteger, string)'; for (var i = 0; i < rtTables.length; i++) o.value(rtTables[i][1], '%s (%d)'.format(rtTables[i][1], rtTables[i][0])); - o = s.taboption('advanced', form.Value, 'goto', _('Jump to rule')); + o = s.taboption('advanced', form.Value, 'goto', _('Jump to rule'), _('The rule target is a jump to another rule specified by its priority value')); o.modalonly = true; o.datatype = 'uinteger'; o.placeholder = 80000; - o = s.taboption('advanced', form.Value, 'mark', _('Firewall mark')); + o = s.taboption('advanced', form.Value, 'mark', _('Firewall mark'), _('Specifies the fwmark and optionally its mask to match, e.g. 0xFF to match mark 255 or 0x0/0x1 to match any even mark value')); o.modalonly = true; o.datatype = 'string'; o.placeholder = '0x1/0xf'; - o = s.taboption('advanced', form.Value, 'tos', _('Type of service')); + o = s.taboption('advanced', form.Value, 'tos', _('Type of service'), _('Specifies the TOS value to match in IP headers')); o.modalonly = true; o.datatype = 'uinteger'; o.placeholder = 10; - o = s.taboption('advanced', form.Value, 'suppress_prefixlength', _('Prefix suppressor')); + o = s.taboption('advanced', form.Value, 'uidrange', _('User identifier'), _('Specifies an individual UID or range of UIDs to match, e.g. 1000 to match corresponding UID or 1000-1005 to inclusively match all UIDs within the corresponding range')); + o.modalonly = true; + o.datatype = 'string'; + o.placeholder = '1000-1005'; + + o = s.taboption('advanced', form.Value, 'suppress_prefixlength', _('Prefix suppressor'), _('Reject routing decisions that have a prefix length less than or equal to the specified value')); o.modalonly = true; o.datatype = (family == 6) ? 'ip6prefix' : 'ip4prefix'; o.placeholder = (family == 6) ? 64 : 24; - o = s.taboption('advanced', form.Flag, 'invert', _('Invert match')); + o = s.taboption('advanced', form.Flag, 'invert', _('Invert match'), _('If set, the meaning of the match options is inverted')); o.modalonly = true; o.default = o.disabled; diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js index 8c24775cab..535a133e78 100644 --- a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js +++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/switch.js @@ -224,7 +224,7 @@ return view.extend({ s.filter = function(section_id) { var device = uci.get('network', section_id, 'device'); - return (device == switch_name); + return (device == this.device); }; s.cfgsections = function() { @@ -248,7 +248,7 @@ return view.extend({ max_vid = 0; for (var j = 0; j < sections.length; j++) { - if (sections[j].device != s.device) + if (sections[j].device != this.device) continue; var vlan = +sections[j].vlan, @@ -261,7 +261,7 @@ return view.extend({ max_vid = vid; } - uci.set('network', section_id, 'device', s.device); + uci.set('network', section_id, 'device', this.device); uci.set('network', section_id, 'vlan', max_vlan + 1); if (feat.vid_option) @@ -270,8 +270,6 @@ return view.extend({ return this.map.save(null, true); }; - var port_opts = []; - o = s.option(form.Value, feat.vid_option || 'vlan', 'VLAN ID'); o.rmempty = false; o.forcewrite = true; @@ -299,21 +297,23 @@ return view.extend({ return true; }; + var port_opts = o.port_opts = []; + o.write = function(section_id, value) { var topology = this.section.topology, values = []; - for (var i = 0; i < port_opts.length; i++) { - var tagging = port_opts[i].formvalue(section_id), + for (var i = 0; i < this.port_opts.length; i++) { + var tagging = this.port_opts[i].formvalue(section_id), portspec = Array.isArray(topology.ports) ? topology.ports[i] : null; if (tagging == 't') - values.push(port_opts[i].option + tagging); + values.push(this.port_opts[i].option + tagging); else if (tagging == 'u') - values.push(port_opts[i].option); + values.push(this.port_opts[i].option); if (portspec && portspec.device) { - var old_tag = port_opts[i].cfgvalue(section_id), + var old_tag = this.port_opts[i].cfgvalue(section_id), old_vid = this.cfgvalue(section_id); if (old_tag != tagging || old_vid != value) { diff --git a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js index f94640ee7d..2704ee474b 100644 --- a/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js +++ b/modules/luci-mod-network/htdocs/luci-static/resources/view/network/wireless.js @@ -1156,6 +1156,11 @@ return view.extend({ if (/^radio\d+\.network/.test(o.placeholder)) o.placeholder = ''; + o = ss.taboption('advanced', form.Value, 'macaddr', _('MAC address'), _('Override default MAC address - the range of usable addresses might be limited by the driver')); + o.optional = true; + o.placeholder = radioNet.getActiveBSSID(); + o.datatype = 'macaddr'; + o = ss.taboption('advanced', form.Flag, 'short_preamble', _('Short Preamble')); o.default = o.enabled; @@ -1276,7 +1281,7 @@ return view.extend({ if (has_hostapd || has_supplicant) { crypto_modes.push(['psk2', 'WPA2-PSK', 35]); crypto_modes.push(['psk-mixed', 'WPA-PSK/WPA2-PSK Mixed Mode', 22]); - crypto_modes.push(['psk', 'WPA-PSK', 21]); + crypto_modes.push(['psk', 'WPA-PSK', 12]); } else { encr.description = _('WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP and ad-hoc mode) to be installed.'); @@ -1376,7 +1381,7 @@ return view.extend({ else if (hwtype == 'broadcom') { crypto_modes.push(['psk2', 'WPA2-PSK', 33]); crypto_modes.push(['psk+psk2', 'WPA-PSK/WPA2-PSK Mixed Mode', 22]); - crypto_modes.push(['psk', 'WPA-PSK', 21]); + crypto_modes.push(['psk', 'WPA-PSK', 12]); crypto_modes.push(['wep-open', _('WEP Open System'), 11]); crypto_modes.push(['wep-shared', _('WEP Shared Key'), 10]); } @@ -1394,47 +1399,50 @@ return view.extend({ } - o = ss.taboption('encryption', form.Value, 'auth_server', _('Radius-Authentication-Server')); + o = ss.taboption('encryption', form.Value, 'auth_server', _('RADIUS Authentication Server')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'auth_port', _('Radius-Authentication-Port'), _('Default %d').format(1812)); + o = ss.taboption('encryption', form.Value, 'auth_port', _('RADIUS Authentication Port')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; + o.placeholder = '1812'; - o = ss.taboption('encryption', form.Value, 'auth_secret', _('Radius-Authentication-Secret')); + o = ss.taboption('encryption', form.Value, 'auth_secret', _('RADIUS Authentication Secret')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; - o = ss.taboption('encryption', form.Value, 'acct_server', _('Radius-Accounting-Server')); + o = ss.taboption('encryption', form.Value, 'acct_server', _('RADIUS Accounting Server')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'acct_port', _('Radius-Accounting-Port'), _('Default %d').format(1813)); + o = ss.taboption('encryption', form.Value, 'acct_port', _('RADIUS Accounting Port')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; + o.placeholder = '1813'; - o = ss.taboption('encryption', form.Value, 'acct_secret', _('Radius-Accounting-Secret')); + o = ss.taboption('encryption', form.Value, 'acct_secret', _('RADIUS Accounting Secret')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; - o = ss.taboption('encryption', form.Value, 'dae_client', _('DAE-Client')); + o = ss.taboption('encryption', form.Value, 'dae_client', _('DAE-Client'), _('Dynamic Authorization Extension client.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'host(0)'; - o = ss.taboption('encryption', form.Value, 'dae_port', _('DAE-Port'), _('Default %d').format(3799)); + o = ss.taboption('encryption', form.Value, 'dae_port', _('DAE-Port'), _('Dynamic Authorization Extension port.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.datatype = 'port'; + o.placeholder = '3799'; - o = ss.taboption('encryption', form.Value, 'dae_secret', _('DAE-Secret')); + o = ss.taboption('encryption', form.Value, 'dae_secret', _('DAE-Secret'), _('Dynamic Authorization Extension secret.')); add_dependency_permutations(o, { mode: ['ap', 'ap-wds'], encryption: ['wpa', 'wpa2', 'wpa3', 'wpa3-mixed'] }); o.rmempty = true; o.password = true; @@ -1965,6 +1973,8 @@ return view.extend({ }); }); }).then(L.bind(function() { + ui.showModal(null, E('p', { 'class': 'spinning' }, [ _('Loading data…') ])); + return this.renderMoreOptionsModal(section_id); }, this)); }; |