diff --git a/htdocs/luci-static/resources/view/homeproxy/client.js b/htdocs/luci-static/resources/view/homeproxy/client.js index fe4b1043..58cb5e8c 100644 --- a/htdocs/luci-static/resources/view/homeproxy/client.js +++ b/htdocs/luci-static/resources/view/homeproxy/client.js @@ -432,17 +432,23 @@ return view.extend({ ss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]); ss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss); - so = ss.option(form.Value, 'label', _('Label')); + ss.tab('field_other', _('Other Fields')); + ss.tab('field_host', _('Host Fields')); + ss.tab('field_port', _('Port Fields')); + ss.tab('field_source_ip', _('SRC-IP Fields')); + ss.tab('field_source_port', _('SRC-Port Fields')); + + so = ss.taboption('field_other', form.Value, 'label', _('Label')); so.load = L.bind(hp.loadDefaultLabel, this, data[0]); so.validate = L.bind(hp.validateUniqueValue, this, data[0], 'routing_rule', 'label'); so.modalonly = true; - so = ss.option(form.Flag, 'enabled', _('Enable')); + so = ss.taboption('field_other', form.Flag, 'enabled', _('Enable')); so.default = so.enabled; so.rmempty = false; so.editable = true; - so = ss.option(form.ListValue, 'mode', _('Mode'), + so = ss.taboption('field_other', form.ListValue, 'mode', _('Mode'), _('The default rule uses the following matching logic:
' + '(domain || domain_suffix || domain_keyword || domain_regex || ip_cidr || ip_is_private) &&
' + '(port || port_range) &&
' + @@ -455,97 +461,97 @@ return view.extend({ so.rmempty = false; so.readonly = true; - so = ss.option(form.ListValue, 'ip_version', _('IP version'), + so = ss.taboption('field_other', form.ListValue, 'ip_version', _('IP version'), _('4 or 6. Not limited if empty.')); so.value('4', _('IPv4')); so.value('6', _('IPv6')); so.value('', _('Both')); so.modalonly = true; - so = ss.option(form.MultiValue, 'protocol', _('Protocol'), + so = ss.taboption('field_other', form.MultiValue, 'protocol', _('Protocol'), _('Sniffed protocol, see Sniff for details.')); so.value('http', _('HTTP')); so.value('tls', _('TLS')); so.value('quic', _('QUIC')); so.value('stun', _('STUN')); - so = ss.option(form.ListValue, 'network', _('Network')); + so = ss.taboption('field_other', form.ListValue, 'network', _('Network')); so.value('tcp', _('TCP')); so.value('udp', _('UDP')); so.value('', _('Both')); - so = ss.option(form.DynamicList, 'domain', _('Domain name'), + so = ss.taboption('field_host', form.DynamicList, 'domain', _('Domain name'), _('Match full domain.')); so.datatype = 'hostname'; so.modalonly = true; - so = ss.option(form.DynamicList, 'domain_suffix', _('Domain suffix'), + so = ss.taboption('field_host', form.DynamicList, 'domain_suffix', _('Domain suffix'), _('Match domain suffix.')); so.modalonly = true; - so = ss.option(form.DynamicList, 'domain_keyword', _('Domain keyword'), + so = ss.taboption('field_host', form.DynamicList, 'domain_keyword', _('Domain keyword'), _('Match domain using keyword.')); so.modalonly = true; - so = ss.option(form.DynamicList, 'domain_regex', _('Domain regex'), + so = ss.taboption('field_host', form.DynamicList, 'domain_regex', _('Domain regex'), _('Match domain using regular expression.')); so.modalonly = true; - so = ss.option(form.DynamicList, 'source_ip_cidr', _('Source IP CIDR'), + so = ss.taboption('field_source_ip', form.DynamicList, 'source_ip_cidr', _('Source IP CIDR'), _('Match source IP CIDR.')); so.datatype = 'or(cidr, ipaddr)'; so.modalonly = true; - so = ss.option(form.Flag, 'source_ip_is_private', _('Private source IP'), + so = ss.taboption('field_source_ip', form.Flag, 'source_ip_is_private', _('Private source IP'), _('Match private source IP.')); so.default = so.disabled; so.rmempty = false; so.modalonly = true; - so = ss.option(form.DynamicList, 'ip_cidr', _('IP CIDR'), + so = ss.taboption('field_host', form.DynamicList, 'ip_cidr', _('IP CIDR'), _('Match IP CIDR.')); so.datatype = 'or(cidr, ipaddr)'; so.modalonly = true; - so = ss.option(form.Flag, 'ip_is_private', _('Private IP'), + so = ss.taboption('field_host', form.Flag, 'ip_is_private', _('Private IP'), _('Match private IP.')); so.default = so.disabled; so.rmempty = false; so.modalonly = true; - so = ss.option(form.DynamicList, 'source_port', _('Source port'), + so = ss.taboption('field_source_port', form.DynamicList, 'source_port', _('Source port'), _('Match source port.')); so.datatype = 'port'; so.modalonly = true; - so = ss.option(form.DynamicList, 'source_port_range', _('Source port range'), + so = ss.taboption('field_source_port', form.DynamicList, 'source_port_range', _('Source port range'), _('Match source port range. Format as START:/:END/START:END.')); so.validate = validatePortRange; so.modalonly = true; - so = ss.option(form.DynamicList, 'port', _('Port'), + so = ss.taboption('field_port', form.DynamicList, 'port', _('Port'), _('Match port.')); so.datatype = 'port'; so.modalonly = true; - so = ss.option(form.DynamicList, 'port_range', _('Port range'), + so = ss.taboption('field_port', form.DynamicList, 'port_range', _('Port range'), _('Match port range. Format as START:/:END/START:END.')); so.validate = validatePortRange; so.modalonly = true; - so = ss.option(form.DynamicList, 'process_name', _('Process name'), + so = ss.taboption('field_other', form.DynamicList, 'process_name', _('Process name'), _('Match process name.')); so.modalonly = true; - so = ss.option(form.DynamicList, 'process_path', _('Process path'), + so = ss.taboption('field_other', form.DynamicList, 'process_path', _('Process path'), _('Match process path.')); so.modalonly = true; - so = ss.option(form.DynamicList, 'user', _('User'), + so = ss.taboption('field_other', form.DynamicList, 'user', _('User'), _('Match user name.')); so.modalonly = true; - so = ss.option(form.MultiValue, 'rule_set', _('Rule set'), + so = ss.taboption('field_other', form.MultiValue, 'rule_set', _('Rule set'), _('Match rule set.')); so.load = function(section_id) { delete this.keylist; @@ -561,18 +567,18 @@ return view.extend({ } so.modalonly = true; - so = ss.option(form.Flag, 'rule_set_ipcidr_match_source', _('Match source IP via rule set'), + so = ss.taboption('field_other', form.Flag, 'rule_set_ipcidr_match_source', _('Match source IP via rule set'), _('Make IP CIDR in rule set used to match the source IP.')); so.default = so.disabled; so.rmempty = false; so.modalonly = true; - so = ss.option(form.Flag, 'invert', _('Invert'), + so = ss.taboption('field_other', form.Flag, 'invert', _('Invert'), _('Invert match result.')); so.default = so.disabled; so.modalonly = true; - so = ss.option(form.ListValue, 'outbound', _('Outbound'), + so = ss.taboption('field_other', form.ListValue, 'outbound', _('Outbound'), _('Tag of the target outbound.')); so.load = function(section_id) { delete this.keylist;