🍉 Sync 2026-07-16 23:59:23

This commit is contained in:
github-actions[bot] committed 2026-07-16 23:59:23 +08:00
1 parent 6f9614389d
commit 7544914f93
8 files changed
+316 -58

No files matched your search

+2 -2
View File
@@ -6,9 +6,9 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=dae PKG_NAME:=dae
PKG_VERSION:=2026.07.08 PKG_VERSION:=2026.07.08
PKG_RELEASE:=16 PKG_RELEASE:=17
PKG_SOURCE:=dae-src-2026.07.08-6a60ae809f8b.tar.gz PKG_SOURCE:=dae-src-2026.07.08-1363b1a83f0b.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip PKG_HASH:=skip
+2 -2
View File
@@ -6,9 +6,9 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=daed PKG_NAME:=daed
PKG_VERSION:=2026.07.08 PKG_VERSION:=2026.07.08
PKG_RELEASE:=22 PKG_RELEASE:=23
PKG_SOURCE:=daed-src-2026.07.08-e83da9ff800e.tar.gz PKG_SOURCE:=daed-src-2026.07.08-68c0e0ce3077.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip PKG_HASH:=skip
+1 -1
View File
@@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus
LUCI_PKGARCH:=all LUCI_PKGARCH:=all
PKG_NAME:=luci-app-ssr-plus PKG_NAME:=luci-app-ssr-plus
PKG_VERSION:=196 PKG_VERSION:=196
PKG_RELEASE:=45 PKG_RELEASE:=46
PKG_CONFIG_DEPENDS:= \ PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \ CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
@@ -228,12 +228,24 @@ local current_sid = self.map:get(section, "global_server") or "nil"
filter: brightness(1.08); filter: brightness(1.08);
} }
@media (max-width: 700px) { /* 手机端优化 */
#ssr-clash-main-buttons {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
padding: 6px 0;
}
@media (max-width: 900px) {
#ssr-clash-modal { #ssr-clash-modal {
top: 8px;
left: 8px;
width: calc(100vw - 16px); width: calc(100vw - 16px);
max-height: calc(100vh - 24px); max-height: calc(100vh - 24px);
min-height: min(420px, calc(100vh - 24px)); min-height: min(420px, calc(100vh - 24px));
padding: 10px 12px 12px; padding: 10px 12px 12px;
transform: none;
} }
#ssr-clash-modal-header { #ssr-clash-modal-header {
@@ -249,21 +261,85 @@ local current_sid = self.map:get(section, "global_server") or "nil"
width: 100%; width: 100%;
justify-content: flex-start; justify-content: flex-start;
margin-left: 0; margin-left: 0;
flex-wrap: wrap;
gap: 8px;
} }
#ssr-clash-modal-header #ssr-clash-rules-add { #ssr-clash-modal-header #ssr-clash-rules-add {
margin-left: 0; margin-left: 0;
} }
#ssr-clash-modal-actions .btn,
#ssr-clash-main-buttons .btn {
flex: 1 1 0;
margin: 0 0;
}
} }
</style> </style>
<script type="text/javascript"> <script type="text/javascript">
if (!window.ssrXHR) {
window.ssrXHR = (function() {
function encode(data) {
var pairs = [];
var key;
for (key in (data || {})) {
if (Object.prototype.hasOwnProperty.call(data, key)) {
pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key] == null ? '' : data[key]));
}
}
return pairs.join('&');
}
function request(method, url, data, callback) {
var lower = method.toLowerCase();
if (window.XHR && typeof window.XHR[lower] === 'function') {
return window.XHR[lower](url, data, callback);
}
var xhr = new XMLHttpRequest();
var payload = encode(data);
var finalUrl = url;
if (lower === 'get' && payload) {
finalUrl += (url.indexOf('?') === -1 ? '?' : '&') + payload;
}
xhr.open(method, finalUrl, true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
if (lower !== 'get') {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
}
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
var rv = null;
try {
rv = JSON.parse(xhr.responseText || 'null');
} catch (e) {}
if (callback) callback(xhr, rv);
};
xhr.send(lower === 'get' ? null : payload);
}
return {
get: function(url, data, callback) {
return request('GET', url, data, callback);
},
post: function(url, data, callback) {
return request('POST', url, data, callback);
}
};
})();
}
if (typeof(window.ssrClashRefreshSubscription) !== "function") { if (typeof(window.ssrClashRefreshSubscription) !== "function") {
window.ssrClashRefreshSubscription = function(btn, sid) { window.ssrClashRefreshSubscription = function(btn, sid) {
var original = btn.value; var original = btn.value;
btn.disabled = true; btn.disabled = true;
btn.value = '<%:Reloading YAML...%>'; btn.value = '<%:Reloading YAML...%>';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_refresh")%>', { window.ssrXHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_refresh")%>', {
sid: sid sid: sid
}, function(x, result) { }, function(x, result) {
btn.disabled = false; btn.disabled = false;
@@ -288,7 +364,7 @@ local current_sid = self.map:get(section, "global_server") or "nil"
} }
btn.disabled = true; btn.disabled = true;
btn.value = '<%:Resetting Defaults...%>'; btn.value = '<%:Resetting Defaults...%>';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_reset_defaults")%>', { window.ssrXHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_reset_defaults")%>', {
sid: sid sid: sid
}, function(x, result) { }, function(x, result) {
btn.disabled = false; btn.disabled = false;
@@ -642,7 +718,7 @@ local current_sid = self.map:get(section, "global_server") or "nil"
select.onchange = function() { select.onchange = function() {
setPanelStatus('<%:Switching...%>', '#0072c3'); setPanelStatus('<%:Switching...%>', '#0072c3');
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_switch")%>', { window.ssrXHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_switch")%>', {
sid: currentPanelSid, sid: currentPanelSid,
group: group.name, group: group.name,
name: select.value name: select.value
@@ -699,7 +775,7 @@ local current_sid = self.map:get(section, "global_server") or "nil"
payload['rule_' + index + '_policy_group'] = rule.policy_group || ''; payload['rule_' + index + '_policy_group'] = rule.policy_group || '';
}); });
XHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_client_rule_save")%>', payload, function(x, result) { window.ssrXHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_client_rule_save")%>', payload, function(x, result) {
btn.disabled = false; btn.disabled = false;
btn.value = original; btn.value = original;
if (result && result.success) { if (result && result.success) {
@@ -733,7 +809,7 @@ local current_sid = self.map:get(section, "global_server") or "nil"
if (importBtn) importBtn.style.display = ''; if (importBtn) importBtn.style.display = '';
if (refreshBtn) refreshBtn.style.display = 'none'; if (refreshBtn) refreshBtn.style.display = 'none';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_client_policies")%>', { window.ssrXHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_client_policies")%>', {
sid: sid sid: sid
}, function(x, result) { }, function(x, result) {
if (!result || !result.active) { if (!result || !result.active) {
@@ -785,7 +861,7 @@ local current_sid = self.map:get(section, "global_server") or "nil"
if (exportBtn) exportBtn.style.display = 'none'; if (exportBtn) exportBtn.style.display = 'none';
if (importBtn) importBtn.style.display = 'none'; if (importBtn) importBtn.style.display = 'none';
if (refreshBtn) refreshBtn.style.display = ''; if (refreshBtn) refreshBtn.style.display = '';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_groups")%>', { window.ssrXHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_groups")%>', {
sid: sid sid: sid
}, function(x, result) { }, function(x, result) {
if (result && result.sid) { if (result && result.sid) {
@@ -842,6 +918,7 @@ local current_sid = self.map:get(section, "global_server") or "nil"
var customRulesBtn = document.getElementById('ssr-clash-main-client-rules'); var customRulesBtn = document.getElementById('ssr-clash-main-client-rules');
var resetBtn = document.getElementById('ssr-clash-main-reset-defaults'); var resetBtn = document.getElementById('ssr-clash-main-reset-defaults');
var panelBtn = document.getElementById('ssr-clash-main-open'); var panelBtn = document.getElementById('ssr-clash-main-open');
var btnContainer = document.getElementById('ssr-clash-main-buttons');
if (!select || !row || !customRulesBtn || !resetBtn || !panelBtn) { if (!select || !row || !customRulesBtn || !resetBtn || !panelBtn) {
return; return;
} }
@@ -852,11 +929,13 @@ local current_sid = self.map:get(section, "global_server") or "nil"
customRulesBtn.setAttribute('data-sid', sid); customRulesBtn.setAttribute('data-sid', sid);
resetBtn.setAttribute('data-sid', sid); resetBtn.setAttribute('data-sid', sid);
panelBtn.setAttribute('data-sid', sid); panelBtn.setAttribute('data-sid', sid);
if (btnContainer) btnContainer.style.display = 'flex';
} else { } else {
row.style.display = 'none'; row.style.display = 'none';
customRulesBtn.setAttribute('data-sid', ''); customRulesBtn.setAttribute('data-sid', '');
resetBtn.setAttribute('data-sid', ''); resetBtn.setAttribute('data-sid', '');
panelBtn.setAttribute('data-sid', ''); panelBtn.setAttribute('data-sid', '');
if (btnContainer) btnContainer.style.display = 'none';
} }
} }
@@ -872,9 +951,11 @@ local current_sid = self.map:get(section, "global_server") or "nil"
var modalMask = document.getElementById('ssr-clash-modal-mask'); var modalMask = document.getElementById('ssr-clash-modal-mask');
var wrap = document.getElementById('ssr-clash-main-panel-wrap'); var wrap = document.getElementById('ssr-clash-main-panel-wrap');
var row = wrap ? wrap.closest('.cbi-value') : null; var row = wrap ? wrap.closest('.cbi-value') : null;
var btnContainer = document.getElementById('ssr-clash-main-buttons');
if (row && !clashNodes['<%=current_sid%>']) { if (row && !clashNodes['<%=current_sid%>']) {
row.style.display = 'none'; row.style.display = 'none';
if (btnContainer) btnContainer.style.display = 'none';
} }
if (select) { if (select) {
@@ -955,7 +1036,7 @@ local current_sid = self.map:get(section, "global_server") or "nil"
return false; return false;
} }
modalRulesClearBtn.disabled = true; modalRulesClearBtn.disabled = true;
XHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_client_rule_clear")%>', { window.ssrXHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "clash_client_rule_clear")%>', {
sid: currentEditorSid sid: currentEditorSid
}, function(x, result) { }, function(x, result) {
modalRulesClearBtn.disabled = false; modalRulesClearBtn.disabled = false;
@@ -984,27 +1065,29 @@ local current_sid = self.map:get(section, "global_server") or "nil"
})(); })();
</script> </script>
<input <div id="ssr-clash-main-buttons">
type="button" <input
id="ssr-clash-main-client-rules" type="button"
class="btn cbi-button" id="ssr-clash-main-client-rules"
value="<%:Custom Client Proxies Rules%>" class="btn cbi-button"
title="<%:Custom Client Proxies Rules%>" value="<%:Custom Client Proxies Rules%>"
data-sid="<%=current_sid%>" /> title="<%:Custom Client Proxies Rules%>"
<input data-sid="<%=current_sid%>" />
type="button" <input
id="ssr-clash-main-reset-defaults" type="button"
class="btn cbi-button" id="ssr-clash-main-reset-defaults"
value="<%:Reset Default Proxies Rules%>" class="btn cbi-button"
title="<%:Reset Default Proxies Rules%>" value="<%:Reset Default Proxies Rules%>"
data-sid="<%=current_sid%>" /> title="<%:Reset Default Proxies Rules%>"
<input data-sid="<%=current_sid%>" />
type="button" <input
id="ssr-clash-main-open" type="button"
class="btn cbi-button cbi-button-apply" id="ssr-clash-main-open"
value="<%:Mihomo Pannel%>" class="btn cbi-button cbi-button-apply"
title="<%:Mihomo Pannel%>" value="<%:Mihomo Pannel%>"
data-sid="<%=current_sid%>" /> title="<%:Mihomo Pannel%>"
data-sid="<%=current_sid%>" />
</div>
<div id="ssr-clash-modal-mask"></div> <div id="ssr-clash-modal-mask"></div>
<div id="ssr-clash-modal" role="dialog" aria-modal="true" aria-labelledby="ssr-clash-modal-title"> <div id="ssr-clash-modal" role="dialog" aria-modal="true" aria-labelledby="ssr-clash-modal-title">
@@ -59,6 +59,62 @@ end
<script type="text/javascript"> <script type="text/javascript">
//<![CDATA[ //<![CDATA[
if (!window.ssrXHR) {
window.ssrXHR = (function() {
function encode(data) {
var pairs = [];
var key;
for (key in (data || {})) {
if (Object.prototype.hasOwnProperty.call(data, key)) {
pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key] == null ? '' : data[key]));
}
}
return pairs.join('&');
}
function request(method, url, data, callback) {
var lower = method.toLowerCase();
if (window.XHR && typeof window.XHR[lower] === "function") {
return window.XHR[lower](url, data, callback);
}
var xhr = new XMLHttpRequest();
var payload = encode(data);
var finalUrl = url;
if (lower === "get" && payload) {
finalUrl += (url.indexOf('?') === -1 ? '?' : '&') + payload;
}
xhr.open(method, finalUrl, true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
if (lower !== "get") {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
}
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
var rv = null;
try {
rv = JSON.parse(xhr.responseText || 'null');
} catch (e) {}
if (callback) callback(xhr, rv);
};
xhr.send(lower === "get" ? null : payload);
}
return {
get: function(url, data, callback) {
return request('GET', url, data, callback);
},
post: function(url, data, callback) {
return request('POST', url, data, callback);
}
};
})();
}
window.addEventListener('load', function () { window.addEventListener('load', function () {
const doms = document.getElementsByClassName('pingtime'); const doms = document.getElementsByClassName('pingtime');
const ports = document.getElementsByClassName("socket-connected"); const ports = document.getElementsByClassName("socket-connected");
@@ -165,7 +221,7 @@ end
return; return;
} }
port.innerHTML = '<font style=\"color:#0072c3\">connect</font>'; port.innerHTML = '<font style=\"color:#0072c3\">connect</font>';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "ping")%>', { window.ssrXHR.get('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "ping")%>', {
index, index,
sid: dom.getAttribute("data-sid"), sid: dom.getAttribute("data-sid"),
domain: dom.getAttribute("hint"), domain: dom.getAttribute("hint"),
@@ -280,7 +336,7 @@ end
var server_page = pageElem ? pageElem.value : '<%=self.server_page or 1%>'; var server_page = pageElem ? pageElem.value : '<%=self.server_page or 1%>';
var server_page_size = pageSizeElem ? pageSizeElem.value : '<%=self.server_page_size or 0%>'; var server_page_size = pageSizeElem ? pageSizeElem.value : '<%=self.server_page_size or 0%>';
if (input) input.value = order; if (input) input.value = order;
XHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "save_order")%>', { window.ssrXHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "save_order")%>', {
order: order, order: order,
page: server_page, page: server_page,
page_size: server_page_size page_size: server_page_size
@@ -197,6 +197,77 @@ end
<!-- tblsection --> <!-- tblsection -->
<div class="cbi-section cbi-tblsection" id="cbi-<%=self.config%>-<%=self.sectiontype%>"> <div class="cbi-section cbi-tblsection" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
<script type="text/javascript">
if (!window.ssrXHR) {
window.ssrXHR = (function() {
function encode(data) {
var pairs = [];
var key;
for (key in (data || {})) {
if (Object.prototype.hasOwnProperty.call(data, key)) {
pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key] == null ? '' : data[key]));
}
}
return pairs.join('&');
}
function request(method, url, data, callback) {
var lower = method.toLowerCase();
if (window.XHR && typeof window.XHR[lower] === "function") {
return window.XHR[lower](url, data, callback);
}
var xhr = new XMLHttpRequest();
var payload = encode(data);
var finalUrl = url;
if (lower === "get" && payload) {
finalUrl += (url.indexOf('?') === -1 ? '?' : '&') + payload;
}
xhr.open(method, finalUrl, true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
if (lower !== "get") {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
}
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
var rv = null;
try {
rv = JSON.parse(xhr.responseText || 'null');
} catch (e) {}
if (callback) callback(xhr, rv);
};
xhr.send(lower === "get" ? null : payload);
}
return {
get: function(url, data, callback) {
return request('GET', url, data, callback);
},
post: function(url, data, callback) {
return request('POST', url, data, callback);
}
};
})();
}
if (typeof window.ssrDeleteNode !== "function") {
window.ssrDeleteNode = function(sid) {
window.ssrXHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "delete_node")%>', {
sid: sid
}, function(x, result) {
result = result || {};
if (result.ret == 1) {
window.location.reload();
}
});
return false;
};
}
</script>
<% if self.title and #self.title > 0 then -%> <% if self.title and #self.title > 0 then -%>
<h3><%=self.title%></h3> <h3><%=self.title%></h3>
<%- end %> <%- end %>
@@ -244,22 +315,10 @@ end
%> onclick="location.href='<%=self:extedit(section)%>'" %> onclick="location.href='<%=self:extedit(section)%>'"
<%- end <%- end
%> alt="<%:Edit%>" title="<%:Edit%>" /> %> alt="<%:Edit%>" title="<%:Edit%>" />
<% end; if self.addremove then %> <% end; if self.addremove then %>
<input class="btn cbi-button cbi-button-remove" type="button" value="<%:Delete%>" <input class="btn cbi-button cbi-button-remove" type="button" value="<%:Delete%>"
onclick=" onclick="return window.ssrDeleteNode('<%=k%>')"
var sid = '<%=k%>'; />
XHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "delete_node")%>', {
sid: sid
}, function(x, result) {
result = result || {};
if (result.ret == 1) {
window.location.reload();
return;
}
});
return false;
"
/>
<%- end -%> <%- end -%>
</div> </div>
</td> </td>
@@ -20,6 +20,36 @@ local function width(o)
end end
-%> -%>
<script type="text/javascript">//<![CDATA[ <script type="text/javascript">//<![CDATA[
function ssrPost(url, data, callback) {
if (window.XHR && typeof window.XHR.post === 'function') {
return window.XHR.post(url, data, callback);
}
var xhr = new XMLHttpRequest();
var payload = [];
var key;
for (key in (data || {})) {
if (Object.prototype.hasOwnProperty.call(data, key)) {
payload.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key] == null ? '' : data[key]));
}
}
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
var rv = null;
try {
rv = JSON.parse(xhr.responseText || 'null');
} catch (e) {}
if (callback) callback(xhr, rv);
};
xhr.send(payload.join('&'));
}
window.ssrUpdateSubscribeItem = window.ssrUpdateSubscribeItem || function(btn) { window.ssrUpdateSubscribeItem = window.ssrUpdateSubscribeItem || function(btn) {
if (!btn) return false; if (!btn) return false;
@@ -72,9 +102,9 @@ end
for (var field in fields) { for (var field in fields) {
var value = fields[field]; var value = fields[field];
var promise = new Promise(function(resolve, reject) { var promise = new Promise(function(resolve, reject) {
XHR.post( ssrPost(
'<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "toggle_subscribe_item_enabled")%>', '<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "toggle_subscribe_item_enabled")%>',
{ sid: sid, field: field, value: value }, { sid: sid, field: field, value: value },
function(x, rv) { function(x, rv) {
if (rv && Number(rv.ret) === 1) { if (rv && Number(rv.ret) === 1) {
resolve(); resolve();
@@ -112,7 +142,7 @@ end
if (!confirm('<%:Are you sure you want to delete subscribe link: %s ?%>'.replace('%s', sid))) return; if (!confirm('<%:Are you sure you want to delete subscribe link: %s ?%>'.replace('%s', sid))) return;
btn.disabled = true; btn.disabled = true;
XHR.post('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "delete_subscribe_item")%>', ssrPost('<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "delete_subscribe_item")%>',
{ sid: sid }, { sid: sid },
function(x, rv) { function(x, rv) {
btn.disabled = false; btn.disabled = false;
@@ -218,7 +248,7 @@ end
btn.disabled = true; btn.disabled = true;
btn.value = '<%:Adding...%>'; btn.value = '<%:Adding...%>';
XHR.post( ssrPost(
'<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "add_subscribe_item")%>', '<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "add_subscribe_item")%>',
{}, {},
function(x, rv) { function(x, rv) {
@@ -1,5 +1,35 @@
<script type="text/javascript">//<![CDATA[ <script type="text/javascript">//<![CDATA[
(function() { (function() {
function ssrPost(url, data, callback) {
if (window.XHR && typeof window.XHR.post === 'function') {
return window.XHR.post(url, data, callback);
}
var xhr = new XMLHttpRequest();
var payload = [];
var key;
for (key in (data || {})) {
if (Object.prototype.hasOwnProperty.call(data, key)) {
payload.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key] == null ? '' : data[key]));
}
}
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.onreadystatechange = function() {
if (xhr.readyState !== 4) return;
var rv = null;
try {
rv = JSON.parse(xhr.responseText || 'null');
} catch (e) {}
if (callback) callback(xhr, rv);
};
xhr.send(payload.join('&'));
}
function bindSubscribeItemEnabledAutoSave() { function bindSubscribeItemEnabledAutoSave() {
var root = document.getElementById('cbi-shadowsocksr-server_subscribe_item'); var root = document.getElementById('cbi-shadowsocksr-server_subscribe_item');
if (!root || root.getAttribute('data-enabled-autosave-bound') === '1') { if (!root || root.getAttribute('data-enabled-autosave-bound') === '1') {
@@ -21,7 +51,7 @@
var original = target.checked; var original = target.checked;
target.disabled = true; target.disabled = true;
XHR.post( ssrPost(
'<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "toggle_subscribe_item_enabled")%>', '<%=luci.dispatcher.build_url("admin", "services", "shadowsocksr", "toggle_subscribe_item_enabled")%>',
{ sid: sid, enabled: original ? '1' : '0' }, { sid: sid, enabled: original ? '1' : '0' },
function(x, rv) { function(x, rv) {