diff --git a/htdocs/luci-static/resources/view/homeproxy/client.js b/htdocs/luci-static/resources/view/homeproxy/client.js
index f5ce25a2..27cb2519 100644
--- a/htdocs/luci-static/resources/view/homeproxy/client.js
+++ b/htdocs/luci-static/resources/view/homeproxy/client.js
@@ -421,32 +421,24 @@ return view.extend({
so.rmempty = false;
so.editable = true;
- so = ss.option(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.ListValue, 'mode', _('Mode'),
_('The default rule uses the following matching logic:
' +
'(domain || domain_suffix || domain_keyword || domain_regex || geosite || geoip || ip_cidr)
&&
' +
+ '(port || port_range)
&&
' +
'(source_geoip || source_ip_cidr)
&&
' +
+ '(source_port || source_port_range)
&&
' +
'other fields
.'));
so.value('default', _('Default'));
so.default = 'default';
so.rmempty = false;
so.readonly = true;
- so = ss.option(form.Flag, 'invert', _('Invert'),
- _('Invert match result.'));
- so.default = so.disabled;
- so.modalonly = true;
-
- so = ss.option(form.ListValue, 'network', _('Network'));
- so.value('tcp', _('TCP'));
- so.value('udp', _('UDP'));
+ so = ss.option(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'),
_('Sniffed protocol, see Sniff for details.'));
@@ -455,6 +447,11 @@ return view.extend({
so.value('quic', _('QUIC'));
so.value('stun', _('STUN'));
+ so = ss.option(form.ListValue, 'network', _('Network'));
+ so.value('tcp', _('TCP'));
+ so.value('udp', _('UDP'));
+ so.value('', _('Both'));
+
so = ss.option(form.DynamicList, 'domain', _('Domain name'),
_('Match full domain.'));
so.datatype = 'hostname';
@@ -526,6 +523,11 @@ return view.extend({
_('Match user name.'));
so.modalonly = true;
+ so = ss.option(form.Flag, 'invert', _('Invert'),
+ _('Invert match result.'));
+ so.default = so.disabled;
+ so.modalonly = true;
+
so = ss.option(form.ListValue, 'outbound', _('Outbound'),
_('Tag of the target outbound.'));
so.load = function(section_id) {
diff --git a/root/etc/homeproxy/scripts/generate_client.uc b/root/etc/homeproxy/scripts/generate_client.uc
index f1a436f2..441e0f0c 100755
--- a/root/etc/homeproxy/scripts/generate_client.uc
+++ b/root/etc/homeproxy/scripts/generate_client.uc
@@ -573,10 +573,9 @@ if (!isEmpty(main_node)) {
return null;
push(config.route.rules, {
- invert: cfg.invert,
- ip_version: cfg.ip_version,
- network: cfg.network,
+ ip_version: strToInt(cfg.ip_version),
protocol: cfg.protocol,
+ network: cfg.network,
domain: cfg.domain,
domain_suffix: cfg.domain_suffix,
domain_keyword: cfg.domain_keyword,